fix(sql): emiss backfill period_type='quarter' to match scraper (#1606 review)
Some checks failed
CI / changes (push) Successful in 9s
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / openapi-codegen-check (push) Failing after 1m37s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Failing after 1m35s
CI / backend-tests (push) Failing after 8m53s
CI / backend-tests (pull_request) Failing after 8m41s

This commit is contained in:
bot-backend 2026-06-17 21:45:12 +03:00
parent 5170107405
commit 2659600374

View file

@ -13,9 +13,11 @@
-- 1. Добавляет колонку period_type TEXT NOT NULL DEFAULT 'unknown'.
-- Все существующие строки (CBR, rosstat open-data, domrf) получают 'unknown' —
-- это корректно: у них нет sub-period granularity (они уже различаются по obs_date).
-- 2. Бэкфилл: строки source='emiss' обновляем до 'quarterly' (единственный
-- 2. Бэкфилл: строки source='emiss' обновляем до 'quarter' (единственный
-- активный ЕМИСС-индикатор — income_per_capita, он квартальный; годовых EMISS-
-- строк ещё нет в таблице до этой миграции).
-- строк ещё нет в таблице до этой миграции). Значение ДОЛЖНО совпадать с тем,
-- что пишет UPSERT_EMISS_SQL (_emiss_period_granularity → 'quarter'/'year'/'month',
-- короткая форма), иначе ON CONFLICT не сматчит → дубли при следующем скрейпе.
-- 3. Пересоздаёт PRIMARY KEY: старый (indicator_type, region, obs_date) → новый
-- (indicator_type, region, obs_date, period_type).
-- 4. Пересоздаёт сопутствующий индекс idx_macro_type_region_date с тем же составом
@ -38,11 +40,15 @@ BEGIN;
ALTER TABLE macro_indicator
ADD COLUMN IF NOT EXISTS period_type TEXT NOT NULL DEFAULT 'unknown';
-- ── 2. Бэкфилл ЕМИСС-строк → 'quarterly' ────────────────────────────────────────────
-- Все существующие ЕМИСС-строки — quarterly (income_per_capita). Если появятся 'year'-
-- строки (будущие индикаторы) — они придут с корректным period_type из нового скрейпера.
-- ── 2. Бэкфилл ЕМИСС-строк → 'quarter' ────────────────────────────────────────────
-- Все существующие ЕМИСС-строки — квартальные (income_per_capita). Значение 'quarter'
-- (короткая форма) обязано совпадать с UPSERT_EMISS_SQL, который параметризует
-- period_type из _emiss_period_granularity ('quarter'/'year'/'month'). Иначе после
-- деплоя следующий скрейп вставит 'quarter'-строки, не матчащие 'quarterly' на
-- ON CONFLICT → дубли для каждого квартального наблюдения. Если появятся 'year'-строки
-- (будущие индикаторы) — придут с корректным period_type из скрейпера.
UPDATE macro_indicator
SET period_type = 'quarterly'
SET period_type = 'quarter'
WHERE source = 'emiss'
AND period_type = 'unknown';
@ -60,16 +66,16 @@ EXCEPTION
END;
$$;
-- Новый PK включает period_type. Если уже существует с правильным составом
-- ADD CONSTRAINT бросит duplicate_table (конвенция Pg: PK → unique index), ловим.
-- Новый PK включает period_type. Если constraint с этим именем уже существует —
-- ADD CONSTRAINT бросит duplicate_object (42710, дубль имени constraint), ловим.
DO $$
BEGIN
ALTER TABLE macro_indicator
ADD CONSTRAINT macro_indicator_pkey
PRIMARY KEY (indicator_type, region, obs_date, period_type);
EXCEPTION
WHEN duplicate_table THEN
NULL; -- PK уже создан (повторный прогон)
WHEN duplicate_object THEN
NULL; -- constraint с таким именем уже создан (повторный прогон)
WHEN invalid_table_definition THEN
NULL; -- уже существует тот же constraint
END;