Merge lp:~cjwatson/launchpad/packageset-is-source-included into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 19048
Proposed branch: lp:~cjwatson/launchpad/packageset-is-source-included
Merge into: lp:launchpad
Diff against target: 114 lines (+52/-6)
3 files modified
lib/lp/soyuz/interfaces/packageset.py (+10/-0)
lib/lp/soyuz/model/packageset.py (+17/-5)
lib/lp/soyuz/tests/test_packageset.py (+25/-1)
To merge this branch: bzr merge lp:~cjwatson/launchpad/packageset-is-source-included
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+372259@code.launchpad.net

Commit message

Add IPackageset.isSourceIncluded.

Description of the change

This makes it more efficient to query whether a single packageset includes a single source package name, which will shortly be useful for evaluating distro arch series filters.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
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/soyuz/interfaces/packageset.py'
2--- lib/lp/soyuz/interfaces/packageset.py 2014-07-04 12:42:08 +0000
3+++ lib/lp/soyuz/interfaces/packageset.py 2019-09-04 13:51:53 +0000
4@@ -182,6 +182,16 @@
5 names.
6 """
7
8+ def isSourceIncluded(sourcepackagename, direct_inclusion=False):
9+ """Is this source package name included in this package set?
10+
11+ :param sourcepackagename: an `ISourcePackageName`.
12+ :param direct_inclusion: if this flag is set to True only sources
13+ directly included by this package set will be considered.
14+ :return: True if the source is included in this package set,
15+ otherwise False.
16+ """
17+
18 @operation_parameters(
19 other_package_set=Reference(
20 Interface,
21
22=== modified file 'lib/lp/soyuz/model/packageset.py'
23--- lib/lp/soyuz/model/packageset.py 2018-12-10 13:54:34 +0000
24+++ lib/lp/soyuz/model/packageset.py 2019-09-04 13:51:53 +0000
25@@ -1,4 +1,4 @@
26-# Copyright 2009-2018 Canonical Ltd. This software is licensed under the
27+# Copyright 2009-2019 Canonical Ltd. This software is licensed under the
28 # GNU Affero General Public License version 3 (see the file LICENSE).
29
30 __metaclass__ = type
31@@ -142,8 +142,7 @@
32 ''' % ','.join(str(packageset.id) for packageset in packagesets)
33 store.execute(rdsq, (self.id,), noresult=True)
34
35- def sourcesIncluded(self, direct_inclusion=False):
36- """See `IPackageset`."""
37+ def _sourcesIncludedClause(self, direct_inclusion=False):
38 if direct_inclusion == False:
39 source_name_query = '''
40 SELECT pss.sourcepackagename
41@@ -155,10 +154,14 @@
42 SELECT pss.sourcepackagename FROM packagesetsources pss
43 WHERE pss.packageset = ?
44 '''
45+ return SourcePackageName.id.is_in(SQL(source_name_query, (self.id,)))
46+
47+ def sourcesIncluded(self, direct_inclusion=False):
48+ """See `IPackageset`."""
49 store = IStore(Packageset)
50- source_names = SQL(source_name_query, (self.id,))
51 result_set = store.find(
52- SourcePackageName, SourcePackageName.id.is_in(source_names))
53+ SourcePackageName,
54+ self._sourcesIncludedClause(direct_inclusion=direct_inclusion))
55 return _order_result_set(result_set)
56
57 def getSourcesIncluded(self, direct_inclusion=False):
58@@ -166,6 +169,15 @@
59 result_set = self.sourcesIncluded(direct_inclusion)
60 return list(result_set.values(SourcePackageName.name))
61
62+ def isSourceIncluded(self, sourcepackagename, direct_inclusion=False):
63+ """See `IPackageset`."""
64+ store = IStore(Packageset)
65+ result_set = store.find(
66+ SourcePackageName,
67+ SourcePackageName.id == sourcepackagename.id,
68+ self._sourcesIncludedClause(direct_inclusion=direct_inclusion))
69+ return not result_set.is_empty()
70+
71 def setsIncludedBy(self, direct_inclusion=False):
72 """See `IPackageset`."""
73 if direct_inclusion == False:
74
75=== modified file 'lib/lp/soyuz/tests/test_packageset.py'
76--- lib/lp/soyuz/tests/test_packageset.py 2018-02-09 14:56:43 +0000
77+++ lib/lp/soyuz/tests/test_packageset.py 2019-09-04 13:51:53 +0000
78@@ -1,4 +1,4 @@
79-# Copyright 2009-2018 Canonical Ltd. This software is licensed under the
80+# Copyright 2009-2019 Canonical Ltd. This software is licensed under the
81 # GNU Affero General Public License version 3 (see the file LICENSE).
82
83 """Test Packageset features."""
84@@ -453,6 +453,30 @@
85 sorted(packageset1.sourcesIncluded()),
86 sorted(packages1 + packages2))
87
88+ def test_is_source_included(self):
89+ # Test if a source package name is included in a set
90+ packageset, packages = self.buildSet()
91+ for spn in packages:
92+ self.assertTrue(packageset.isSourceIncluded(spn))
93+ self.assertFalse(
94+ packageset.isSourceIncluded(self.factory.makeSourcePackageName()))
95+
96+ def test_is_source_included_indirect(self):
97+ # isSourceIncluded traverses the set tree, by default
98+ packageset1, packages1 = self.buildSet()
99+ packageset2, packages2 = self.buildSet()
100+ packageset1.add((packageset2,))
101+ for spn in packages1 + packages2:
102+ self.assertTrue(packageset1.isSourceIncluded(spn))
103+
104+ # direct_inclusion disables traversal
105+ for spn in packages1:
106+ self.assertTrue(
107+ packageset1.isSourceIncluded(spn, direct_inclusion=True))
108+ for spn in packages2:
109+ self.assertFalse(
110+ packageset1.isSourceIncluded(spn, direct_inclusion=True))
111+
112 def test_add_already_included_sources(self):
113 # Adding source packages to a package set repeatedly has no effect
114 packageset, packages = self.buildSet()