Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,7 @@
## 2025-07-15 - Fast Bounding Box Pre-filter
**Learning:** Calculating great circle distance (Haversine) for every issue against a target location is computationally expensive (O(N) with heavy math ops like sin, cos, atan2). In high-traffic aggregations, this can become a bottleneck.
**Action:** Use a fast bounding box pre-filter (`get_bounding_box` with a 5% epsilon) to quickly discard issues that are definitely outside the search radius before running the expensive exact haversine distance calculation.

## 2025-07-21 - N+1 Queries in Periodic Jobs
**Learning:** During periodic tasks that evaluate many database records (like checking SLA deadlines in an escalation engine), accessing related models (like `grievance.jurisdiction.level`) without eager loading causes N+1 query bottlenecks. This can severely degrade performance as the number of records grows.
**Action:** Use SQLAlchemy's `joinedload` (e.g., `.options(joinedload(Model.relationship))`) in the initial query to pre-fetch related data in a single SQL join instead of making separate queries for each record.
4 changes: 2 additions & 2 deletions backend/escalation_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import datetime
from typing import List, Dict, Any, Optional
from sqlalchemy.orm import Session
from sqlalchemy.orm import Session, joinedload
from sqlalchemy import and_, or_
from backend.models import Grievance, Jurisdiction, EscalationAudit, GrievanceStatus, JurisdictionLevel, EscalationReason, SeverityLevel
from backend.database import SessionLocal
Expand Down Expand Up @@ -150,7 +150,7 @@ def _get_grievances_for_evaluation(self, db: Session) -> List[Grievance]:
now = datetime.datetime.now(datetime.timezone.utc)

# Get grievances that are active and past SLA deadline
return db.query(Grievance).filter(
return db.query(Grievance).options(joinedload(Grievance.jurisdiction)).filter(
and_(
Grievance.status.in_([GrievanceStatus.OPEN, GrievanceStatus.IN_PROGRESS, GrievanceStatus.ESCALATED]),
Grievance.sla_deadline < now
Expand Down
Loading