"""
AA-045: Multi-Source-Anreicherung von insert_signal.
Wird von signal_db aufgerufen, nachdem die Basis-Prüfungen (URL/Title/Jaccard)
durchlaufen sind – hier: external_id-Dedup + AA-045-Felder befüllen.
"""
import json
import sqlite3
from datetime import datetime, timezone
def enrich_signal_row(conn: sqlite3.Connection, signal_id: str, data: dict):
"""Befüllt AA-045-Felder eines neu angelegten kanonischen Signals."""
now = datetime.now(timezone.utc).isoformat()
conn.execute("""
UPDATE signals SET
source_platform = COALESCE(NULLIF(?, ''), source_type),
external_id = ?,
observed_at = ?,
published_at = ?,
content_hash = ?,
processing_state = 'neu'
WHERE signal_id = ?
""", (
data.get("source_platform", "") or data.get("source_type", ""),
data.get("external_id", "") or "",
data.get("observed_at", "") or now,
data.get("published_at", "") or "",
data.get("content_hash", "") or "",
signal_id,
))
def find_by_external_id(conn: sqlite3.Connection, platform: str, external_id: str):
"""Dedup über externe ID (z.B. YouTube-Video-ID) plattformweit."""
if not external_id:
return None
row = conn.execute(
"SELECT signal_id FROM signals WHERE external_id = ? AND (source_platform = ? OR ? = '')",
(external_id, platform, platform),
).fetchone()
return row["signal_id"] if row else None
def update_cluster_meta(conn: sqlite3.Connection, cluster_id: str, signal_ids: list,
bonus: float):
"""Schreibt cluster_id + Multi-Source-Bonus auf alle Members."""
now = datetime.now(timezone.utc).isoformat()
for sid in signal_ids:
conn.execute("""
UPDATE signals SET cluster_id = ?,
radar_score = MIN(radar_score + ?, 100.0),
score_breakdown = COALESCE(score_breakdown, '{}')
WHERE signal_id = ?
""", (cluster_id, bonus, sid))
return now