"""Persist analysis fact hash and summary grounding references. Revision ID: 473 Revises: 472 """ import sqlalchemy as sa from alembic import op revision = "473" down_revision = "472" branch_labels = None depends_on = None def upgrade() -> None: op.add_column( "intelligence_analyses", sa.Column("facts_hash", sa.String(64), nullable=True), ) op.add_column( "intelligence_analyses", sa.Column("summary_fact_refs", sa.JSON(), nullable=True), ) bind = op.get_bind() bind.execute( sa.text( "UPDATE intelligence_analyses a SET facts_hash = (" "SELECT s.facts_hash FROM intelligence_snapshots s " "WHERE s.id = a.snapshot_id) WHERE a.facts_hash IS NULL" ) ) remaining = bind.execute( sa.text("SELECT COUNT(*) FROM intelligence_analyses WHERE facts_hash IS NULL") ).scalar_one() if remaining: raise RuntimeError( f"Cannot ground {remaining} intelligence analysis row(s) to a snapshot" ) op.alter_column( "intelligence_analyses", "facts_hash", existing_type=sa.String(64), nullable=False, ) op.create_index( "ix_intel_analysis_facts_hash", "intelligence_analyses", ["facts_hash"], ) def downgrade() -> None: op.drop_index("ix_intel_analysis_facts_hash", table_name="intelligence_analyses") op.drop_column("intelligence_analyses", "summary_fact_refs") op.drop_column("intelligence_analyses", "facts_hash")