from collections.abc import Iterator from typing import Optional from folkugat_web.dal.sql import Connection, get_connection from folkugat_web.model import playlists as model from ._conversion import row_to_playlist_entry def _filter_clause( entry_id: Optional[int] = None, set_id: Optional[int] = None, session_id: Optional[int] = None, ) -> tuple[str, dict]: filter_clauses = [] query_data = {} if entry_id is not None: filter_clauses.append("id = :id") query_data["id"] = entry_id if set_id is not None: filter_clauses.append("set_id = :set_id") query_data["set_id"] = set_id if session_id is not None: filter_clauses.append("session_id = :session_id") query_data["session_id"] = session_id return " AND ".join(filter_clauses), query_data def get_playlist_entries( entry_id: Optional[int] = None, set_id: Optional[int] = None, session_id: Optional[int] = None, con: Optional[Connection] = None, ) -> Iterator[model.PlaylistEntry]: filter_clause, data = _filter_clause(entry_id=entry_id, set_id=set_id, session_id=session_id) query = f""" SELECT id, session_id, set_id, tema_id FROM playlists WHERE {filter_clause} """ with get_connection(con) as con: cur = con.cursor() cur.execute(query, data) return map(row_to_playlist_entry, cur.fetchall())