# HG changeset patch # User Mads Kiilerich # Date 1457968666 -3600 # Node ID 20a094053606dab166d93344da2616cab44c1bac # Parent d36dc6617d877a563a8173ac947fe763690ae60a pullrequests: optimize iteration over reviewers - avoid fetching users one by one .reviewers was mainly used for iteration and then dereferencing .user one by one. That gave lots of queries and round trips to the database and was slow. Instead, do something else. Either query directly or use a new method for getting the list of reviewer users. Reviewers will explicitly be shown in the order they have been added (assuming database id's are monotonic). diff -r d36dc6617d87 -r 20a094053606 kallithea/controllers/pullrequests.py --- a/kallithea/controllers/pullrequests.py Mon Mar 14 16:17:46 2016 +0100 +++ b/kallithea/controllers/pullrequests.py Mon Mar 14 16:17:46 2016 +0100 @@ -182,8 +182,11 @@ return False owner = self.authuser.user_id == pull_request.user_id - reviewer = self.authuser.user_id in [x.user_id for x in - pull_request.reviewers] + reviewer = PullRequestReviewers.query() \ + .filter(PullRequestReviewers.pull_request == pull_request) \ + .filter(PullRequestReviewers.user_id == self.authuser.user_id) \ + .count() != 0 + return self.authuser.admin or owner or reviewer @LoginRequired() diff -r d36dc6617d87 -r 20a094053606 kallithea/model/changeset_status.py --- a/kallithea/model/changeset_status.py Mon Mar 14 16:17:46 2016 +0100 +++ b/kallithea/model/changeset_status.py Mon Mar 14 16:17:46 2016 +0100 @@ -98,14 +98,14 @@ pull_request_reviewers = [] pull_request_pending_reviewers = [] relevant_statuses = [] - for r in pull_request.reviewers: - st = cs_statuses.get(r.user.username) + for user in pull_request.get_reviewer_users(): + st = cs_statuses.get(user.username) relevant_statuses.append(st) if not st or st.status in (ChangesetStatus.STATUS_NOT_REVIEWED, ChangesetStatus.STATUS_UNDER_REVIEW): st = None - pull_request_pending_reviewers.append(r.user) - pull_request_reviewers.append((r.user, st)) + pull_request_pending_reviewers.append(user) + pull_request_reviewers.append((user, st)) result = self._calculate_status(relevant_statuses) diff -r d36dc6617d87 -r 20a094053606 kallithea/model/comment.py --- a/kallithea/model/comment.py Mon Mar 14 16:17:46 2016 +0100 +++ b/kallithea/model/comment.py Mon Mar 14 16:17:46 2016 +0100 @@ -139,7 +139,7 @@ recipients += [pull_request.owner] # add the reviewers to notification - recipients += [x.user for x in pull_request.reviewers] + recipients += pull_request.get_reviewer_users() #set some variables for email notification email_kwargs = { diff -r d36dc6617d87 -r 20a094053606 kallithea/model/db.py --- a/kallithea/model/db.py Mon Mar 14 16:17:46 2016 +0100 +++ b/kallithea/model/db.py Mon Mar 14 16:17:46 2016 +0100 @@ -2322,6 +2322,14 @@ comments = relationship('ChangesetComment', order_by='ChangesetComment.comment_id', cascade="all, delete-orphan") + def get_reviewer_users(self): + """Like .reviewers, but actually returning the users""" + return User.query() \ + .join(PullRequestReviewers) \ + .filter(PullRequestReviewers.pull_request == self) \ + .order_by(PullRequestReviewers.pull_requests_reviewers_id) \ + .all() + def is_closed(self): return self.status == self.STATUS_CLOSED