diff --git a/backend/civic_intelligence.py b/backend/civic_intelligence.py index 4a90640f..c070491c 100644 --- a/backend/civic_intelligence.py +++ b/backend/civic_intelligence.py @@ -3,7 +3,7 @@ import logging from datetime import datetime, timedelta, timezone from typing import List, Dict, Any -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, load_only from sqlalchemy import func from backend.models import Issue, EscalationAudit, EscalationReason, Grievance @@ -88,7 +88,8 @@ def run_daily_cycle(self): # Optimization: Fetch all related grievances in one query to avoid N+1 grievance_ids = [audit.grievance_id for audit in upgrades] if grievance_ids: - grievances = db.query(Grievance).filter(Grievance.id.in_(grievance_ids)).all() + # Optimized: Use load_only to avoid fetching unnecessary columns while preserving ORM objects + grievances = db.query(Grievance).options(load_only(Grievance.id, Grievance.category)).filter(Grievance.id.in_(grievance_ids)).all() grievance_map = {g.id: g for g in grievances} else: grievance_map = {} diff --git a/backend/tests/test_civic_intelligence.py b/backend/tests/test_civic_intelligence.py index dec96015..f79a37f3 100644 --- a/backend/tests/test_civic_intelligence.py +++ b/backend/tests/test_civic_intelligence.py @@ -190,6 +190,7 @@ def query_side_effect(*args): g1 = Grievance(id=1, category="Fire") g2 = Grievance(id=2, category="Fire") g3 = Grievance(id=3, category="Fire") + mock_query_grievance.options.return_value.filter.return_value.all.return_value = [g1, g2, g3] mock_query_grievance.filter.return_value.all.return_value = [g1, g2, g3] # Setup Trend Analyzer