]> git.lizzy.rs Git - cheatdb.git/commitdiff
WIP: Optimise packages query optimise_packages_query
authorrubenwardy <rw@rubenwardy.com>
Sat, 6 Jun 2020 17:37:21 +0000 (18:37 +0100)
committerrubenwardy <rw@rubenwardy.com>
Sat, 6 Jun 2020 17:37:21 +0000 (18:37 +0100)
app/blueprints/api/endpoints.py
app/models.py
app/querybuilder.py

index d5ef9d08ae6d3f78da46e4df47540b92db78d840..d9defb0c217dbc678047561a1a56ba8cafd8b626 100644 (file)
@@ -25,15 +25,27 @@ from app.models import *
 from app.utils import is_package_page
 from app.markdown import render_markdown
 from app.querybuilder import QueryBuilder
+from sqlalchemy.orm import joinedload
 
 @bp.route("/api/packages/")
 def packages():
        qb    = QueryBuilder(request.args)
-       query = qb.buildPackageQuery()
-       ver   = qb.getMinetestVersion()
+       query = qb.buildPackageQuery(db.session.query(Package, PackageRelease))
+
+       import sys
+       print(query, file=sys.stdout)
+
+       pkgs = [result[0].getAsDictionaryShort(current_app.config["BASE_URL"], release=result[1]) \
+                       for result in query.all()]
+
+
+       # qb    = QueryBuilder(request.args)
+       # query = qb.buildPackageQuery()
+       # ver   = qb.getMinetestVersion()
+
+       # pkgs = [result.getAsDictionaryShort(current_app.config["BASE_URL"], version=ver) \
+       #               for result in query.all()]
 
-       pkgs = [package.getAsDictionaryShort(current_app.config["BASE_URL"], version=ver) \
-                       for package in query.all()]
        return jsonify(pkgs)
 
 
index f3e65a266b9fa08321d51d6ac6ebec3092189c92..9a25488a9cc6d21f6798324e2a52b0f84b8ce55d 100644 (file)
@@ -534,9 +534,9 @@ class Package(db.Model):
                        "type": self.type.toName(),
                }
 
-       def getAsDictionaryShort(self, base_url, version=None):
+       def getAsDictionaryShort(self, base_url, version=None, release=None):
                tnurl = self.getThumbnailURL(1)
-               release = self.getDownloadRelease(version=version)
+               release = release if release else self.getDownloadRelease(version=version)
                return {
                        "name": self.name,
                        "title": self.title,
index 5b75b4c4f93f1b4a505f3e2c6c1bf659beabe0a1..74b680c2407204beb3695614ba0e5a584cfd6adf 100644 (file)
@@ -64,8 +64,11 @@ class QueryBuilder:
 
                return MinetestRelease.get(self.minetest_version, self.protocol_version)
 
-       def buildPackageQuery(self):
-               query = Package.query.filter_by(soft_deleted=False, approved=True)
+       def buildPackageQuery(self, query=None):
+               if not query:
+                       query = Package.query
+
+               query = query.filter(Package.soft_deleted==False, Package.approved==True)
 
                if len(self.types) > 0:
                        query = query.filter(Package.type.in_(self.types))
@@ -110,10 +113,15 @@ class QueryBuilder:
                if self.protocol_version or self.minetest_version:
                        version = self.getMinetestVersion()
                        if version:
-                               query = query.join(Package.releases) \
+                               subqry = db.session.query(PackageRelease.id).correlate(PackageRelease) \
+                                       .filter(PackageRelease.package_id==Package.id) \
                                        .filter(PackageRelease.approved==True) \
                                        .filter(or_(PackageRelease.min_rel_id==None, PackageRelease.min_rel_id<=version.id)) \
-                                       .filter(or_(PackageRelease.max_rel_id==None, PackageRelease.max_rel_id>=version.id))
+                                       .filter(or_(PackageRelease.max_rel_id==None, PackageRelease.max_rel_id>=version.id)) \
+                                       .order_by(db.desc(PackageRelease.id)) \
+                                       .limit(1).subquery()
+
+                               query = query.filter(PackageRelease.id==subqry)
 
                if self.limit:
                        query = query.limit(self.limit)