from . import base
from . import builds
from . import database
+from . import jobs
from . import packages
from . import repos
from . import users
return self.db.fetch(stmt)
- def get_by_package_uuids(self, uuids):
+ async def get_by_package_uuids(self, uuids):
"""
Returns a list of builds that contain the given packages
"""
- return self._get_builds("""
- SELECT
- DISTINCT builds.*
- FROM
- builds
- LEFT JOIN
- packages source_packages ON builds.pkg_id = source_packages.id
- LEFT JOIN
- jobs ON builds.id = jobs.build_id
- LEFT JOIN
- job_packages ON jobs.id = job_packages.job_id
- LEFT JOIN
- packages ON job_packages.pkg_id = packages.id
- WHERE
- builds.deleted_at IS NULL
- AND
- jobs.deleted_at IS NULL
- AND
- source_packages.deleted_at IS NULL
- AND
- packages.deleted_at IS NULL
- AND
- (
- packages.uuid = ANY(%s::uuid[])
- OR
- source_packages.uuid = ANY(%s::uuid[])
- )
- """, uuids, uuids,
+ source_packages = sqlalchemy.orm.aliased(packages.Package)
+ binary_packages = sqlalchemy.orm.aliased(packages.Package)
+
+ stmt = (
+ sqlalchemy
+ .select(
+ Build,
+ )
+ .distinct()
+ .join(
+ source_packages,
+ source_packages.id == Build.pkg_id,
+ )
+ .join(
+ jobs.Job,
+ jobs.Job.build_id == Build.id,
+ )
+ .join(
+ jobs.JobPackage,
+ jobs.JobPackage.job_id == jobs.Job.id,
+ )
+ .join(
+ binary_packages,
+ binary_packages.id == jobs.JobPackage.pkg_id,
+ )
+ .where(
+ Build.deleted_at == None,
+ jobs.Job.deleted_at == None,
+ source_packages.deleted_at == None,
+ binary_packages.deleted_at == None,
+ )
+ .where(
+ sqlalchemy.or_(
+ source_packages.uuid.in_(uuids),
+ binary_packages.uuid.in_(uuids),
+ ),
+ )
)
+ return await self.db.fetch_as_set(stmt)
+
async def create(self, repo, package, owner=None, group=None, test=False,
disable_test_builds=False, timeout=None):
"""
"""
log.debug("Calculating reverse requires for %s..." % self)
- # Collect the builds from all jobs
- reverse_requires = await asyncio.gather(
- *(job._reverse_requires() for job in self.jobs),
- )
+ # Fetch reverse requires for all jobs
+ reverse_requires = [await job._reverse_requires() for job in self.jobs]
# Join all builds together
return itertools.chain(*reverse_requires)