in crashclouseau/models.py [0:0]
def get_reports(signatures, product=None, channel=None):
reports = (
db.session.query(
Build.buildid,
Build.product,
Build.channel,
Signature.signature,
UUID.id,
UUID.uuid,
UUID.max_score,
)
.select_from(Signature)
.join(UUID)
.join(Build)
.filter(
Signature.signature.in_(signatures),
UUID.useless.is_(False),
UUID.analyzed.is_(True),
)
)
if product is not None:
reports = reports.filter(Build.product == product)
if channel is not None:
reports = reports.filter(Build.channel == channel)
reports_map = {
report.id: {
"uuid": report.uuid,
"build_id": int(utils.get_buildid(report.buildid)),
"product": report.product,
"channel": report.channel,
"signature": report.signature,
"max_score": report.max_score,
"changesets": [],
}
for report in reports
}
if not reports_map:
# No reports found, no need to continue
return []
changeset_aggregated_columns = (
CrashStack.uuidid,
Node.node,
Node.channel,
Node.pushdate,
Node.backedout,
Node.merge,
Node.bug,
)
changesets = (
db.session.query(
*changeset_aggregated_columns,
func.max(Score.score).label("max_score"),
)
.select_from(CrashStack)
.join(Score)
.join(Changeset)
.join(Node)
.filter(
CrashStack.uuidid.in_(reports_map.keys()),
)
.group_by(*changeset_aggregated_columns)
)
for changeset in changesets:
reports_map[changeset.uuidid]["changesets"].append(
{
"changeset": changeset.node,
"channel": changeset.channel,
"push_date": changeset.pushdate,
"is_backedout": changeset.backedout,
"is_merge": changeset.merge,
"bug_id": changeset.bug,
"max_score": changeset.max_score,
}
)
return list(reports_map.values())