-- 159_houses_fias_idx.sql
-- Индекс под Tier 0.5 fias_exact матчинга домов (feat/tradein-fias-tier-matching).
--
-- WHY:
--   houses.house_fias_id (ГАР OBJECTGUID, migration 070) теперь заполнен у ~5.1k
--   из 11.8k домов (DaData backfill 2026-07-02). Матчинг-каскад получил новый
--   tier `fias_exact` (services/matching/houses.py) с предикатом
--   `lower(house_fias_id) = lower(:fias)`. Без функционального индекса каждый
--   estimate/scrape делал бы seq-scan по houses.
--
-- SCOPE:
--   Только создание partial functional index. Данные не трогаются.
--
-- IDEMPOTENCY / SAFETY:
--   - BEGIN/COMMIT одной транзакцией.
--   - CREATE INDEX IF NOT EXISTS → повторный прогон no-op (auto-apply strict).
--   - Partial (WHERE house_fias_id IS NOT NULL) — не индексируем ~6.7k NULL-строк.
--   - lower(...) выражение соответствует case-insensitive предикату матчера.

BEGIN;

CREATE INDEX IF NOT EXISTS houses_fias_lower_idx
    ON houses (lower(house_fias_id))
    WHERE house_fias_id IS NOT NULL;

COMMIT;
