-- 272_houses_region_code.sql -- #3051 п.4: region_code у houses — вывод, а не выдумка. -- -- Правило вывода на бэкфилле: регион присваивается ТОЛЬКО дому, чья геометрия -- лежит в генеральном bbox региона 66 (вся сегодняшняя база — екатеринбургская, -- региона-77 сбора не существует). Всё прочее — NULL, то есть КАРАНТИН: -- * 620 домов без geom — регион невыводим до гео-обогащения; -- * ~20 «чужаков» — ЕКБ-адреса с испорченным геокодом («Вильгельма де -- Геннина» на Байкале, «Учителей» в Таллине; замер 27.08) — присвоить им -- регион по координатам значило бы узаконить порчу; -- * 3 дома с координатами в bbox Москвы — ТОЖЕ порченые ЕКБ («Крауля, гп 1», -- «Академика Ландау») — потому 77 на бэкфилле не присваивается ВООБЩЕ. -- -- NOT NULL из постановки задачи НЕ ставится этой миграцией: карантин должен -- сначала опустеть (гео-обогащение 620 + починка 23 порченых) — иначе -- ограничение заставило бы выдумывать значения. Ставится отдельной миграцией -- по факту пустого карантина. -- -- bbox 66 — байт-в-байт bbox_region из app/services/regions.py (реестр #3051); -- синхронизацию значений держит tests/test_3051_houses_region_code.py. -- Идемпотентно: повторный прогон обновит 0 строк. BEGIN; SET LOCAL lock_timeout = '5s'; ALTER TABLE houses ADD COLUMN IF NOT EXISTS region_code smallint; COMMENT ON COLUMN houses.region_code IS '#3051: регион дома (66=Свердловская, 77=Москва). NULL = карантин: регион ' 'невыводим (нет geom / координаты противоречат происхождению). Источник ' 'правил — app/services/regions.py.'; UPDATE houses SET region_code = 66 WHERE region_code IS NULL AND geom IS NOT NULL AND ST_Y(geom) BETWEEN 55.8 AND 62.2 AND ST_X(geom) BETWEEN 56.7 AND 66.6; COMMIT;