Fix comparison pipeline event and transaction handling

This commit is contained in:
“Naeel”
2026-08-27 11:23:14 +03:00
parent e5c7c88073
commit 811be85efe
6 changed files with 71 additions and 28 deletions
+30 -15
View File
@@ -1,6 +1,6 @@
"""spec_events — event sourcing: apply ops, reset contract."""
import json, uuid
from db.connection import query, execute, get_conn
from db.connection import query, execute, get_conn, transaction
def reset(contract_id):
@@ -27,9 +27,15 @@ def get_next_seq(contract_id):
def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_response):
"""Apply ADD/UPDATE/DELETE ops. Returns summary dict."""
with transaction():
return _apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_response)
def _apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_response):
added = 0
updated = 0
deleted = 0
unresolved = 0
seq = get_next_seq(contract_id)
for op in ops:
@@ -42,6 +48,7 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r
# ADD without name → UNRESOLVED
_log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, "ADD with empty name")
seq += 1
unresolved += 1
continue
name_hash = _hash(name, nr.get("date_start"))
execute(
@@ -65,6 +72,7 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r
if not th:
_log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, "UPDATE with empty target_hash")
seq += 1
unresolved += 1
continue
execute(
"""INSERT INTO spec_events (id, contract_id, supplement_id, seq, action, target_hash,
@@ -86,6 +94,7 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r
if not th:
_log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, "DELETE with empty target_hash")
seq += 1
unresolved += 1
continue
execute(
"""INSERT INTO spec_events (id, contract_id, supplement_id, seq, action, target_hash,
@@ -104,27 +113,19 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r
elif action == "UNRESOLVED":
# Log but don't apply
execute(
"""INSERT INTO spec_events (id, contract_id, supplement_id, seq, action, target_hash,
new_values, comment, status, prompt_version, source_document_id, raw_llm_response)
VALUES (%s, %s, %s, %s, 'UNRESOLVED', %s, %s, %s, 'unresolved', %s, %s, %s)""",
(
str(uuid.uuid4()), contract_id, supplement_id, seq,
op.get("target_hash", ""),
json.dumps(op.get("new_values", {}), ensure_ascii=False),
op.get("reason", op.get("comment", "")),
prompt_id, document_id,
json.dumps(raw_llm_response, ensure_ascii=False),
),
)
_log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response,
op.get("reason", op.get("comment", "")))
seq += 1
unresolved += 1
else:
# Unknown action — log as UNRESOLVED
_log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response,
f"unknown action: {action}")
seq += 1
unresolved += 1
return {"added": added, "updated": updated, "deleted": deleted}
return {"added": added, "updated": updated, "deleted": deleted, "unresolved": unresolved}
def _log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, reason):
@@ -187,6 +188,20 @@ def _update_spec_current(contract_id, name_hash, new_values):
sets.append(f"{field} = %s")
params.append(new_values[field])
if sets:
if "name" in new_values or "date_start" in new_values:
updated_name = new_values.get("name")
updated_date = new_values.get("date_start")
if updated_name is None or updated_date is None:
current = query(
"SELECT name, date_start FROM spec_current WHERE contract_id = %s AND name_hash = %s",
(contract_id, name_hash),
)
if current:
updated_name = updated_name if updated_name is not None else current[0]["name"]
updated_date = updated_date if updated_date is not None else current[0]["date_start"]
if updated_name is not None:
sets.append("name_hash = %s")
params.append(_hash(updated_name, updated_date))
sets.append("updated_at = datetime('now')")
params.extend([contract_id, name_hash])
execute(