# HG changeset patch # User Mads Kiilerich # Date 2016-03-14 16:17:46 # 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 --git a/kallithea/controllers/pullrequests.py b/kallithea/controllers/pullrequests.py --- a/kallithea/controllers/pullrequests.py +++ b/kallithea/controllers/pullrequests.py @@ -182,8 +182,11 @@ class PullrequestsController(BaseRepoCon 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 --git a/kallithea/model/changeset_status.py b/kallithea/model/changeset_status.py --- a/kallithea/model/changeset_status.py +++ b/kallithea/model/changeset_status.py @@ -98,14 +98,14 @@ class ChangesetStatusModel(BaseModel): 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 --git a/kallithea/model/comment.py b/kallithea/model/comment.py --- a/kallithea/model/comment.py +++ b/kallithea/model/comment.py @@ -139,7 +139,7 @@ class ChangesetCommentsModel(BaseModel): 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 --git a/kallithea/model/db.py b/kallithea/model/db.py --- a/kallithea/model/db.py +++ b/kallithea/model/db.py @@ -2322,6 +2322,14 @@ class PullRequest(Base, BaseModel): 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