Coverage for routers/predictive.py: 100%
33 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-05-31 21:56 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-05-31 21:56 +0000
1from fastapi import APIRouter, Depends, HTTPException, Response
2import duckdb
3from typing import List
5from database import get_db
6import schemas
8router = APIRouter(
9 prefix="/api/v1",
10 tags=["Predictive Reliability"]
11)
13@router.get("/generations/{generation_id}/reliability", response_model=schemas.ReliabilitySummaryResponse)
14def get_reliability_summary(generation_id: int, response: Response, db: duckdb.DuckDBPyConnection = Depends(get_db)):
15 # Highly static data (7 days cache)
16 response.headers["Cache-Control"] = "public, max-age=604800"
18 query = """
19 SELECT category, incidence_rate
20 FROM predictive_models
21 WHERE generation_id = ?
22 ORDER BY incidence_rate DESC
23 LIMIT 3
24 """
25 db.execute(query, [generation_id])
26 categories = db.fetchall()
27 columns = [desc[0] for desc in db.description]
29 return {
30 "generation_id": generation_id,
31 "top_categories": [
32 {
33 "category": dict(zip(columns, row))["category"],
34 "incidence_rate": dict(zip(columns, row))["incidence_rate"]
35 }
36 for row in categories
37 ]
38 }
40@router.get("/generations/{generation_id}/reliability/granular", response_model=List[schemas.DefectIncidenceResponse])
41def get_reliability_granular(generation_id: int, response: Response, db: duckdb.DuckDBPyConnection = Depends(get_db)):
42 # Highly static data (7 days cache)
43 response.headers["Cache-Control"] = "public, max-age=604800"
45 query = """
46 SELECT category, defect_description, incidence_rate
47 FROM predictive_model_defects
48 WHERE generation_id = ?
49 ORDER BY incidence_rate DESC
50 """
51 db.execute(query, [generation_id])
52 defects = db.fetchall()
53 columns = [desc[0] for desc in db.description]
55 return [
56 {
57 "category": dict(zip(columns, row))["category"],
58 "defect_description": dict(zip(columns, row))["defect_description"],
59 "incidence_rate": dict(zip(columns, row))["incidence_rate"]
60 }
61 for row in defects
62 ]
64@router.get("/generations/{generation_id}/population", response_model=schemas.PopulationResponse)
65def get_population(generation_id: int, response: Response, db: duckdb.DuckDBPyConnection = Depends(get_db)):
66 # Highly static data (7 days cache)
67 response.headers["Cache-Control"] = "public, max-age=604800"
69 query = """
70 SELECT total_on_road, total_sorn
71 FROM vehicle_population
72 WHERE generation_id = ?
73 """
74 db.execute(query, [generation_id])
75 result = db.fetchone()
77 if not result:
78 raise HTTPException(status_code=404, detail="Population data not found for this generation")
80 columns = [desc[0] for desc in db.description]
81 pop = dict(zip(columns, result))
83 return {
84 "generation_id": generation_id,
85 "total_on_road": pop["total_on_road"],
86 "total_sorn": pop["total_sorn"]
87 }