← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~wgrant/launchpad/dasbp-cleanup into lp:launchpad

 

William Grant has proposed merging lp:~wgrant/launchpad/dasbp-cleanup into lp:launchpad.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~wgrant/launchpad/dasbp-cleanup/+merge/113946

This branch Stormifies and shortens the publication queries on DistroArchSeriesBinaryPackage. I also tweaked them to use BinaryPackagePublishingHistory.binarypackagename rather than BinaryPackageRelease.binarypackagename, allowing them to use indices to avoid materialising tens of thousands of rows, cutting them from 5-150ms apiece to 0.5ms.

I also applied the BPR->BPPH change to guessPublishedSourcePackageName. And cleaned up some other horribleness I found on the way. Ugh.
-- 
https://code.launchpad.net/~wgrant/launchpad/dasbp-cleanup/+merge/113946
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~wgrant/launchpad/dasbp-cleanup into lp:launchpad.
=== modified file 'lib/lp/registry/model/distribution.py'
--- lib/lp/registry/model/distribution.py	2012-07-05 08:52:03 +0000
+++ lib/lp/registry/model/distribution.py	2012-07-09 10:43:20 +0000
@@ -174,9 +174,9 @@
 from lp.soyuz.interfaces.archivepermission import IArchivePermissionSet
 from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuildSet
 from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
+from lp.soyuz.interfaces.publishing import active_publishing_status
 from lp.soyuz.model.archive import Archive
 from lp.soyuz.model.binarypackagename import BinaryPackageName
-from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease
 from lp.soyuz.model.distributionsourcepackagerelease import (
     DistributionSourcePackageRelease,
     )
@@ -1244,10 +1244,9 @@
                 SourcePackagePublishingHistory.sourcepackagename ==
                     sourcepackagename,
                 SourcePackagePublishingHistory.status.is_in(
-                    (PackagePublishingStatus.PUBLISHED,
-                     PackagePublishingStatus.PENDING)
-                    )).order_by(
-                        Desc(SourcePackagePublishingHistory.id)).first()
+                    active_publishing_status),
+                ).order_by(
+                    Desc(SourcePackagePublishingHistory.id)).first()
             if publishing is not None:
                 return sourcepackagename
 
@@ -1275,10 +1274,10 @@
                 # otherwise.)
                 BinaryPackagePublishingHistory.archiveID.is_in(
                     self.all_distro_archive_ids),
-                BinaryPackagePublishingHistory.binarypackagereleaseID ==
-                    BinaryPackageRelease.id,
-                BinaryPackageRelease.binarypackagename == binarypackagename,
-                BinaryPackagePublishingHistory.dateremoved == None,
+                BinaryPackagePublishingHistory.binarypackagename ==
+                    binarypackagename,
+                BinaryPackagePublishingHistory.status.is_in(
+                    active_publishing_status),
                 ).order_by(
                     Desc(BinaryPackagePublishingHistory.id)).first()
             if bpph is not None:
@@ -1319,13 +1318,11 @@
         orderBy = ['Archive.displayname']
 
         if not show_inactive:
