mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-07-12 13:29:04 +00:00
Skip re-saving EPC data when it was read from DB unchanged
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b426940136
commit
b1406bb482
1 changed files with 12 additions and 4 deletions
|
|
@ -166,7 +166,9 @@ class _PropertyWrite:
|
||||||
scenario_id: int
|
scenario_id: int
|
||||||
is_default: bool
|
is_default: bool
|
||||||
lodged_epc: Optional[EpcPropertyData]
|
lodged_epc: Optional[EpcPropertyData]
|
||||||
|
lodged_epc_is_new: bool
|
||||||
predicted_epc: Optional[EpcPropertyData]
|
predicted_epc: Optional[EpcPropertyData]
|
||||||
|
predicted_epc_is_new: bool
|
||||||
spatial: Optional[SpatialReference]
|
spatial: Optional[SpatialReference]
|
||||||
solar: Optional[_SolarWrite]
|
solar: Optional[_SolarWrite]
|
||||||
plan: Plan
|
plan: Plan
|
||||||
|
|
@ -185,13 +187,13 @@ def _flush_writes(engine: Engine, writes: list[_PropertyWrite]) -> None:
|
||||||
before a write is ever queued."""
|
before a write is ever queued."""
|
||||||
with PostgresUnitOfWork(lambda: Session(engine)) as uow:
|
with PostgresUnitOfWork(lambda: Session(engine)) as uow:
|
||||||
for w in writes:
|
for w in writes:
|
||||||
if w.lodged_epc is not None:
|
if w.lodged_epc is not None and w.lodged_epc_is_new:
|
||||||
uow.epc.save(
|
uow.epc.save(
|
||||||
w.lodged_epc,
|
w.lodged_epc,
|
||||||
property_id=w.property_id,
|
property_id=w.property_id,
|
||||||
portfolio_id=w.portfolio_id,
|
portfolio_id=w.portfolio_id,
|
||||||
)
|
)
|
||||||
elif w.predicted_epc is not None:
|
elif w.predicted_epc is not None and w.predicted_epc_is_new:
|
||||||
# Persist the synthesised EPC in the predicted slot (ADR-0031), so
|
# Persist the synthesised EPC in the predicted slot (ADR-0031), so
|
||||||
# the Baseline stage can re-hydrate it and downstream sees the
|
# the Baseline stage can re-hydrate it and downstream sees the
|
||||||
# picture the Plan was modelled from.
|
# picture the Plan was modelled from.
|
||||||
|
|
@ -542,8 +544,10 @@ def handler(
|
||||||
)
|
)
|
||||||
|
|
||||||
stored_lodged = stored_lodged_epcs.get(pid)
|
stored_lodged = stored_lodged_epcs.get(pid)
|
||||||
|
lodged_epc_is_new = False
|
||||||
if refetch_epc:
|
if refetch_epc:
|
||||||
epc: Optional[EpcPropertyData] = epc_client.get_by_uprn(uprn)
|
epc: Optional[EpcPropertyData] = epc_client.get_by_uprn(uprn)
|
||||||
|
lodged_epc_is_new = epc is not None
|
||||||
elif stored_lodged is not None:
|
elif stored_lodged is not None:
|
||||||
logger.info(
|
logger.info(
|
||||||
f"property={pid} using stored lodged EPC (refetch_epc=False)"
|
f"property={pid} using stored lodged EPC (refetch_epc=False)"
|
||||||
|
|
@ -555,6 +559,7 @@ def handler(
|
||||||
)
|
)
|
||||||
overrides = overlays_from(overrides_reader.overrides_for(pid))
|
overrides = overlays_from(overrides_reader.overrides_for(pid))
|
||||||
predicted_epc: Optional[EpcPropertyData] = None
|
predicted_epc: Optional[EpcPropertyData] = None
|
||||||
|
predicted_epc_is_new = False
|
||||||
|
|
||||||
if epc is not None:
|
if epc is not None:
|
||||||
logger.info(f"property={pid} lodged EPC found")
|
logger.info(f"property={pid} lodged EPC found")
|
||||||
|
|
@ -588,6 +593,7 @@ def handler(
|
||||||
broaden=_broaden,
|
broaden=_broaden,
|
||||||
predictor=predictor,
|
predictor=predictor,
|
||||||
)
|
)
|
||||||
|
predicted_epc_is_new = True
|
||||||
effective_epc = Property(
|
effective_epc = Property(
|
||||||
identity=PropertyIdentity(
|
identity=PropertyIdentity(
|
||||||
portfolio_id=portfolio_id,
|
portfolio_id=portfolio_id,
|
||||||
|
|
@ -649,8 +655,8 @@ def handler(
|
||||||
|
|
||||||
# Queue this Property's writes rather than committing now — the
|
# Queue this Property's writes rather than committing now — the
|
||||||
# whole batch is persisted in one Unit of Work after the loop
|
# whole batch is persisted in one Unit of Work after the loop
|
||||||
# (see _flush_writes). The EPC is saved in its lodged or predicted
|
# (see _flush_writes). The *_is_new flags gate EPC saves so that
|
||||||
# slot (ADR-0031) at flush time depending on which is set here.
|
# EPCs read from DB unchanged are not re-written.
|
||||||
accumulated.append(
|
accumulated.append(
|
||||||
_PropertyWrite(
|
_PropertyWrite(
|
||||||
property_id=pid,
|
property_id=pid,
|
||||||
|
|
@ -659,7 +665,9 @@ def handler(
|
||||||
scenario_id=scenario_id,
|
scenario_id=scenario_id,
|
||||||
is_default=scenario.is_default,
|
is_default=scenario.is_default,
|
||||||
lodged_epc=epc,
|
lodged_epc=epc,
|
||||||
|
lodged_epc_is_new=lodged_epc_is_new,
|
||||||
predicted_epc=predicted_epc,
|
predicted_epc=predicted_epc,
|
||||||
|
predicted_epc_is_new=predicted_epc_is_new,
|
||||||
spatial=spatial,
|
spatial=spatial,
|
||||||
solar=solar_write,
|
solar=solar_write,
|
||||||
plan=plan,
|
plan=plan,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue