32
from storm.zope import IResultSet
32
33
from zope.component import getUtility
33
34
from zope.interface import implements
34
from zope.security.proxy import removeSecurityProxy
36
36
from canonical.config import config
37
37
from canonical.database.sqlbase import (
1015
1015
# Ordering according status
1016
1016
# * NEEDSBUILD, BUILDING & UPLOADING by -lastscore
1017
# * SUPERSEDED & All by -datecreated
1017
# * SUPERSEDED & All by -PackageBuild.build_farm_job
1018
# (nearly equivalent to -datecreated, but much more
1018
1020
# * FULLYBUILT & FAILURES by -datebuilt
1019
1021
# It should present the builds in a more natural order.
1021
1023
BuildStatus.NEEDSBUILD,
1022
1024
BuildStatus.BUILDING,
1023
1025
BuildStatus.UPLOADING]:
1024
orderBy = ["-BuildQueue.lastscore", "BinaryPackageBuild.id"]
1026
order_by = [Desc(BuildQueue.lastscore), BinaryPackageBuild.id]
1027
order_by_table = BuildQueue
1025
1028
clauseTables.append('BuildQueue')
1026
1029
clauseTables.append('BuildPackageJob')
1027
1030
condition_clauses.append(
1028
1031
'BuildPackageJob.build = BinaryPackageBuild.id')
1029
1032
condition_clauses.append('BuildPackageJob.job = BuildQueue.job')
1030
1033
elif status == BuildStatus.SUPERSEDED or status is None:
1031
orderBy = ["-BuildFarmJob.date_created"]
1034
order_by = [Desc(PackageBuild.build_farm_job_id)]
1035
order_by_table = PackageBuild
1033
orderBy = ["-BuildFarmJob.date_finished"]
1037
order_by = [Desc(BuildFarmJob.date_finished),
1038
BinaryPackageBuild.id]
1039
order_by_table = BuildFarmJob
1035
1041
# End of duplication (see XXX cprov 2006-09-25 above).
1043
1049
"PackageBuild.archive IN %s" %
1044
1050
sqlvalues(list(distribution.all_distro_archive_ids)))
1052
store = Store.of(distribution)
1053
clauseTables = [BinaryPackageBuild] + clauseTables
1054
result_set = store.using(*clauseTables).find(
1055
(BinaryPackageBuild, order_by_table), *condition_clauses)
1056
result_set.order_by(*order_by)
1058
def get_bpp(result_row):
1059
return result_row[0]
1046
1061
return self._decorate_with_prejoins(
1047
BinaryPackageBuild.select(' AND '.join(condition_clauses),
1048
clauseTables=clauseTables, orderBy=orderBy))
1062
DecoratedResultSet(result_set, result_decorator=get_bpp))
1050
1064
def _decorate_with_prejoins(self, result_set):
1051
1065
"""Decorate build records with related data prefetch functionality."""
1052
1066
# Grab the native storm result set.
1053
result_set = removeSecurityProxy(result_set)._result_set
1067
result_set = IResultSet(result_set)
1054
1068
decorated_results = DecoratedResultSet(
1055
1069
result_set, pre_iter_hook=self._prefetchBuildData)
1056
1070
return decorated_results