feat(sql): ird_overlays durable overlay store for ИРД geometry (#1067) #1078

Merged
bot-reviewer merged 1 commit from feat/ird-overlays-table into main 2026-06-06 18:08:40 +00:00
Owner

Что

Миграция data/sql/132_ird_overlays.sql — долговременное хранилище геометрии ИРД-ограничений участка (ЗОУИТ / ПЗЗ-границы / ОКН / ООПТ-леса-вода), снятых из НСПД WMS GetFeatureInfo по кварталам ЕКБ. Фундамент harvest-движка (#1067 B5) + read-side parcel_ird_overlaps (D9).

Дизайн (по разведке 2026-06-06 — vault research/NSPD_IRD_Layers_Automation_Recon_Jun06)

НСПД отдаёт по фиче только геометрию + reg_numb_border + category/subcategory (ни ВРИ, ни типа, ни имени). Поэтому:

  • geom geometry(Geometry, 4326) + GIST — площадные зоны (Polygon/MultiPolygon) и линейные (875835 береговые). Главный read-path: ST_Intersects(parcel.geom, ird.geom) в analyze.
  • Дедуп/UPSERT-ключ uq_ird_overlays_feature (source_layer_id, geom_data_id)geom_data_id стабильный id геометрии НСПД (есть во всех ответах; reg_numb_border не гарантирован → не ключ).
  • layer_kind — наш читаемый бакет (ключ LAYERS), т.к. НСПД текстового типа не даёт.
  • content_ (zone_index, zone_type_name, content, content_source, content_fetched_at) — NULLABLE*: дорезолвятся ОТДЕЛЬНО из ЕКБ-геопортала ИСОГД / ЕГРН (#1067 C8/D9). Геометрия живёт независимо; re-harvest не трёт content. Partial-index idx_ird_overlays_content_pending (content_fetched_at IS NULL) — очередь резолва.

Идемпотентность / deploy

CREATE TABLE/INDEX IF NOT EXISTS + guarded DO-блок для UNIQUE (pg_constraint, прецедент м.40/125). Auto-apply через _schema_migrations (deploy.yml). Строк не вставляет.

Validation

Прогнано на prod-PostGIS 3.4 (gendesign-postgres-1) в rollback-транзакции (COMMIT→ROLLBACK, прод не изменён): BEGIN → CREATE TABLE → 6×COMMENT → DO → 5×CREATE INDEX → ROLLBACK, без ошибок.

Refs #1067 (ИРД foundation B3). Next: B5 harvest-воркер UPSERT-ит сюда; C8/D9 заполняют content_*.

## Что Миграция `data/sql/132_ird_overlays.sql` — долговременное хранилище **геометрии** ИРД-ограничений участка (ЗОУИТ / ПЗЗ-границы / ОКН / ООПТ-леса-вода), снятых из НСПД WMS GetFeatureInfo по кварталам ЕКБ. Фундамент harvest-движка (#1067 B5) + read-side `parcel_ird_overlaps` (D9). ## Дизайн (по разведке 2026-06-06 — vault `research/NSPD_IRD_Layers_Automation_Recon_Jun06`) НСПД отдаёт по фиче **только геометрию + reg_numb_border + category/subcategory** (ни ВРИ, ни типа, ни имени). Поэтому: - `geom geometry(Geometry, 4326)` + GIST — площадные зоны (Polygon/MultiPolygon) **и** линейные (875835 береговые). Главный read-path: `ST_Intersects(parcel.geom, ird.geom)` в analyze. - Дедуп/UPSERT-ключ `uq_ird_overlays_feature (source_layer_id, geom_data_id)` — `geom_data_id` стабильный id геометрии НСПД (есть во всех ответах; `reg_numb_border` не гарантирован → не ключ). - `layer_kind` — наш читаемый бакет (ключ `LAYERS`), т.к. НСПД текстового типа не даёт. - **content_* (`zone_index`, `zone_type_name`, `content`, `content_source`, `content_fetched_at`) — NULLABLE**: дорезолвятся ОТДЕЛЬНО из ЕКБ-геопортала ИСОГД / ЕГРН (#1067 C8/D9). Геометрия живёт независимо; re-harvest не трёт content. Partial-index `idx_ird_overlays_content_pending` (`content_fetched_at IS NULL`) — очередь резолва. ## Идемпотентность / deploy `CREATE TABLE/INDEX IF NOT EXISTS` + guarded `DO`-блок для UNIQUE (`pg_constraint`, прецедент м.40/125). Auto-apply через `_schema_migrations` (deploy.yml). Строк не вставляет. ## Validation Прогнано на **prod-PostGIS 3.4** (`gendesign-postgres-1`) в **rollback-транзакции** (COMMIT→ROLLBACK, прод не изменён): `BEGIN → CREATE TABLE → 6×COMMENT → DO → 5×CREATE INDEX → ROLLBACK`, без ошибок. Refs #1067 (ИРД foundation B3). Next: B5 harvest-воркер UPSERT-ит сюда; C8/D9 заполняют content_*.
lekss361 added 1 commit 2026-06-06 18:01:36 +00:00
feat(sql): ird_overlays durable overlay store for ИРД geometry (#1067)
All checks were successful
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 6s
CI / backend-tests (push) Successful in 5m48s
CI / backend-tests (pull_request) Successful in 5m44s
2d638a11b1
Долговременное хранилище геометрии ИРД-ограничений участка, снятых из НСПД WMS
по кварталам ЕКБ. 1 строка = 1 НСПД-фича; дедуп (source_layer_id, geom_data_id);
geom geometry(Geometry,4326)+GIST (площадные зоны + линейные береговые); content_*
(zone_index/тип/регламент) nullable — дорезолвятся из ЕКБ-геопортала/ЕГРН (C8/D9).
Idempotent (IF NOT EXISTS + guarded DO для UNIQUE), auto-apply через _schema_migrations.
Validated на prod-PostGIS 3.4 в rollback-tx (без коммита).

Refs #1067 (ИРД foundation B3).
lekss361 added the
status/review
label 2026-06-06 18:01:57 +00:00
bot-reviewer reviewed 2026-06-06 18:08:31 +00:00
bot-reviewer left a comment
Collaborator

APPROVE

DDL-миграция 132_ird_overlays.sql корректна и идемпотентна:

  • CREATE TABLE/INDEX IF NOT EXISTS ×6 + guarded DO (pg_constraint) для UNIQUE — двойной apply чист.
  • geometry(Geometry, 4326) + GIST — верный выбор под mixed Polygon/LineString (875835 береговые). Partial-индексы (reg_numb_border/zone_index/content_fetched_at IS NULL) обоснованы query-паттернами C8/D9.
  • BEGIN/COMMIT обёртка; CHECK geom_data_id > 0 ловит мусор harvest'а на write.
  • Номер 132 без collision (grep обеих веток); 0 VIEW-deps; пустая таблица, 0 изменений кода.
  • Прогнано на prod-PostGIS 3.4 в rollback-txn без ошибок (DDL валиден против реального движка).

Минор (advisory, не блок): DO-guard WHERE conname='uq_ird_overlays_feature' без connamespace/conrelid фильтра — теоретический false-positive при одноимённом constraint в другой схеме; в этой БД только public, риск нулевой, паттерн консистентен с м.40/125. В очередь не выношу.

Verify-gap (честно): прямую to_regclass('public.ird_overlays') IS NULL подтвердить не смог — postgres-gendesign MCP не поднят в reviewer-окне (нет SSH-туннеля), Actions-run API → 404, SSH в прод → denied. Полагаюсь на prod-rollback-валидацию PR + идемпотентные guards. Миграции применяются ДО compose up -d, поэтому при падении SQL деплой halt'ится (exit 1) и публичный /health останется зелёным на старой версии — для DDL-PR это не индикатор. Финальное подтверждение «таблица создана» — за postgres-capable окном (qa/human) после деплоя.

Merge.

<!-- gendesign-review-bot: sha=2d638a1 verdict=approve --> ✅ **APPROVE** DDL-миграция `132_ird_overlays.sql` корректна и идемпотентна: - `CREATE TABLE/INDEX IF NOT EXISTS` ×6 + guarded `DO` (pg_constraint) для UNIQUE — двойной apply чист. - `geometry(Geometry, 4326)` + GIST — верный выбор под mixed Polygon/LineString (875835 береговые). Partial-индексы (`reg_numb_border`/`zone_index`/`content_fetched_at IS NULL`) обоснованы query-паттернами C8/D9. - `BEGIN/COMMIT` обёртка; CHECK `geom_data_id > 0` ловит мусор harvest'а на write. - Номер 132 без collision (grep обеих веток); 0 VIEW-deps; пустая таблица, 0 изменений кода. - Прогнано на prod-PostGIS 3.4 в rollback-txn без ошибок (DDL валиден против реального движка). **Минор (advisory, не блок):** DO-guard `WHERE conname='uq_ird_overlays_feature'` без `connamespace`/`conrelid` фильтра — теоретический false-positive при одноимённом constraint в другой схеме; в этой БД только `public`, риск нулевой, паттерн консистентен с м.40/125. В очередь не выношу. **Verify-gap (честно):** прямую `to_regclass('public.ird_overlays') IS NULL` подтвердить не смог — postgres-gendesign MCP не поднят в reviewer-окне (нет SSH-туннеля), Actions-run API → 404, SSH в прод → denied. Полагаюсь на prod-rollback-валидацию PR + идемпотентные guards. Миграции применяются ДО `compose up -d`, поэтому при падении SQL деплой halt'ится (exit 1) и публичный `/health` останется зелёным на старой версии — для DDL-PR это не индикатор. Финальное подтверждение «таблица создана» — за postgres-capable окном (qa/human) после деплоя. Merge.
bot-reviewer merged commit 3120c902c6 into main 2026-06-06 18:08:40 +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#1078
No description provided.