"""Stream exact playback samples without materializing full-network JSON results.""" from collections.abc import AsyncIterator from datetime import datetime from typing import Any from psycopg import AsyncConnection class HydraulicPlaybackRepository: @staticmethod async def iter_node_pressures(conn: AsyncConnection, times: list[datetime]) -> AsyncIterator[dict[str, Any]]: async with conn.cursor() as cursor: await cursor.execute(""" SELECT time, node_id, pressure FROM realtime.node_results WHERE time = ANY(%s) ORDER BY time, node_id """, (times,)) async for row in cursor: yield row @staticmethod async def iter_pipe_metrics(conn: AsyncConnection, times: list[datetime]) -> AsyncIterator[dict[str, Any]]: async with conn.cursor() as cursor: await cursor.execute(""" SELECT time, link_id, flow, velocity FROM realtime.link_results WHERE time = ANY(%s) ORDER BY time, link_id """, (times,)) async for row in cursor: yield row