Fix totals returning 0 every time

This commit is contained in:
april 2024-01-12 13:35:14 -06:00
parent e3b7c15f2a
commit 7a0ea052f1

View File

@ -58,77 +58,89 @@ async def retrieve_totals(user: str, start_date: datetime = None, end_date: date
if end_date is not None: if end_date is not None:
match.setdefault("date", {}).setdefault("$lte", end_date) match.setdefault("date", {}).setdefault("$lte", end_date)
pipeline = [ by_class_pipeline = [
{"$match": {"user": ObjectId(user)}}, {"$match": {"user": ObjectId(user)}},
{"$lookup": { {"$lookup": {
"from": "flight", "from": "flight",
"let": {"aircraft": "$tail_no"}, "let": {"aircraft": "$tail_no"},
"pipeline": [{"$match": {"$expr": {"$eq": ["$$aircraft", "$aircraft"]}}}], "pipeline": [
{"$match": {
"$expr": {
"$eq": ["$$aircraft", "$aircraft"]
}
}}
],
"as": "flight_data" "as": "flight_data"
}}, }},
{"$unwind": "$flight_data"}, {"$unwind": "$flight_data"},
{"$group": { {"$group": {
# "_id": "$aircraft_category", "_id": {
"_id": {"aircraft_category": "$aircraft_category", "aircraft_class": "$aircraft_class"}, "aircraft_category": "$aircraft_category",
"time_total": {"$sum": "$flight_data.time_total"}, "aircraft_class": "$aircraft_class"
},
"time_total": {
"$sum": "$flight_data.time_total"
},
}}, }},
{"$group": { {"$group": {
"_id": "$_id.aircraft_category", "_id": "$_id.aircraft_category",
"classes": {"$push": { "classes": {
"aircraft_class": "$_id.aircraft_class", "$push": {
"time_total": "$time_total", "aircraft_class": "$_id.aircraft_class",
}}, "time_total": "$time_total",
}
},
}}, }},
{"$project": { {"$project": {
"_id": 0, "_id": 0,
"aircraft_category": "$_id", "aircraft_category": "$_id",
"classes": 1, "classes": 1,
}}, }},
{"$facet": {
"by_class": [{"$match": {}}],
"totals": [
{"$group": {
"_id": None,
"time_total": {"$sum": "$time_total"},
"time_solo": {"$sum": "$time_solo"},
"time_night": {"$sum": "$time_night"},
"time_pic": {"$sum": "$time_pic"},
"time_sic": {"$sum": "$time_sic"},
"time_instrument": {"$sum": "$time_instrument"},
"time_sim": {"$sum": "$time_sim"},
"time_xc": {"$sum": "$time_xc"},
"landings_day": {"$sum": "$landings_day"},
"landings_night": {"$sum": "$landings_night"},
"xc_dual_recvd": {"$sum": {"$min": ["$time_xc", "$dual_recvd"]}},
"xc_solo": {"$sum": {"$min": ["$time_xc", "$time_solo"]}},
"xc_pic": {"$sum": {"$min": ["$time_xc", "$time_pic"]}},
"night_dual_recvd": {"$sum": {"$min": ["$time_night", "$dual_recvd"]}},
"night_pic": {"$sum": {"$min": ["$time_night", "$time_pic"]}}
}},
{"$project": {"_id": 0}},
]
}},
{"$project": {
"by_class": 1,
"totals": {"$arrayElemAt": ["$totals", 0]}
}}
] ]
cursor = aircraft_collection.aggregate(pipeline) class_cursor = aircraft_collection.aggregate(by_class_pipeline)
by_class_list = await class_cursor.to_list(None)
result_list = await cursor.to_list(None) totals_pipeline = [
{"$match": {"user": ObjectId(user)}},
{"$group": {
"_id": None,
"time_total": {"$sum": "$time_total"},
"time_solo": {"$sum": "$time_solo"},
"time_night": {"$sum": "$time_night"},
"time_pic": {"$sum": "$time_pic"},
"time_sic": {"$sum": "$time_sic"},
"time_instrument": {"$sum": "$time_instrument"},
"time_sim": {"$sum": "$time_sim"},
"time_xc": {"$sum": "$time_xc"},
"landings_day": {"$sum": "$landings_day"},
"landings_night": {"$sum": "$landings_night"},
"xc_dual_recvd": {"$sum": {"$min": ["$time_xc", "$dual_recvd"]}},
"xc_solo": {"$sum": {"$min": ["$time_xc", "$time_solo"]}},
"xc_pic": {"$sum": {"$min": ["$time_xc", "$time_pic"]}},
"night_dual_recvd": {"$sum": {"$min": ["$time_night", "$dual_recvd"]}},
"night_pic": {"$sum": {"$min": ["$time_night", "$time_pic"]}}
}},
{"$project": {"_id": 0}},
]
if not result_list: totals_cursor = flight_collection.aggregate(totals_pipeline)
totals_list = await totals_cursor.to_list(None)
if not totals_list and not by_class_list:
return {} return {}
result = dict(result_list[0]) totals_dict = dict(totals_list[0])
for entry in result["by_class"]: for entry in by_class_list:
entry["aircraft_category"] = aircraft_category_dict[entry["aircraft_category"]] entry["aircraft_category"] = aircraft_category_dict[entry["aircraft_category"]]
for cls in entry["classes"]: for cls in entry["classes"]:
cls["aircraft_class"] = aircraft_class_dict[cls["aircraft_class"]] cls["aircraft_class"] = aircraft_class_dict[cls["aircraft_class"]]
print(result) result = {
"by_class": by_class_list,
"totals": totals_dict
}
return result return result