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
=== modified file 'lib/lp/bugs/model/bugtask.py'
--- lib/lp/bugs/model/bugtask.py 2011-05-28 04:09:11 +0000
+++ lib/lp/bugs/model/bugtask.py 2011-07-01 13:11:20 +0000
@@ -1844,55 +1844,30 @@
1844 sqlvalues(personid=params.subscriber.id))1844 sqlvalues(personid=params.subscriber.id))
18451845
1846 if params.structural_subscriber is not None:1846 if params.structural_subscriber is not None:
1847 ssub_match_product = (1847 with_clauses.append('''ss as (SELECT * from StructuralSubscription
1848 BugTask.productID ==1848 WHERE StructuralSubscription.subscriber = %s)'''
1849 StructuralSubscription.productID)
1850 ssub_match_productseries = (
1851 BugTask.productseriesID ==
1852 StructuralSubscription.productseriesID)
1853 # Prevent circular import problems.
1854 from lp.registry.model.product import Product
1855 ssub_match_project = And(
1856 Product.projectID ==
1857 StructuralSubscription.projectID,
1858 BugTask.product == Product.id)
1859 ssub_match_distribution = (
1860 BugTask.distributionID ==
1861 StructuralSubscription.distributionID)
1862 ssub_match_sourcepackagename = (
1863 BugTask.sourcepackagenameID ==
1864 StructuralSubscription.sourcepackagenameID)
1865 ssub_match_null_sourcepackagename = (
1866 StructuralSubscription.sourcepackagename == None)
1867 ssub_match_distribution_with_optional_package = And(
1868 ssub_match_distribution, Or(
1869 ssub_match_sourcepackagename,
1870 ssub_match_null_sourcepackagename))
1871 ssub_match_distribution_series = (
1872 BugTask.distroseriesID ==
1873 StructuralSubscription.distroseriesID)
1874 ssub_match_milestone = (
1875 BugTask.milestoneID ==
1876 StructuralSubscription.milestoneID)
1877
1878 join_clause = Or(
1879 ssub_match_product,
1880 ssub_match_productseries,
1881 ssub_match_project,
1882 ssub_match_distribution_with_optional_package,
1883 ssub_match_distribution_series,
1884 ssub_match_milestone)
1885
1886 join_tables.append(
1887 (Product, LeftJoin(Product, And(
1888 BugTask.productID == Product.id,
1889 Product.active))))
1890 join_tables.append(
1891 (StructuralSubscription,
1892 Join(StructuralSubscription, join_clause)))
1893 extra_clauses.append(
1894 'StructuralSubscription.subscriber = %s'
1895 % sqlvalues(params.structural_subscriber))1849 % sqlvalues(params.structural_subscriber))
1850
1851 extra_clauses.append(
1852 """BugTask.id IN (
1853 SELECT DISTINCT BugTask.id
1854 FROM BugTask
1855 LEFT JOIN Product ON (
1856 BugTask.product = Product.id AND Product.active)
1857 LEFT JOIN ss ss1 ON BugTask.product = ss1.product
1858 LEFT JOIN ss ss2 ON BugTask.productseries = ss2.productseries
1859 LEFT JOIN ss ss3 ON Product.project = ss3.project
1860 LEFT JOIN ss ss4 ON (
1861 BugTask.distribution = ss4.distribution AND (
1862 BugTask.sourcepackagename = ss4.sourcepackagename OR
1863 ss4.sourcepackagename IS NULL))
1864 LEFT JOIN ss ss5 ON BugTask.distroseries = ss5.distroseries
1865 LEFT JOIN ss ss6 ON BugTask.milestone = ss6.milestone
1866 WHERE
1867 NULL_COUNT(ARRAY[ss1.id, ss2.id, ss3.id,
1868 ss4.id, ss5.id, ss6.id]) < 6)
1869 """
1870 )
1896 has_duplicate_results = True1871 has_duplicate_results = True
18971872
18981873