Beispiel #1
0
    def build_elasticsearch_result(self, info_buckets: List[dict]) -> List[dict]:
        results = []
        for bucket in info_buckets:
            info = json.loads(bucket.get("key"))

            # Build a list of hash IDs to handle multiple levels
            recipient_hash = info.get("hash")
            recipient_levels = sorted(info.get("levels") or [])
            if recipient_hash and recipient_levels:
                recipient_hash_list = [f"{recipient_hash}-{level}" for level in recipient_levels]
            else:
                recipient_hash_list = None

            results.append(
                {
                    "id": recipient_hash_list,
                    "code": info["unique_id"] or "DUNS Number not provided",
                    "description": info["name"] or None,
                    "award_count": int(bucket.get("doc_count", 0)),
                    **{
                        column: get_summed_value_as_float(bucket, self.sum_column_mapping[column])
                        for column in self.sum_column_mapping
                    },
                }
            )

        return results
Beispiel #2
0
    def build_elasticsearch_result(self, info_buckets: List[dict]) -> List[dict]:
        results = []

        cfda_prefetch_pks = [bucket.get("key") for bucket in info_buckets]
        prefetched_cfdas = {
            cfda["program_number"]: cfda for cfda in Cfda.objects.filter(program_number__in=cfda_prefetch_pks).values()
        }

        for bucket in info_buckets:
            cfda_number = bucket.get("key")
            cfda = prefetched_cfdas.get(cfda_number, {})

            results.append(
                {
                    "id": cfda.get("id"),
                    "code": cfda.get("program_number"),
                    "description": cfda.get("program_title"),
                    "award_count": int(bucket.get("doc_count", 0)),
                    "resource_link": cfda.get("url") if cfda.get("url") != "None;" else None,
                    "cfda_federal_agency": cfda.get("federal_agency"),
                    "cfda_objectives": cfda.get("objectives"),
                    "cfda_website": cfda.get("website_address"),
                    "applicant_eligibility": cfda.get("applicant_eligibility"),
                    "beneficiary_eligibility": cfda.get("beneficiary_eligibility"),
                    **{
                        column: get_summed_value_as_float(bucket, self.sum_column_mapping[column])
                        for column in self.sum_column_mapping
                    },
                }
            )

        return results
Beispiel #3
0
    def build_elasticsearch_result(self,
                                   info_buckets: List[dict]) -> List[dict]:
        results = []

        cfda_prefetch_pks = [
            json_str_to_dict(bucket.get("key")).get("code")
            for bucket in info_buckets
        ]
        prefetched_cfdas = Cfda.objects.filter(
            program_number__in=cfda_prefetch_pks)

        for bucket in info_buckets:
            info = json_str_to_dict(bucket.get("key"))

            toAdd = {
                "id": int(info.get("id")) if info.get("id") else None,
                "code": info.get("code") or None,
                "description": info.get("description") or None,
                "award_count": int(bucket.get("doc_count", 0)),
                "resource_link": info.get("url") or None,
                **{
                    column: get_summed_value_as_float(
                        bucket, self.sum_column_mapping[column])
                    for column in self.sum_column_mapping
                },
            }

            cfda = [
                cfda for cfda in prefetched_cfdas
                if cfda.program_number == info.get("code")
            ]
            if cfda:
                toAdd.update({
                    "cfda_federal_agency":
                    cfda[0].federal_agency,
                    "cfda_objectives":
                    cfda[0].objectives,
                    "cfda_website":
                    cfda[0].website_address,
                    "applicant_eligibility":
                    cfda[0].applicant_eligibility,
                    "beneficiary_eligibility":
                    cfda[0].beneficiary_eligibility,
                })
            else:
                toAdd.update({
                    "cfda_federal_agency": None,
                    "cfda_objectives": None,
                    "cfda_website": None,
                    "applicant_eligibility": None,
                    "beneficiary_eligibility": None,
                })

            results.append(toAdd)

        return results
Beispiel #4
0
 def _build_json_result(self, bucket: dict):
     info = json_str_to_dict(bucket.get("key"))
     return {
         "id": int(info["id"]),
         "code": info["code"],
         "description": info["name"],
         # the count of distinct awards contributing to the totals
         "award_count": int(bucket.get("doc_count", 0)),
         **{
             column: get_summed_value_as_float(bucket, self.sum_column_mapping[column])
             for column in self.sum_column_mapping
         },
     }
Beispiel #5
0
    def build_totals(self, response: List[dict]) -> dict:
        # Need to use a Postgres in this case since we only look at the first 10k results for Elasticsearch.
        # Since the endpoint is performing aggregations on the entire matview with no grouping or joins
        # the query takes minimal time to complete.
        if self.agg_key == settings.ES_ROUTING_FIELD:
            annotations = {
                "cast_def_codes": Cast("def_codes", ArrayField(TextField()))
            }
            filters = [
                Q(cast_def_codes__overlap=self.def_codes),
                self.has_award_of_provided_type(should_join_awards=False),
            ]
            aggregations = {
                "face_value_of_loan": Sum("total_loan_value"),
                "obligation": Sum("obligation"),
                "outlay": Sum("outlay"),
            }
            aggregations = {
                col: aggregations[col]
                for col in self.sum_column_mapping.keys()
            }
            aggregations["award_count"] = Count("award_id")

            if self.filters.get("query"):
                filters.append(
                    Q(recipient_name__icontains=self.filters["query"]["text"]))

            totals = (CovidFinancialAccountMatview.objects.annotate(
                **annotations).filter(*filters).values().aggregate(
                    **aggregations))
            return totals

        totals = {key: 0 for key in self.sum_column_mapping.keys()}
        award_count = 0

        for bucket in response:
            for key in totals.keys():
                totals[key] += get_summed_value_as_float(
                    bucket, self.sum_column_mapping[key])
            award_count += int(bucket.get("doc_count", 0))

        totals["award_count"] = award_count

        return totals