Preserve replay across correction chains
This commit is contained in:
@@ -694,16 +694,37 @@ def close_asset_snapshot(basis_date: str = "", source_note: str = "", memo: str
|
||||
except (TypeError, json.JSONDecodeError):
|
||||
stored_fingerprint = {"authority": existing_run["request_fingerprint"], "request": ""}
|
||||
latest_basis_run = conn.execute(
|
||||
"SELECT correction_of_run_id FROM asset_snapshot_runs WHERE basis_date=? ORDER BY rowid DESC LIMIT 1",
|
||||
"SELECT id, correction_of_run_id FROM asset_snapshot_runs WHERE basis_date=? ORDER BY rowid DESC LIMIT 1",
|
||||
(basis,),
|
||||
).fetchone()
|
||||
authority_changed_after_correction = bool(
|
||||
latest_basis_run
|
||||
and latest_basis_run["correction_of_run_id"] == existing_run["id"]
|
||||
run_in_correction_chain = False
|
||||
seen_run_ids: set[str] = set()
|
||||
chain_run = latest_basis_run
|
||||
while chain_run and chain_run["id"] not in seen_run_ids:
|
||||
if chain_run["id"] == existing_run["id"]:
|
||||
run_in_correction_chain = True
|
||||
break
|
||||
seen_run_ids.add(chain_run["id"])
|
||||
parent_id = chain_run["correction_of_run_id"]
|
||||
chain_run = (
|
||||
conn.execute(
|
||||
"SELECT id, correction_of_run_id FROM asset_snapshot_runs WHERE id=?",
|
||||
(parent_id,),
|
||||
).fetchone()
|
||||
if parent_id
|
||||
else None
|
||||
)
|
||||
immutable_replay_run = bool(
|
||||
run_in_correction_chain
|
||||
and latest_basis_run
|
||||
and (
|
||||
latest_basis_run["id"] != existing_run["id"]
|
||||
or existing_run["correction_of_run_id"]
|
||||
)
|
||||
)
|
||||
if stored_fingerprint.get("request") == request_fingerprint and (
|
||||
stored_fingerprint.get("authority") == authority_fingerprint
|
||||
or authority_changed_after_correction
|
||||
or immutable_replay_run
|
||||
):
|
||||
replay_rows, replay_meta = _snapshot_rows_for_run(conn, existing_run["id"])
|
||||
replay_items = [_public_evidence(item) for item in replay_meta.get("applied_evidence", [])]
|
||||
|
||||
Reference in New Issue
Block a user