"""Indeks pod sortowanie scen po dlugosci (najdluzsze / najkrotsze). Jeden indeks (duration_sec, created_at, id) WHERE duration_sec IS NOT NULL obsluguje oba kierunki: skan w przod daje najkrotsze, w tyl najdluzsze. Sceny bez dlugosci sa odfiltrowane w zapytaniu, wiec kolejnosc NULL-i nie gra roli i wystarczy jeden indeks. CONCURRENTLY w autocommit_block, jak w 0027: zwykly CREATE INDEX blokowalby zapisy ingestu na czas budowy (4,1 mln wierszy). Nieudany CONCURRENTLY zostawia indeks INVALID; wtedy DROP INDEX i ponownie. Revision ID: 0035_scenes_duration_idx Revises: 0034_favorite_sites Create Date: 2026-09-14 """ from __future__ import annotations from alembic import op revision = "0035_scenes_duration_idx" down_revision: str | None = "0034_favorite_sites" branch_labels = None depends_on = None def upgrade() -> None: with op.get_context().autocommit_block(): op.execute( "CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_scenes_duration " "ON scenes (duration_sec, created_at, id) WHERE duration_sec IS NOT NULL" ) def downgrade() -> None: with op.get_context().autocommit_block(): op.execute("DROP INDEX CONCURRENTLY IF EXISTS ix_scenes_duration")