diff --git a/backend/routers/field_officer.py b/backend/routers/field_officer.py index bfc75f30..2a46f6c9 100644 --- a/backend/routers/field_officer.py +++ b/backend/routers/field_officer.py @@ -409,25 +409,21 @@ def get_visit_statistics(db: Session = Depends(get_db)): """ try: # Use SQL aggregates instead of loading all visits into memory - total_visits = db.query(func.count(FieldOfficerVisit.id)).scalar() or 0 - - verified_visits = db.query(func.count(FieldOfficerVisit.id)).filter( - FieldOfficerVisit.verified_at.isnot(None) - ).scalar() or 0 - - within_geofence_count = db.query(func.count(FieldOfficerVisit.id)).filter( - FieldOfficerVisit.within_geofence == True - ).scalar() or 0 - - outside_geofence_count = db.query(func.count(FieldOfficerVisit.id)).filter( - FieldOfficerVisit.within_geofence == False - ).scalar() or 0 - - unique_officers = db.query(func.count(func.distinct(FieldOfficerVisit.officer_email))).scalar() or 0 - - average_distance = db.query(func.avg(FieldOfficerVisit.distance_from_site)).filter( - FieldOfficerVisit.distance_from_site.isnot(None) - ).scalar() + stats = db.query( + func.count(FieldOfficerVisit.id).label("total_visits"), + func.sum(case((FieldOfficerVisit.verified_at.isnot(None), 1), else_=0)).label("verified_visits"), + func.sum(case((FieldOfficerVisit.within_geofence == True, 1), else_=0)).label("within_geofence_count"), + func.sum(case((FieldOfficerVisit.within_geofence == False, 1), else_=0)).label("outside_geofence_count"), + func.count(func.distinct(FieldOfficerVisit.officer_email)).label("unique_officers"), + func.avg(FieldOfficerVisit.distance_from_site).label("average_distance") + ).first() + + total_visits = stats.total_visits or 0 + verified_visits = int(stats.verified_visits or 0) + within_geofence_count = int(stats.within_geofence_count or 0) + outside_geofence_count = int(stats.outside_geofence_count or 0) + unique_officers = stats.unique_officers or 0 + average_distance = stats.average_distance # Round to 2 decimals if not None if average_distance is not None: diff --git a/backend/routers/utility.py b/backend/routers/utility.py index 29a3d004..4bbc1877 100644 --- a/backend/routers/utility.py +++ b/backend/routers/utility.py @@ -53,8 +53,13 @@ def get_stats(db: Session = Depends(get_db)): if cached_stats: return JSONResponse(content=cached_stats) - total = db.query(func.count(Issue.id)).scalar() - resolved = db.query(func.count(Issue.id)).filter(Issue.status.in_(['resolved', 'verified'])).scalar() + stats = db.query( + func.count(Issue.id).label("total"), + func.sum(case((Issue.status.in_(['resolved', 'verified']), 1), else_=0)).label("resolved") + ).first() + + total = stats.total or 0 + resolved = int(stats.resolved or 0) # Pending is everything else pending = total - resolved