"""Postgres adapter for the ``property_overrides`` read side. Read-only and uow-independent: ``property_overrides`` is committed reference data the ``bulk_upload_finaliser`` Lambda writes at Finalise, long before First Run executes — there is no transactional coupling to the ingestion run, so this opens its own short read session per call via the injected session factory (mirroring the composition root's ``lambda: Session(engine)``). """ from __future__ import annotations from collections.abc import Callable from sqlmodel import Session, col, select from infrastructure.postgres.property_override_table import PropertyOverrideRow from repositories.property.property_overrides_reader import ( PropertyOverridesReader, ResolvedPropertyOverride, ResolvedPropertyOverrides, ) class PropertyOverridesPostgresReader(PropertyOverridesReader): def __init__(self, session_factory: Callable[[], Session]) -> None: self._session_factory = session_factory def overrides_for(self, property_id: int) -> ResolvedPropertyOverrides: with self._session_factory() as session: rows = session.exec( select(PropertyOverrideRow).where( col(PropertyOverrideRow.property_id) == property_id ) ).all() return ResolvedPropertyOverrides( rows=tuple( ResolvedPropertyOverride( override_component=row.override_component, building_part=row.building_part, override_value=row.override_value, ) for row in rows ) )