Merge lp:~brian-murray/launchpad/search-by-bug-subscriber into lp:launchpad

Proposed by Brian Murray
Status: Merged
Approved by: Deryck Hodge
Approved revision: no longer in the source branch.
Merged at revision: 13356
Proposed branch: lp:~brian-murray/launchpad/search-by-bug-subscriber
Merge into: lp:launchpad
Diff against target: 80 lines (+23/-48)
1 file modified
lib/lp/bugs/model/bugtask.py (+23/-48)
To merge this branch: bzr merge lp:~brian-murray/launchpad/search-by-bug-subscriber
Reviewer Review Type Date Requested Status
Deryck Hodge (community) code Approve
Review via email: mp+66597@code.launchpad.net

Commit message

[r=deryck][bug=787294] convert structural subscriber search parameter to use an IN query

Description of the change

Summary:

Using searchTasks with a structural subscriber parameter times out regularly as detailed in bug 787294 and its duplicate bug 785943. Robert Collins researched an improved SQL query (https://bugs.launchpad.net/launchpad/+bug/787294/comments/11) for this parameter and I've used it in lib/lp/bugs/model/bugtask.py.

Tests

bin/test -cvvt test_search_by_structural_subscriber

To post a comment you must log in.
Revision history for this message
Deryck Hodge (deryck) wrote :

Thanks for doing this work, Brian!

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/bugs/model/bugtask.py'
2--- lib/lp/bugs/model/bugtask.py 2011-05-28 04:09:11 +0000
3+++ lib/lp/bugs/model/bugtask.py 2011-07-01 13:11:20 +0000
4@@ -1844,55 +1844,30 @@
5 sqlvalues(personid=params.subscriber.id))
6
7 if params.structural_subscriber is not None:
8- ssub_match_product = (
9- BugTask.productID ==
10- StructuralSubscription.productID)
11- ssub_match_productseries = (
12- BugTask.productseriesID ==
13- StructuralSubscription.productseriesID)
14- # Prevent circular import problems.
15- from lp.registry.model.product import Product
16- ssub_match_project = And(
17- Product.projectID ==
18- StructuralSubscription.projectID,
19- BugTask.product == Product.id)
20- ssub_match_distribution = (
21- BugTask.distributionID ==
22- StructuralSubscription.distributionID)
23- ssub_match_sourcepackagename = (
24- BugTask.sourcepackagenameID ==
25- StructuralSubscription.sourcepackagenameID)
26- ssub_match_null_sourcepackagename = (
27- StructuralSubscription.sourcepackagename == None)
28- ssub_match_distribution_with_optional_package = And(
29- ssub_match_distribution, Or(
30- ssub_match_sourcepackagename,
31- ssub_match_null_sourcepackagename))
32- ssub_match_distribution_series = (
33- BugTask.distroseriesID ==
34- StructuralSubscription.distroseriesID)
35- ssub_match_milestone = (
36- BugTask.milestoneID ==
37- StructuralSubscription.milestoneID)
38-
39- join_clause = Or(
40- ssub_match_product,
41- ssub_match_productseries,
42- ssub_match_project,
43- ssub_match_distribution_with_optional_package,
44- ssub_match_distribution_series,
45- ssub_match_milestone)
46-
47- join_tables.append(
48- (Product, LeftJoin(Product, And(
49- BugTask.productID == Product.id,
50- Product.active))))
51- join_tables.append(
52- (StructuralSubscription,
53- Join(StructuralSubscription, join_clause)))
54- extra_clauses.append(
55- 'StructuralSubscription.subscriber = %s'
56+ with_clauses.append('''ss as (SELECT * from StructuralSubscription
57+ WHERE StructuralSubscription.subscriber = %s)'''
58 % sqlvalues(params.structural_subscriber))
59+
60+ extra_clauses.append(
61+ """BugTask.id IN (
62+ SELECT DISTINCT BugTask.id
63+ FROM BugTask
64+ LEFT JOIN Product ON (
65+ BugTask.product = Product.id AND Product.active)
66+ LEFT JOIN ss ss1 ON BugTask.product = ss1.product
67+ LEFT JOIN ss ss2 ON BugTask.productseries = ss2.productseries
68+ LEFT JOIN ss ss3 ON Product.project = ss3.project
69+ LEFT JOIN ss ss4 ON (
70+ BugTask.distribution = ss4.distribution AND (
71+ BugTask.sourcepackagename = ss4.sourcepackagename OR
72+ ss4.sourcepackagename IS NULL))
73+ LEFT JOIN ss ss5 ON BugTask.distroseries = ss5.distroseries
74+ LEFT JOIN ss ss6 ON BugTask.milestone = ss6.milestone
75+ WHERE
76+ NULL_COUNT(ARRAY[ss1.id, ss2.id, ss3.id,
77+ ss4.id, ss5.id, ss6.id]) < 6)
78+ """
79+ )
80 has_duplicate_results = True
81
82