Merge lp:~cjwatson/launchpad/git-pending-merges-preload-messages into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 18773
Proposed branch: lp:~cjwatson/launchpad/git-pending-merges-preload-messages
Merge into: lp:launchpad
Diff against target: 98 lines (+26/-7)
2 files modified
lib/lp/code/browser/tests/test_gitrepository.py (+15/-2)
lib/lp/code/model/branchmergeproposal.py (+11/-5)
To merge this branch: bzr merge lp:~cjwatson/launchpad/git-pending-merges-preload-messages
Reviewer Review Type Date Requested Status
Tom Wardill (community) Approve
Launchpad code reviewers Pending
Review via email: mp+354622@code.launchpad.net

Commit message

Preload review comments on merge proposals when preloading votes.

Description of the change

There's still a small number of TeamParticipation queries (up to three) per distinct reviewer; but as far as I can see there's no precedent for preloading these, and it would require some new helpers to do the right thing. IMO this isn't urgent, because the set of all active merge proposals targeted at a given repository will usually have only a small number of distinct reviewers.

To post a comment you must log in.
Revision history for this message
Tom Wardill (twom) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/code/browser/tests/test_gitrepository.py'
--- lib/lp/code/browser/tests/test_gitrepository.py 2018-09-06 16:00:45 +0000
+++ lib/lp/code/browser/tests/test_gitrepository.py 2018-09-10 15:49:30 +0000
@@ -13,7 +13,10 @@
1313
14from fixtures import FakeLogger14from fixtures import FakeLogger
15import pytz15import pytz
16from testtools.matchers import DocTestMatches16from testtools.matchers import (
17 DocTestMatches,
18 Equals,
19 )
17import transaction20import transaction
18from zope.component import getUtility21from zope.component import getUtility
19from zope.formlib.itemswidgets import ItemDisplayWidget22from zope.formlib.itemswidgets import ItemDisplayWidget
@@ -26,6 +29,7 @@
26from lp.app.interfaces.services import IService29from lp.app.interfaces.services import IService
27from lp.code.enums import (30from lp.code.enums import (
28 BranchMergeProposalStatus,31 BranchMergeProposalStatus,
32 CodeReviewVote,
29 GitRepositoryType,33 GitRepositoryType,
30 )34 )
31from lp.code.interfaces.revision import IRevisionSet35from lp.code.interfaces.revision import IRevisionSet
@@ -296,6 +300,8 @@
296 target_ref=git_refs[0],300 target_ref=git_refs[0],
297 set_state=BranchMergeProposalStatus.NEEDS_REVIEW)301 set_state=BranchMergeProposalStatus.NEEDS_REVIEW)
298 self.factory.makePreviewDiff(merge_proposal=bmp)302 self.factory.makePreviewDiff(merge_proposal=bmp)
303 self.factory.makeCodeReviewComment(
304 vote=CodeReviewVote.APPROVE, merge_proposal=bmp)
299305
300 recorder1, recorder2 = record_two_runs(306 recorder1, recorder2 = record_two_runs(
301 login_and_view,307 login_and_view,
@@ -339,6 +345,8 @@
339 source_ref=source_git_ref,345 source_ref=source_git_ref,
340 set_state=BranchMergeProposalStatus.NEEDS_REVIEW)346 set_state=BranchMergeProposalStatus.NEEDS_REVIEW)
341 self.factory.makePreviewDiff(merge_proposal=bmp)347 self.factory.makePreviewDiff(merge_proposal=bmp)
348 self.factory.makeCodeReviewComment(
349 vote=CodeReviewVote.APPROVE, merge_proposal=bmp)
342350
343 def login_and_view():351 def login_and_view():
344 with FeatureFixture({"code.git.show_repository_mps": "on"}):352 with FeatureFixture({"code.git.show_repository_mps": "on"}):
@@ -352,7 +360,12 @@
352 login_and_view,360 login_and_view,
353 create_merge_proposal,361 create_merge_proposal,
354 2)362 2)
355 self.assertThat(recorder2, HasQueryCount.byEquality(recorder1))363 # XXX cjwatson 2018-09-10: There is currently one extra
364 # TeamParticipation query per reviewer (at least in this test setup)
365 # due to GitRepository.isPersonTrustedReviewer. Fixing this
366 # probably requires a suitable helper to update Person._inTeam_cache
367 # in bulk.
368 self.assertThat(recorder2, HasQueryCount(Equals(recorder1.count + 2)))
356369
357 def test_view_with_inactive_landing_targets(self):370 def test_view_with_inactive_landing_targets(self):
358 product = self.factory.makeProduct(name="foo", vcs=VCSType.GIT)371 product = self.factory.makeProduct(name="foo", vcs=VCSType.GIT)
359372
=== modified file 'lib/lp/code/model/branchmergeproposal.py'
--- lib/lp/code/model/branchmergeproposal.py 2018-09-06 16:00:45 +0000
+++ lib/lp/code/model/branchmergeproposal.py 2018-09-10 15:49:30 +0000
@@ -124,6 +124,10 @@
124from lp.services.job.model.job import Job124from lp.services.job.model.job import Job
125from lp.services.librarian.model import LibraryFileAlias125from lp.services.librarian.model import LibraryFileAlias
126from lp.services.mail.sendmail import validate_message126from lp.services.mail.sendmail import validate_message
127from lp.services.messages.model.message import (
128 Message,
129 MessageChunk,
130 )
127from lp.services.propertycache import (131from lp.services.propertycache import (
128 cachedproperty,132 cachedproperty,
129 get_property_cache,133 get_property_cache,
@@ -1018,8 +1022,6 @@
1018 if not subject.startswith('Re: '):1022 if not subject.startswith('Re: '):
1019 subject = 'Re: ' + subject1023 subject = 'Re: ' + subject
10201024
1021 # Avoid circular dependencies.
1022 from lp.services.messages.model.message import Message, MessageChunk
1023 msgid = make_msgid('codereview')1025 msgid = make_msgid('codereview')
1024 message = Message(1026 message = Message(
1025 parent=parent_message, owner=owner, rfc822msgid=msgid,1027 parent=parent_message, owner=owner, rfc822msgid=msgid,
@@ -1373,11 +1375,15 @@
1373 # if we need to include a vote summary, we should precache1375 # if we need to include a vote summary, we should precache
1374 # that data too1376 # that data too
1375 if include_votes:1377 if include_votes:
1376 vote_list = list(load_referencing(1378 votes = load_referencing(
1377 CodeReviewVoteReference, branch_merge_proposals,1379 CodeReviewVoteReference, branch_merge_proposals,
1378 ['branch_merge_proposalID']))1380 ['branch_merge_proposalID'])
1379 for mp in branch_merge_proposals:1381 for mp in branch_merge_proposals:
1380 get_property_cache(mp).votes = vote_list1382 get_property_cache(mp).votes = votes
1383 comments = load_related(CodeReviewComment, votes, ['commentID'])
1384 load_related(Message, comments, ['messageID'])
1385 list(getUtility(IPersonSet).getPrecachedPersonsFromIDs(
1386 [vote.reviewerID for vote in votes], need_validity=True))
13811387
1382 # we also provide a summary of diffs, so load them1388 # we also provide a summary of diffs, so load them
1383 load_related(LibraryFileAlias, diffs, ['diff_textID'])1389 load_related(LibraryFileAlias, diffs, ['diff_textID'])