diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 6f2d62a..eaeaa4e 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -17,6 +17,14 @@ alter sequence players_id_seq restart with 1; alter sequence elo_scores_id_seq restart with 1; ``` +To make connection: + +``` +k -n edh-elo port-forward svc/edh-elo-postgresql 5432:5432 +psql -U db_user -d postgres -h localhost + + + # To copy the database out to local ``` diff --git a/app/routers/score.py b/app/routers/score.py index 102f470..1e6cad1 100644 --- a/app/routers/score.py +++ b/app/routers/score.py @@ -1,6 +1,7 @@ from fastapi import APIRouter, Depends +from sqlalchemy.sql.expression import func -from ..sql import crud, schemas +from ..sql import crud, models, schemas from ..sql.database import get_db api_router = APIRouter(prefix="/score", tags=["score"]) @@ -14,3 +15,30 @@ def get_latest_score_for_deck(deck_id: int, db=Depends(get_db)): @api_router.get("/{deck_id}/all", response_model=list[schemas.EloScore]) def get_all_scores_for_deck(deck_id: int, db=Depends(get_db)): return crud.get_all_scores_for_deck(db, deck_id) + + +@api_router.get("/{deck_id}/by_date") +def get_scores_for_deck_by_date(deck_id: int, db=Depends(get_db)): + row_number_column = ( + func.row_number() + .over( + partition_by=[models.Deck.name, models.Game.date], + order_by=models.EloScore.id.desc(), + ) + .label("row_number") + ) + sub_query = ( + db.query(models.EloScore.score, models.Game.date) + .filter(models.EloScore.deck_id == deck_id) + .join(models.Game, models.EloScore.after_game_id == models.Game.id) + # Necessary because the `row_number_column` makes the Deck table involved, so we need a join to avoid full + # Cartesian join. + .join(models.Deck, models.EloScore.deck_id == models.Deck.id) + .add_column(row_number_column) + ) + + sub_query = sub_query.subquery() + query = db.query(sub_query).filter(sub_query.c.row_number == 1) + results = query.all() + + return list(map(lambda x: x._asdict(), results))