diff --git a/backend/closure_service.py b/backend/closure_service.py index f4ecf984..9ca652a7 100644 --- a/backend/closure_service.py +++ b/backend/closure_service.py @@ -139,14 +139,15 @@ def check_and_finalize_closure(grievance_id: int, db: Session) -> dict: ).scalar() # Get all confirmation counts in a single query instead of multiple round-trips - from sqlalchemy import case - stats = db.query( - func.sum(case((ClosureConfirmation.confirmation_type == 'confirmed', 1), else_=0)).label('confirmed'), - func.sum(case((ClosureConfirmation.confirmation_type == 'disputed', 1), else_=0)).label('disputed') - ).filter(ClosureConfirmation.grievance_id == grievance_id).first() - - confirmations_count = stats.confirmed or 0 - disputes_count = stats.disputed or 0 + # Optimized: Use group_by instead of sum(case) for better aggregation performance + counts = db.query( + ClosureConfirmation.confirmation_type, + func.count(ClosureConfirmation.id) + ).filter(ClosureConfirmation.grievance_id == grievance_id).group_by(ClosureConfirmation.confirmation_type).all() + + counts_dict = dict(counts) + confirmations_count = counts_dict.get('confirmed', 0) + disputes_count = counts_dict.get('disputed', 0) required_confirmations = max(1, int(total_followers * ClosureService.CONFIRMATION_THRESHOLD)) diff --git a/backend/routers/grievances.py b/backend/routers/grievances.py index 9aa24312..f13e3590 100644 --- a/backend/routers/grievances.py +++ b/backend/routers/grievances.py @@ -435,14 +435,15 @@ def get_closure_status( ).scalar() # Get all confirmation counts in a single query instead of multiple round-trips - from sqlalchemy import case - stats = db.query( - func.sum(case((ClosureConfirmation.confirmation_type == 'confirmed', 1), else_=0)).label('confirmed'), - func.sum(case((ClosureConfirmation.confirmation_type == 'disputed', 1), else_=0)).label('disputed') - ).filter(ClosureConfirmation.grievance_id == grievance_id).first() + # Optimized: Use group_by instead of sum(case) for better aggregation performance + counts = db.query( + ClosureConfirmation.confirmation_type, + func.count(ClosureConfirmation.id) + ).filter(ClosureConfirmation.grievance_id == grievance_id).group_by(ClosureConfirmation.confirmation_type).all() - confirmations_count = stats.confirmed or 0 - disputes_count = stats.disputed or 0 + counts_dict = dict(counts) + confirmations_count = counts_dict.get('confirmed', 0) + disputes_count = counts_dict.get('disputed', 0) required_confirmations = max(1, int(total_followers * ClosureService.CONFIRMATION_THRESHOLD))