def get_reports()

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())