-            active_statuses = (PackagePublishingStatus.PUBLISHED,
-                               PackagePublishingStatus.PENDING)
             clauses.append("""
             Archive.id IN (
                 SELECT archive FROM SourcepackagePublishingHistory
                 WHERE status IN %s)
-            """ % sqlvalues(active_statuses))
+            """ % sqlvalues(active_publishing_status))
 
         if text:
             orderBy.insert(

=== modified file 'lib/lp/registry/tests/test_distribution.py'
--- lib/lp/registry/tests/test_distribution.py	2012-06-14 05:18:22 +0000
+++ lib/lp/registry/tests/test_distribution.py	2012-07-09 10:43:20 +0000
@@ -44,9 +44,9 @@
     )
 from lp.registry.interfaces.series import SeriesStatus
 from lp.registry.tests.test_distroseries import CurrentSourceReleasesMixin
-from lp.services.database.constants import UTC_NOW
 from lp.services.propertycache import get_property_cache
 from lp.services.webapp import canonical_url
+from lp.soyuz.enums import PackagePublishingStatus
 from lp.soyuz.interfaces.distributionsourcepackagerelease import (
     IDistributionSourcePackageRelease,
     )
@@ -143,7 +143,8 @@
         distroseries = self.factory.makeDistroSeries()
         self.factory.makeBinaryPackagePublishingHistory(
             archive=distroseries.main_archive,
-            binarypackagename='binary-package', dateremoved=UTC_NOW)
+            binarypackagename='binary-package',
+            status=PackagePublishingStatus.SUPERSEDED)
         with ExpectedException(NotFoundError, ".*Binary package.*"):
             distroseries.distribution.guessPublishedSourcePackageName(
                 'binary-package')

=== modified file 'lib/lp/soyuz/model/distroarchseriesbinarypackage.py'
--- lib/lp/soyuz/model/distroarchseriesbinarypackage.py	2011-12-30 06:14:56 +0000
+++ lib/lp/soyuz/model/distroarchseriesbinarypackage.py	2012-07-09 10:43:20 +0000
@@ -107,28 +107,29 @@
             return self.cache.description
         return None
 
+    def _getPublicationJoins(self):
+        return [
+            BinaryPackagePublishingHistory.distroarchseries
+                == self.distroarchseries,
+            BinaryPackagePublishingHistory.archiveID.is_in(
+                self.distribution.all_distro_archive_ids),
+            BinaryPackagePublishingHistory.binarypackagename
+                == self.binarypackagename,
+            BinaryPackagePublishingHistory.binarypackagereleaseID
+                == BinaryPackageRelease.id,
+            ]
+
     def __getitem__(self, version):
         """See IDistroArchSeriesBinaryPackage."""
-        query = """
-        BinaryPackagePublishingHistory.distroarchseries = %s AND
-        BinaryPackagePublishingHistory.archive IN %s AND
-        BinaryPackagePublishingHistory.binarypackagerelease =
-            BinaryPackageRelease.id AND
-        BinaryPackageRelease.version = %s AND
-        BinaryPackageRelease.binarypackagename = %s
-        """ % sqlvalues(
-                self.distroarchseries,
-                self.distribution.all_distro_archive_ids,
-                version,
-                self.binarypackagename)
-
-        bpph = BinaryPackagePublishingHistory.selectFirst(
-            query, clauseTables=['binarypackagerelease'],
-            orderBy=["-datecreated"])
+        bpph = IStore(BinaryPackagePublishingHistory).find(
+            BinaryPackagePublishingHistory,
+            BinaryPackageRelease.version == version,
+            *self._getPublicationJoins()
+            ).order_by(Desc(BinaryPackagePublishingHistory.datecreated)
+            ).first()
 
         if bpph is None:
             return None
-
         return DistroArchSeriesBinaryPackageRelease(
             distroarchseries=self.distroarchseries,
             binarypackagerelease=bpph.binarypackagerelease)
@@ -136,19 +137,11 @@
     @property
     def releases(self):
         """See IDistroArchSeriesBinaryPackage."""
-        ret = BinaryPackageRelease.select("""
-            BinaryPackagePublishingHistory.distroarchseries = %s AND
-            BinaryPackagePublishingHistory.archive IN %s AND
-            BinaryPackagePublishingHistory.binarypackagerelease =
-                BinaryPackageRelease.id AND
-            BinaryPackageRelease.binarypackagename = %s
-            """ % sqlvalues(
-                    self.distroarchseries,
-                    self.distribution.all_distro_archive_ids,
-                    self.binarypackagename),
-            orderBy='-datecreated',
-            distinct=True,
-            clauseTables=['BinaryPackagePublishingHistory'])
+        ret = IStore(BinaryPackageRelease).find(
+            BinaryPackageRelease,
+            *self._getPublicationJoins()
+            ).order_by(Desc(BinaryPackageRelease.datecreated)
+            ).config(distinct=True)
         result = []
         versions = set()
         for bpr in ret:
@@ -163,62 +156,33 @@
     @property
     def currentrelease(self):
         """See IDistroArchSeriesBinaryPackage."""
-        releases = BinaryPackageRelease.select("""
-            BinaryPackageRelease.binarypackagename = %s AND
-            BinaryPackageRelease.id =
-                BinaryPackagePublishingHistory.binarypackagerelease AND
-            BinaryPackagePublishingHistory.distroarchseries = %s AND
-            BinaryPackagePublishingHistory.archive IN %s AND
-            BinaryPackagePublishingHistory.status = %s
-            """ % sqlvalues(
-                    self.binarypackagename,
-                    self.distroarchseries,
-                    self.distribution.all_distro_archive_ids,
-                    PackagePublishingStatus.PUBLISHED),
-            orderBy='-datecreated',
-            limit=1,
-            distinct=True,
-            clauseTables=['BinaryPackagePublishingHistory'])
-
-        # Listify to limit the SQL queries to one only.
-        results = list(releases)
-        if len(results) == 0:
+        try:
+            bpph = self.current_published
+        except NotFoundError:
             return None
         return DistroArchSeriesBinaryPackageRelease(
             distroarchseries=self.distroarchseries,
-            binarypackagerelease=results[0])
+            binarypackagerelease=bpph.binarypackagerelease)
 
     @property
     def publishing_history(self):
         """See IDistroArchSeriesBinaryPackage."""
         return IStore(BinaryPackagePublishingHistory).find(
             BinaryPackagePublishingHistory,
-            BinaryPackageRelease.binarypackagename == self.binarypackagename,
-            BinaryPackagePublishingHistory.distroarchseries ==
-                self.distroarchseries,
-            BinaryPackagePublishingHistory.archiveID.is_in(
-                self.distribution.all_distro_archive_ids),
-            BinaryPackagePublishingHistory.binarypackagereleaseID ==
-                BinaryPackageRelease.id).config(distinct=True).order_by(
-                Desc(BinaryPackagePublishingHistory.datecreated))
+            *self._getPublicationJoins()
+            ).config(distinct=True
+            ).order_by(Desc(BinaryPackagePublishingHistory.datecreated))
 
     @property
     def current_published(self):
         """See IDistroArchSeriesBinaryPackage."""
-        current = BinaryPackagePublishingHistory.selectFirst("""
-            BinaryPackagePublishingHistory.distroarchseries = %s AND
-            BinaryPackagePublishingHistory.archive IN %s AND
-            BinaryPackagePublishingHistory.binarypackagerelease =
-                BinaryPackageRelease.id AND
-            BinaryPackageRelease.binarypackagename = %s AND
-            BinaryPackagePublishingHistory.status = %s
-            """ % sqlvalues(
-                    self.distroarchseries,
-                    self.distribution.all_distro_archive_ids,
-                    self.binarypackagename,
-                    PackagePublishingStatus.PUBLISHED),
-            clauseTables=['BinaryPackageRelease'],
-            orderBy='-datecreated')
+        current = IStore(BinaryPackagePublishingHistory).find(
+            BinaryPackagePublishingHistory,
+            BinaryPackagePublishingHistory.status
+                == PackagePublishingStatus.PUBLISHED,
+            *self._getPublicationJoins()
+            ).order_by(Desc(BinaryPackagePublishingHistory.datecreated)
+            ).first()
 
         if current is None:
             raise NotFoundError("Binary package %s not published in %s/%s"

=== modified file 'lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py'
--- lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py	2011-12-30 06:14:56 +0000
+++ lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py	2012-07-09 10:43:20 +0000
@@ -15,10 +15,10 @@
 from zope.interface import implements
 
 from lp.services.database.sqlbase import sqlvalues
-from lp.soyuz.enums import PackagePublishingStatus
 from lp.soyuz.interfaces.distroarchseriesbinarypackagerelease import (
     IDistroArchSeriesBinaryPackageRelease,
     )
+from lp.soyuz.interfaces.publishing import active_publishing_status
 from lp.soyuz.model.distributionsourcepackagerelease import (
     DistributionSourcePackageRelease,
     )
@@ -84,11 +84,7 @@
     @property
     def current_publishing_record(self):
         """See `IDistroArchSeriesBinaryPackageRelease`."""
-        status = [
-            PackagePublishingStatus.PENDING,
-            PackagePublishingStatus.PUBLISHED]
-        record = self._latest_publishing_record(status=status)
-        return record
+        return self._latest_publishing_record(status=active_publishing_status)
 
 # XXX cprov 20071026: heavy queries should be moved near to the related
 # content classes in order to be better maintained. In this specific case


Follow ups