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
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
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
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 }, }
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