80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
import asyncpg
|
|
from typing import List, Dict
|
|
|
|
|
|
class VehiclesRepository:
|
|
"""Repository for hierarchical vehicle queries against normalized schema"""
|
|
|
|
async def get_years(self, db: asyncpg.Connection) -> List[int]:
|
|
rows = await db.fetch(
|
|
"""
|
|
SELECT DISTINCT year
|
|
FROM vehicles.model_year
|
|
ORDER BY year DESC
|
|
"""
|
|
)
|
|
return [r["year"] for r in rows]
|
|
|
|
async def get_makes(self, db: asyncpg.Connection, year: int) -> List[Dict]:
|
|
rows = await db.fetch(
|
|
"""
|
|
SELECT DISTINCT ma.id, ma.name
|
|
FROM vehicles.make ma
|
|
JOIN vehicles.model mo ON mo.make_id = ma.id
|
|
JOIN vehicles.model_year my ON my.model_id = mo.id AND my.year = $1
|
|
ORDER BY ma.name
|
|
""",
|
|
year,
|
|
)
|
|
return [{"id": r["id"], "name": r["name"]} for r in rows]
|
|
|
|
async def get_models(self, db: asyncpg.Connection, year: int, make_id: int) -> List[Dict]:
|
|
rows = await db.fetch(
|
|
"""
|
|
SELECT DISTINCT mo.id, mo.name
|
|
FROM vehicles.model mo
|
|
JOIN vehicles.model_year my ON my.model_id = mo.id AND my.year = $1
|
|
WHERE mo.make_id = $2
|
|
ORDER BY mo.name
|
|
""",
|
|
year,
|
|
make_id,
|
|
)
|
|
return [{"id": r["id"], "name": r["name"]} for r in rows]
|
|
|
|
async def get_trims(self, db: asyncpg.Connection, year: int, model_id: int) -> List[Dict]:
|
|
rows = await db.fetch(
|
|
"""
|
|
SELECT t.id, t.name
|
|
FROM vehicles.trim t
|
|
JOIN vehicles.model_year my ON my.id = t.model_year_id
|
|
WHERE my.year = $1 AND my.model_id = $2
|
|
ORDER BY t.name
|
|
""",
|
|
year,
|
|
model_id,
|
|
)
|
|
return [{"id": r["id"], "name": r["name"]} for r in rows]
|
|
|
|
async def get_engines(
|
|
self, db: asyncpg.Connection, year: int, model_id: int, trim_id: int
|
|
) -> List[Dict]:
|
|
rows = await db.fetch(
|
|
"""
|
|
SELECT DISTINCT e.id, e.name
|
|
FROM vehicles.engine e
|
|
JOIN vehicles.trim_engine te ON te.engine_id = e.id
|
|
JOIN vehicles.trim t ON t.id = te.trim_id
|
|
JOIN vehicles.model_year my ON my.id = t.model_year_id
|
|
WHERE my.year = $1
|
|
AND my.model_id = $2
|
|
AND t.id = $3
|
|
ORDER BY e.name
|
|
""",
|
|
year,
|
|
model_id,
|
|
trim_id,
|
|
)
|
|
return [{"id": r["id"], "name": r["name"]} for r in rows]
|
|
|