"""add performance indexes for CalculatedMetrics and AttentionFeaturesDaily Revision ID: b3c4d5e6f7a8 Revises: a1b2c3d4e5f6 Create Date: 2026-03-19 Adds standalone indexes that were missing from the initial schema: - calculated_metrics.calculation_date (date-only range queries) - calculated_metrics.period_date (period-based lookups) - attention_features_daily.ticker (ticker-only scans) """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op revision: str = "b3c4d5e6f7a8" down_revision: Union[str, Sequence[str], None] = "a1b2c3d4e5f6" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() # CalculatedMetrics — standalone date indexes _indexes = conn.dialect.get_indexes(conn, "calculated_metrics") existing = {idx["name"] for idx in _indexes} if "idx_metrics_calculation_date" not in existing: op.create_index( "idx_metrics_calculation_date", "calculated_metrics", ["calculation_date"], ) if "idx_metrics_period_date" not in existing: op.create_index( "idx_metrics_period_date", "calculated_metrics", ["period_date"], ) # AttentionFeaturesDaily — standalone ticker index _attn_indexes = conn.dialect.get_indexes(conn, "attention_features_daily") existing_attn = {idx["name"] for idx in _attn_indexes} if "idx_attention_features_daily_ticker" not in existing_attn: op.create_index( "idx_attention_features_daily_ticker", "attention_features_daily", ["ticker"], ) def downgrade() -> None: op.drop_index("idx_metrics_calculation_date", table_name="calculated_metrics") op.drop_index("idx_metrics_period_date", table_name="calculated_metrics") op.drop_index("idx_attention_features_daily_ticker", table_name="attention_features_daily")