]> git.ipfire.org Git - pbs.git/commitdiff
Optimize getting the latest build.
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 17 Feb 2013 13:24:57 +0000 (14:24 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 17 Feb 2013 13:24:57 +0000 (14:24 +0100)
backend/builds.py

index f15b0f0d98b261a39edfb71949b0069dcd10dee8..43a557d1034d585942ab1d284c5626c2993bee23 100644 (file)
@@ -141,30 +141,35 @@ class Builds(base.Object):
                return sorted([Build(self.pakfire, b.id) for b in self.db.query(query, *args)])
 
        def get_latest_by_name(self, name, type=None, public=None):
-               if type is None:
-                       types = ("release", "scratch")
-               else:
-                       types = (type,)
-
-               query = "SELECT builds.id AS id FROM builds \
-                       JOIN packages ON builds.pkg_id = packages.id \
-                       WHERE builds.type = %s AND packages.name = %s"
+               query = "\
+                       SELECT * FROM builds \
+                               LEFT JOIN builds_latest ON builds.id = builds_latest.build_id \
+                       WHERE builds_latest.package_name = %s"
                args = [name,]
 
+               if type:
+                       query += " AND builds_latest.build_type = %s"
+                       args.append(type)
+
                if public is True:
-                       query += " AND builds.public = 'Y'"
+                       query += " AND builds.public = %s"
+                       args.append("Y")
                elif public is False:
-                       query += " AND builds.public = 'N'"
+                       query += " AND builds.public = %s"
+                       args.append("N")
 
-               for type in types:
-                       res = self.db.query(query, type, *args)
-                       if not res:
-                               continue
+               # Get the last one only.
+               # Prefer release builds over scratch builds.
+               query += "\
+                       ORDER BY \
+                               CASE builds.type WHEN 'release' THEN 0 ELSE 1 END, \
+                               builds.time_created DESC \
+                       LIMIT 1"
 
-                       builds = [Build(self.pakfire, b.id) for b in res]
-                       builds.sort(reverse=True)
+               res = self.db.get(query, *args)
 
-                       return builds[0]
+               if res:
+                       return Build(self.pakfire, res.id, res)
 
        def get_active_builds(self, name, public=None):
                query = "\