"""scene backfill flag: exclude bulk catalog imports from "new" Revision ID: 0026_scene_backfill_flag Revises: 0025_source_ranking Create Date: 2026-07-02 Tube'y podają datę importu jako release_date, więc masowy backfill starego katalogu (deep-crawl głębokie strony) udawał świeżość i zawyżał licznik "+N nowych" w ulubionych. `scenes.backfill` oznacza takie sceny (pozostają widoczne, ale nie liczą się jako nowe). Dodatkowo indeks na scene_performers(performer_id) pod zapytanie licznika ulubionych (PK to (scene_id, performer_id), więc filtr po samym performer_id był full scanem). Idempotentne (IF NOT EXISTS): prod dostał kolumnę/indeksy ręcznym ALTER-em zanim ta migracja powstała, a deploy nie odpala alembic; guard chroni przed DuplicateColumn gdyby `alembic upgrade` puszczono na prodzie albo na dumpie z prod. """ from collections.abc import Sequence from alembic import op revision: str = "0026_scene_backfill_flag" down_revision: str | None = "0025_source_ranking" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.execute( "ALTER TABLE scenes ADD COLUMN IF NOT EXISTS backfill boolean NOT NULL DEFAULT false" ) op.execute("CREATE INDEX IF NOT EXISTS ix_scenes_backfill ON scenes (backfill)") op.execute( "CREATE INDEX IF NOT EXISTS ix_scene_performers_performer_id " "ON scene_performers (performer_id)" ) def downgrade() -> None: op.execute("DROP INDEX IF EXISTS ix_scene_performers_performer_id") op.execute("DROP INDEX IF EXISTS ix_scenes_backfill") op.execute("ALTER TABLE scenes DROP COLUMN IF EXISTS backfill")