feat(db): aggregate_marches pour les requêtes GROUP BY (#78)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Colin Maudry
2026-06-22 14:04:08 +02:00
parent 9324a734d4
commit 28709a162a
2 changed files with 46 additions and 0 deletions
+27
View File
@@ -191,3 +191,30 @@ def count_unique_marches(where_sql: str = "TRUE", params: tuple | list = ()) ->
logger.debug("count_unique_marches: " + sql.replace("?", "{}").format(*params))
result = get_cursor().execute(sql, list(params)).fetchone()
return int(result[0]) if result else 0
def aggregate_marches(
select_sql: str,
where_sql: str = "TRUE",
params: tuple | list = (),
group_by: str | None = None,
limit: int | None = None,
offset: int | None = None,
) -> pl.DataFrame:
"""SELECT agrégé paramétré contre la table decp.
`select_sql` et `group_by` sont des fragments SQL construits depuis des
noms de colonnes validés (jamais de valeur utilisateur libre). Les
valeurs de filtre passent par le binding `?` via `params`.
"""
sql = f"SELECT {select_sql} FROM decp WHERE {where_sql}"
if group_by:
sql += f" GROUP BY {group_by}"
if limit is not None:
sql += f" LIMIT {int(limit)}"
if offset is not None:
sql += f" OFFSET {int(offset)}"
logger.debug("aggregate_marches: " + sql.replace("?", "{}").format(*params))
return get_cursor().execute(sql, list(params)).pl()