"""scene_tags (tag_id, scene_id) index — tag-filtered scene lists

Revision ID: 0020_scene_tags_tag_id_index
Revises: 0019_taxonomy_scene_counts
Create Date: 2026-06-02

Perf fix (2026-06-02): `/scenes?tags=<slug>` był ~6s. scene_tags PK to
(scene_id, tag_id) — wiodąca kolumna scene_id, więc lookup "sceny z tagiem X"
(tag_id → scene_id) nie miał indeksu i robił Parallel Seq Scan po 2.8M scene_tags,
materializował wszystkie pasujące sceny i sortował. Indeks (tag_id, scene_id)
pozwala planerowi znaleźć sceny danego tagu po indeksie (i z literalnym LIMIT —
patrz scenes.py — iść index-walk + early-stop zamiast gather-all+sort).
"""
from collections.abc import Sequence

from alembic import op

revision: str = "0020_scene_tags_tag_id_index"
down_revision: str | None = "0019_taxonomy_scene_counts"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
    op.create_index(
        "ix_scene_tags_tag_id_scene_id",
        "scene_tags",
        ["tag_id", "scene_id"],
    )


def downgrade() -> None:
    op.drop_index("ix_scene_tags_tag_id_scene_id", table_name="scene_tags")
