-- Индексы под горячий путь recommend_mix (analytics_queries.py:recommend_mix).
--
-- Без них типичный POST /analytics/recommend/mix делает 3-5 seq-scan'ов на
-- 5М-строчных таблицах и тратит 1-2 сек. Цель — <500мс.
--
-- Идемпотентно через CREATE INDEX IF NOT EXISTS.
-- CONCURRENTLY НЕ используется (psql сессия с несколькими операциями) —
-- если будет блок-issue в проде, применять каждый CREATE отдельно.

-- 1) sale_graph: JOIN obj_id × type='apartments' × report_month
-- Используется в _elasticity_coef и _elasticity_per_bucket_coef.
-- Текущие индексы: (obj_id, snapshot_date), (report_month, type) — но не
-- покрывают composite seek по obj_id + type + report_month range.
CREATE INDEX IF NOT EXISTS sg_obj_type_month_idx
    ON domrf_kn_sale_graph (obj_id, type, report_month DESC);

-- 2) Active competitors lookup: (district_name, obj_class, site_status)
-- Используется в _active_competitors_count, который вызывается до 3 раз
-- (каскадный fallback district+class → district → region) на каждый запрос.
-- Partial index по site_status='Строящиеся' — это то, что мы реально ищем.
CREATE INDEX IF NOT EXISTS obj_district_class_active_idx
    ON domrf_kn_objects (district_name, obj_class, region_cd)
    WHERE site_status = 'Строящиеся';

-- 3) Per-bucket flats lookup: (obj_id, total_area)
-- Используется в _elasticity_per_bucket_coef для группировки sale_graph
-- по «доминирующему bucket» каждого ЖК. Partial index по area-диапазону
-- который мы реально считаем (15..200 м²).
CREATE INDEX IF NOT EXISTS flats_obj_area_idx
    ON domrf_kn_flats (obj_id, total_area)
    WHERE total_area BETWEEN 15 AND 200;

-- 4) Cadastre baseline: (cost_value, area) — partial для строений
-- с заполненными ценой и площадью. Используется в _district_cadastre_baseline
-- + view v_zk_rosreestr_velocity. Также без этого индекса при PERCENTILE_CONT
-- по cost_value/area делается seq-scan на 10K строк × spatial-join.
CREATE INDEX IF NOT EXISTS buildings_cost_area_idx
    ON cad_buildings (cost_value, area)
    WHERE cost_value IS NOT NULL AND area IS NOT NULL;

-- Комментарии для будущей навигации.
COMMENT ON INDEX sg_obj_type_month_idx IS
    'Hot path: JOIN domrf_kn_sale_graph по obj_id+type для regression в _elasticity_*.';
COMMENT ON INDEX obj_district_class_active_idx IS
    'Hot path: _active_competitors_count + recommend_mix scope queries (Partial: site_status=Строящиеся).';
COMMENT ON INDEX flats_obj_area_idx IS
    'Hot path: per-bucket median total_area для _elasticity_per_bucket_coef.';
COMMENT ON INDEX buildings_cost_area_idx IS
    'Hot path: cadastre median ₽/м² в _district_cadastre_baseline.';
