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
=== modified file 'lib/lp/soyuz/interfaces/packageset.py'
--- lib/lp/soyuz/interfaces/packageset.py 2014-07-04 12:42:08 +0000
+++ lib/lp/soyuz/interfaces/packageset.py 2019-09-04 13:51:53 +0000
@@ -182,6 +182,16 @@
182 names.182 names.
183 """183 """
184184
185 def isSourceIncluded(sourcepackagename, direct_inclusion=False):
186 """Is this source package name included in this package set?
187
188 :param sourcepackagename: an `ISourcePackageName`.
189 :param direct_inclusion: if this flag is set to True only sources
190 directly included by this package set will be considered.
191 :return: True if the source is included in this package set,
192 otherwise False.
193 """
194
185 @operation_parameters(195 @operation_parameters(
186 other_package_set=Reference(196 other_package_set=Reference(
187 Interface,197 Interface,
188198
=== modified file 'lib/lp/soyuz/model/packageset.py'
--- lib/lp/soyuz/model/packageset.py 2018-12-10 13:54:34 +0000
+++ lib/lp/soyuz/model/packageset.py 2019-09-04 13:51:53 +0000
@@ -1,4 +1,4 @@
1# Copyright 2009-2018 Canonical Ltd. This software is licensed under the1# Copyright 2009-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4__metaclass__ = type4__metaclass__ = type
@@ -142,8 +142,7 @@
142 ''' % ','.join(str(packageset.id) for packageset in packagesets)142 ''' % ','.join(str(packageset.id) for packageset in packagesets)
143 store.execute(rdsq, (self.id,), noresult=True)143 store.execute(rdsq, (self.id,), noresult=True)
144144
145 def sourcesIncluded(self, direct_inclusion=False):145 def _sourcesIncludedClause(self, direct_inclusion=False):
146 """See `IPackageset`."""
147 if direct_inclusion == False:146 if direct_inclusion == False:
148 source_name_query = '''147 source_name_query = '''
149 SELECT pss.sourcepackagename148 SELECT pss.sourcepackagename
@@ -155,10 +154,14 @@
155 SELECT pss.sourcepackagename FROM packagesetsources pss154 SELECT pss.sourcepackagename FROM packagesetsources pss
156 WHERE pss.packageset = ?155 WHERE pss.packageset = ?
157 '''156 '''
157 return SourcePackageName.id.is_in(SQL(source_name_query, (self.id,)))
158
159 def sourcesIncluded(self, direct_inclusion=False):
160 """See `IPackageset`."""
158 store = IStore(Packageset)161 store = IStore(Packageset)
159 source_names = SQL(source_name_query, (self.id,))
160 result_set = store.find(162 result_set = store.find(
161 SourcePackageName, SourcePackageName.id.is_in(source_names))163 SourcePackageName,
164 self._sourcesIncludedClause(direct_inclusion=direct_inclusion))
162 return _order_result_set(result_set)165 return _order_result_set(result_set)
163166
164 def getSourcesIncluded(self, direct_inclusion=False):167 def getSourcesIncluded(self, direct_inclusion=False):
@@ -166,6 +169,15 @@
166 result_set = self.sourcesIncluded(direct_inclusion)169 result_set = self.sourcesIncluded(direct_inclusion)
167 return list(result_set.values(SourcePackageName.name))170 return list(result_set.values(SourcePackageName.name))
168171
172 def isSourceIncluded(self, sourcepackagename, direct_inclusion=False):
173 """See `IPackageset`."""
174 store = IStore(Packageset)
175 result_set = store.find(
176 SourcePackageName,
177 SourcePackageName.id == sourcepackagename.id,
178 self._sourcesIncludedClause(direct_inclusion=direct_inclusion))
179 return not result_set.is_empty()
180
169 def setsIncludedBy(self, direct_inclusion=False):181 def setsIncludedBy(self, direct_inclusion=False):
170 """See `IPackageset`."""182 """See `IPackageset`."""
171 if direct_inclusion == False:183 if direct_inclusion == False:
172184
=== modified file 'lib/lp/soyuz/tests/test_packageset.py'
--- lib/lp/soyuz/tests/test_packageset.py 2018-02-09 14:56:43 +0000
+++ lib/lp/soyuz/tests/test_packageset.py 2019-09-04 13:51:53 +0000
@@ -1,4 +1,4 @@
1# Copyright 2009-2018 Canonical Ltd. This software is licensed under the1# Copyright 2009-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Test Packageset features."""4"""Test Packageset features."""
@@ -453,6 +453,30 @@
453 sorted(packageset1.sourcesIncluded()),453 sorted(packageset1.sourcesIncluded()),
454 sorted(packages1 + packages2))454 sorted(packages1 + packages2))
455455
456 def test_is_source_included(self):
457 # Test if a source package name is included in a set
458 packageset, packages = self.buildSet()
459 for spn in packages:
460 self.assertTrue(packageset.isSourceIncluded(spn))
461 self.assertFalse(
462 packageset.isSourceIncluded(self.factory.makeSourcePackageName()))
463
464 def test_is_source_included_indirect(self):
465 # isSourceIncluded traverses the set tree, by default
466 packageset1, packages1 = self.buildSet()
467 packageset2, packages2 = self.buildSet()
468 packageset1.add((packageset2,))
469 for spn in packages1 + packages2:
470 self.assertTrue(packageset1.isSourceIncluded(spn))
471
472 # direct_inclusion disables traversal
473 for spn in packages1:
474 self.assertTrue(
475 packageset1.isSourceIncluded(spn, direct_inclusion=True))
476 for spn in packages2:
477 self.assertFalse(
478 packageset1.isSourceIncluded(spn, direct_inclusion=True))
479
456 def test_add_already_included_sources(self):480 def test_add_already_included_sources(self):
457 # Adding source packages to a package set repeatedly has no effect481 # Adding source packages to a package set repeatedly has no effect
458 packageset, packages = self.buildSet()482 packageset, packages = self.buildSet()