From 62857b08d98f17d8c061b3bcd8c1f0a6efa5395a Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 24 Feb 2024 03:11:45 +0200 Subject: [PATCH 1/3] Add leaderboard key value filter. --- engineapi/engineapi/actions.py | 13 +++++++++++++ engineapi/engineapi/routes/leaderboard.py | 17 ++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/engineapi/engineapi/actions.py b/engineapi/engineapi/actions.py index dd777027..a19d764a 100644 --- a/engineapi/engineapi/actions.py +++ b/engineapi/engineapi/actions.py @@ -1289,6 +1289,7 @@ def get_leaderboard_positions( limit: int, offset: int, version_number: Optional[int] = None, + poitns_data: Optional[Dict[str, str]] = None, ) -> List[Row[Tuple[uuid.UUID, str, int, str, int]]]: """ Get the leaderboard positions @@ -1324,6 +1325,18 @@ def get_leaderboard_positions( .filter(LeaderboardVersion.version_number == latest_version) ) + if poitns_data: + + query = query.filter( + or_( + *[ + LeaderboardScores.points_data[point_key].astext == point_value + for point_key, point_value in poitns_data.items() + ] + ) + ) + + if limit: query = query.limit(limit) diff --git a/engineapi/engineapi/routes/leaderboard.py b/engineapi/engineapi/routes/leaderboard.py index 8a69e8f8..b48b6f2e 100644 --- a/engineapi/engineapi/routes/leaderboard.py +++ b/engineapi/engineapi/routes/leaderboard.py @@ -1,6 +1,7 @@ """ Leaderboard API. """ + import logging from typing import Any, Dict, List, Optional, Any, Union from uuid import UUID @@ -88,6 +89,19 @@ app.add_middleware( ) +def points_data_dependency(request: Request): + # Extract all query parameters as a dictionary + query_params = dict(request.query_params) + # Filter parameters that start with 'points_data.' + points_data_params = { + key[len("points_data.") :]: value + for key, value in query_params.items() + if key.startswith("points_data.") + } + # Optionally, transform the keys or structure as needed + return points_data_params + + @app.get( "", response_model=List[data.LeaderboardPosition], @@ -104,6 +118,7 @@ async def leaderboard( offset: int = Query(0), db_session: Session = Depends(db.yield_db_session), version: Optional[str] = Query(None, description="Version of the leaderboard."), + points_data: Dict[str, str] = Depends(points_data_dependency), ) -> List[data.LeaderboardPosition]: """ Returns the leaderboard positions. @@ -122,7 +137,7 @@ async def leaderboard( raise EngineHTTPException(status_code=500, detail="Internal server error") leaderboard_positions = actions.get_leaderboard_positions( - db_session, leaderboard.id, limit, offset, version + db_session, leaderboard.id, limit, offset, version, points_data ) result = [ From 0b6039512094b79b2c5b86507073cd3dfd656f1c Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 24 Feb 2024 03:13:39 +0200 Subject: [PATCH 2/3] Remove comment. --- engineapi/engineapi/routes/leaderboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engineapi/engineapi/routes/leaderboard.py b/engineapi/engineapi/routes/leaderboard.py index b48b6f2e..b41b2c04 100644 --- a/engineapi/engineapi/routes/leaderboard.py +++ b/engineapi/engineapi/routes/leaderboard.py @@ -98,7 +98,7 @@ def points_data_dependency(request: Request): for key, value in query_params.items() if key.startswith("points_data.") } - # Optionally, transform the keys or structure as needed + return points_data_params From 4e8b4960e979c874bbb2f79e2348e793da2cf468 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 28 Feb 2024 18:05:42 +0200 Subject: [PATCH 3/3] Change query params check. --- engineapi/engineapi/actions.py | 5 ++--- engineapi/engineapi/routes/leaderboard.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/engineapi/engineapi/actions.py b/engineapi/engineapi/actions.py index a19d764a..bc0c6d74 100644 --- a/engineapi/engineapi/actions.py +++ b/engineapi/engineapi/actions.py @@ -1288,8 +1288,8 @@ def get_leaderboard_positions( leaderboard_id: uuid.UUID, limit: int, offset: int, + poitns_data: Dict[str, str], version_number: Optional[int] = None, - poitns_data: Optional[Dict[str, str]] = None, ) -> List[Row[Tuple[uuid.UUID, str, int, str, int]]]: """ Get the leaderboard positions @@ -1325,7 +1325,7 @@ def get_leaderboard_positions( .filter(LeaderboardVersion.version_number == latest_version) ) - if poitns_data: + if len(poitns_data) > 0: query = query.filter( or_( @@ -1336,7 +1336,6 @@ def get_leaderboard_positions( ) ) - if limit: query = query.limit(limit) diff --git a/engineapi/engineapi/routes/leaderboard.py b/engineapi/engineapi/routes/leaderboard.py index b41b2c04..59964492 100644 --- a/engineapi/engineapi/routes/leaderboard.py +++ b/engineapi/engineapi/routes/leaderboard.py @@ -137,7 +137,7 @@ async def leaderboard( raise EngineHTTPException(status_code=500, detail="Internal server error") leaderboard_positions = actions.get_leaderboard_positions( - db_session, leaderboard.id, limit, offset, version, points_data + db_session, leaderboard.id, limit, offset, points_data, version ) result = [