Explorer
/tmp/aa045/aa045_enrich.py
← Zurück ↓ Download
"""
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