fix(sf): ST_MakeValid genplan geom + backfill 881 invalid polygons (#1156) #1157

Merged
bot-reviewer merged 1 commit from fix/genplan-makevalid-1156 into main 2026-06-07 17:59:05 +00:00
Owner

Closes #1156.

Проблема

Бэктест ИРД-слоя (2026-06-07) нашёл 881/6436 (13.7%) полигонов в ekb_genplan_functional_zone с ST_IsValid=false (self-intersecting rings из геопортального GeoJSON). Битые геометрии могут искажать резолв функц.зоны (#1058) в analyze.

Фикс

  1. genplan_zones_sync.py — geom-выражение обёрнуто в ST_MakeValid(...) → новые/обновляемые фичи всегда валидны.
  2. data/sql/143_genplan_makevalid_backfill.sql — идемпотентный backfill существующих (UPDATE ... SET geom=ST_MakeValid(geom) WHERE NOT ST_IsValid(geom)), авто-применяется через deploy.yml.
  3. Unit-тест: _UPSERT_SQL содержит ST_MakeValid.

Verify после деплоя

SELECT count(*) FILTER (WHERE NOT ST_IsValid(geom)) FROM ekb_genplan_functional_zone;  -- ожидается 0

Review

code-reviewer: APPROVE. Note (не блокер): ST_MakeValid на вырожденных входах может вернуть GeometryCollection, но колонка geometry(Geometry,4326) это принимает и ST_Intersects обрабатывает корректно. Если колонку когда-либо сузят до Polygon — обернуть в ST_CollectionExtract(...,3).

pytest: 8 passed · ruff: clean · migration 143 не коллидит (max=142).

Closes #1156. ## Проблема Бэктест ИРД-слоя (2026-06-07) нашёл **881/6436 (13.7%)** полигонов в `ekb_genplan_functional_zone` с `ST_IsValid=false` (self-intersecting rings из геопортального GeoJSON). Битые геометрии могут искажать резолв функц.зоны (#1058) в analyze. ## Фикс 1. `genplan_zones_sync.py` — geom-выражение обёрнуто в `ST_MakeValid(...)` → новые/обновляемые фичи всегда валидны. 2. `data/sql/143_genplan_makevalid_backfill.sql` — идемпотентный backfill существующих (`UPDATE ... SET geom=ST_MakeValid(geom) WHERE NOT ST_IsValid(geom)`), авто-применяется через deploy.yml. 3. Unit-тест: `_UPSERT_SQL` содержит `ST_MakeValid`. ## Verify после деплоя ```sql SELECT count(*) FILTER (WHERE NOT ST_IsValid(geom)) FROM ekb_genplan_functional_zone; -- ожидается 0 ``` ## Review code-reviewer: ✅ APPROVE. Note (не блокер): ST_MakeValid на вырожденных входах может вернуть GeometryCollection, но колонка `geometry(Geometry,4326)` это принимает и ST_Intersects обрабатывает корректно. Если колонку когда-либо сузят до Polygon — обернуть в `ST_CollectionExtract(...,3)`. pytest: 8 passed · ruff: clean · migration 143 не коллидит (max=142).
lekss361 added 1 commit 2026-06-07 17:56:22 +00:00
fix(sf): ST_MakeValid genplan geom + backfill 881 invalid polygons (#1156)
All checks were successful
CI / changes (push) Successful in 5s
CI / frontend-tests (push) Has been skipped
CI / backend-tests (push) Successful in 6m17s
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Successful in 6m25s
c2bc3b4863
bot-reviewer approved these changes 2026-06-07 17:58:52 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — ST_MakeValid genplan geom + backfill (#1156).

Verified prod (своя проверка, не доверяю встроенному review): ekb_genplan_functional_zone = 6436 строк, 881 с NOT ST_IsValid — точно как заявлено. 143 не в _schema_migrations.

  • 143_genplan_makevalid_backfill.sql: BEGIN/COMMIT, UPDATE … SET geom=ST_MakeValid(geom) WHERE NOT ST_IsValid(geom)идемпотентно (повторный прогон → 0 строк). Auto-apply через deploy. Single-statement UPDATE на 881 строк — атомарно, быстро.
  • genplan_zones_sync._UPSERT_SQL: geom обёрнут в ST_MakeValid(ST_SetSRID(...)) → новые/обновляемые фичи всегда валидны (fix у источника, не только backfill).
  • Колонка geometry(Geometry, 4326) (generic) → принимает любой выход ST_MakeValid (GeometryCollection/MultiPolygon) → caveat из встроенного review неактуален; ST_Intersects обрабатывает. NOT NULL не нарушается (ST_MakeValid → не NULL).
  • Тест проверяет наличие ST_MakeValid в _UPSERT_SQL. 8 passed.

Verify после деплоя: SELECT count(*) FILTER (WHERE NOT ST_IsValid(geom)) FROM ekb_genplan_functional_zone → ожидается 0.

Merging (squash).

<!-- gendesign-review-bot: sha=c2bc3b4 verdict=approve --> ✅ **APPROVE** — ST_MakeValid genplan geom + backfill (#1156). **Verified prod (своя проверка, не доверяю встроенному review):** `ekb_genplan_functional_zone` = 6436 строк, **881 с `NOT ST_IsValid`** — точно как заявлено. `143` не в `_schema_migrations`. - `143_genplan_makevalid_backfill.sql`: BEGIN/COMMIT, `UPDATE … SET geom=ST_MakeValid(geom) WHERE NOT ST_IsValid(geom)` — **идемпотентно** (повторный прогон → 0 строк). Auto-apply через deploy. Single-statement UPDATE на 881 строк — атомарно, быстро. - `genplan_zones_sync._UPSERT_SQL`: geom обёрнут в `ST_MakeValid(ST_SetSRID(...))` → новые/обновляемые фичи всегда валидны (fix у источника, не только backfill). - Колонка `geometry(Geometry, 4326)` (generic) → принимает любой выход ST_MakeValid (GeometryCollection/MultiPolygon) → caveat из встроенного review неактуален; ST_Intersects обрабатывает. NOT NULL не нарушается (ST_MakeValid → не NULL). - Тест проверяет наличие ST_MakeValid в _UPSERT_SQL. 8 passed. Verify после деплоя: `SELECT count(*) FILTER (WHERE NOT ST_IsValid(geom)) FROM ekb_genplan_functional_zone` → ожидается 0. Merging (squash).
bot-reviewer merged commit 3921180d07 into main 2026-06-07 17:59:05 +00:00
bot-reviewer deleted branch fix/genplan-makevalid-1156 2026-06-07 17:59:05 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1157
No description provided.