"""Add performance indexes for hot query paths. Covers: - calendar_events range queries scoped by calendar (dashboard, notifications) - calendar_events starred query (dashboard widget) - calendar_events parent_event_id (recurring series DELETE) - user_sessions lookup (auth middleware, every request) - ntfy_sent purge query (background job, every 60s) Revision ID: 035 Revises: 034 Create Date: 2026-02-27 """ from alembic import op revision = "035" down_revision = "034" branch_labels = None depends_on = None def upgrade() -> None: # Composite index for event range queries scoped by calendar op.create_index( "ix_calendar_events_calendar_start_end", "calendar_events", ["calendar_id", "start_datetime", "end_datetime"], ) # Partial index for starred events dashboard query op.create_index( "ix_calendar_events_calendar_starred", "calendar_events", ["calendar_id", "is_starred"], ) # FK lookup index for recurring children DELETE op.create_index( "ix_calendar_events_parent_id", "calendar_events", ["parent_event_id"], ) # Composite index for session validation (runs on every authenticated request) op.create_index( "ix_user_sessions_lookup", "user_sessions", ["user_id", "revoked", "expires_at"], ) # Index for ntfy_sent purge query (DELETE WHERE sent_at < cutoff) op.create_index( "ix_ntfy_sent_sent_at", "ntfy_sent", ["sent_at"], ) def downgrade() -> None: op.drop_index("ix_ntfy_sent_sent_at", table_name="ntfy_sent") op.drop_index("ix_user_sessions_lookup", table_name="user_sessions") op.drop_index("ix_calendar_events_parent_id", table_name="calendar_events") op.drop_index("ix_calendar_events_calendar_starred", table_name="calendar_events") op.drop_index("ix_calendar_events_calendar_start_end", table_name="calendar_events")