feat(sf): прогрев zone_regulation_cache по терзонам ЕКБ (#1059/C8b) #1106

Merged
bot-reviewer merged 1 commit from feat/1059-zone-regulation-refresh into main 2026-06-06 21:04:53 +00:00
Owner

Дополняет C8b (#1099): проактивно наполняет zone_regulation_cache, чтобы analyze отдавал ird.zone_regulation из кэша (быстро), без live-urbanCard в hot-пути.

Проблема

zone_regulation_cache (м.133) наполняется лениво — первый запрос участка в незакэшированной зоне платит за live-urbanCard геопортала. Кэш сейчас пуст.

Решение

  • backend/app/workers/tasks/zone_regulation_refresh.py — Celery refresh_zone_regulations: WFS-перечисление всех терзон ЕКБ (territorial_zone) → дедуп по urban_index → репрезентативная точка зоны (shapely.representative_point, гарантированно внутри полигона) → zone_regulation_at (urbanCard) → upsert_zone_regulation.
    • Дедуп: регламент одинаков для всех полигонов зоны → резолвим каждый индекс один раз (~100 зон ЕКБ).
    • Per-zone try/except — сбой одной зоны не валит прогон.
  • celery_app.py include + beat_schedule.py zone-regulation-refresh-monthly (1-е число 06:30 МСК, после planning).

Валидация

  • pytest test_zone_regulation_refresh.py4 passed (дедуп по индексу, skip пустых/битых геометрий, representative_point внутри полигона).
  • ruff clean; beat: zone-regulation-refresh-monthly зарегистрирован.
  • Без миграции (использует zone_regulation_cache м.133). Зависит от TLS-фикса #1103 (merged).

Scope

Self-contained: НЕ трогает parcels.py. Закрывает C8b-пробел «кэш пуст» → #1059 заработает из кэша при enable_ird_analyze=true.

Дополняет C8b (#1099): проактивно наполняет `zone_regulation_cache`, чтобы analyze отдавал `ird.zone_regulation` из кэша (быстро), без live-urbanCard в hot-пути. ## Проблема `zone_regulation_cache` (м.133) наполняется лениво — первый запрос участка в незакэшированной зоне платит за live-`urbanCard` геопортала. Кэш сейчас пуст. ## Решение - **`backend/app/workers/tasks/zone_regulation_refresh.py`** — Celery `refresh_zone_regulations`: WFS-перечисление всех терзон ЕКБ (`territorial_zone`) → дедуп по `urban_index` → репрезентативная точка зоны (`shapely.representative_point`, гарантированно внутри полигона) → `zone_regulation_at` (urbanCard) → `upsert_zone_regulation`. - Дедуп: регламент одинаков для всех полигонов зоны → резолвим каждый индекс один раз (~100 зон ЕКБ). - Per-zone try/except — сбой одной зоны не валит прогон. - **`celery_app.py`** include + **`beat_schedule.py`** `zone-regulation-refresh-monthly` (1-е число 06:30 МСК, после planning). ## Валидация - `pytest test_zone_regulation_refresh.py` → **4 passed** (дедуп по индексу, skip пустых/битых геометрий, representative_point внутри полигона). - `ruff` clean; beat: `zone-regulation-refresh-monthly` зарегистрирован. - Без миграции (использует `zone_regulation_cache` м.133). Зависит от TLS-фикса #1103 (merged). ## Scope Self-contained: НЕ трогает `parcels.py`. Закрывает C8b-пробел «кэш пуст» → #1059 заработает из кэша при `enable_ird_analyze=true`.
lekss361 added 1 commit 2026-06-06 21:00:20 +00:00
feat(sf): прогрев zone_regulation_cache по терзонам ЕКБ (#1059/C8b)
All checks were successful
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 5s
CI / backend-tests (push) Successful in 5m49s
CI / backend-tests (pull_request) Successful in 5m48s
99ca728004
lekss361 added the
GG-форсайт
scope/backend
site-finder
status/review
labels 2026-06-06 21:00:25 +00:00
bot-reviewer reviewed 2026-06-06 21:04:43 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — прогрев zone_regulation_cache, прямо закрывает latency-пункт #1102.

  • Без миграции (использует м.133 #1099) → нет DDL-deploy-риска. Не трогает parcels.py, не hot-path.
  • shapely.representative_point — гарантированно внутри полигона (vs centroid для вогнутых), defensive try/except → None на битой геометрии. Дедуп по urban_index (set seen, ~100 зон один раз).
  • Per-zone try/except (сбой зоны не валит прогон); upsert_zone_regulation(db, reg) is not None → счётчик (контракт #1099); commit-once + db.close finally.
  • beat 30 6 1 (1-е 06:30) без коллизий (planning 06:00). celery include корректен. imports резолвятся (shapely стека + #1083/#1099 merged).
  • 4 теста non-vacuous (дедуп, skip blank/bad-geom, representative_point внутри, none-on-bad). Зависит от merged #1103.

Архитектурно выносит ~100 urbanCard-резолвов с hot-пути analyze в monthly-прогрев → снимает worst-case latency из #1102 (cache-first после прогона).

Merge → deploy-verify (background worker, flag-независим → /health-green достаточно).

<!-- gendesign-review-bot: sha=99ca728 verdict=approve --> ✅ **APPROVE** — прогрев zone_regulation_cache, прямо закрывает latency-пункт #1102. - **Без миграции** (использует м.133 #1099) → нет DDL-deploy-риска. Не трогает parcels.py, не hot-path. - `shapely.representative_point` — гарантированно внутри полигона (vs centroid для вогнутых), defensive try/except → None на битой геометрии. Дедуп по `urban_index` (set seen, ~100 зон один раз). - Per-zone try/except (сбой зоны не валит прогон); `upsert_zone_regulation(db, reg) is not None` → счётчик (контракт #1099); commit-once + db.close finally. - beat `30 6 1` (1-е 06:30) без коллизий (planning 06:00). celery include корректен. imports резолвятся (shapely стека + #1083/#1099 merged). - 4 теста non-vacuous (дедуп, skip blank/bad-geom, representative_point внутри, none-on-bad). Зависит от merged #1103. **Архитектурно** выносит ~100 urbanCard-резолвов с hot-пути analyze в monthly-прогрев → снимает worst-case latency из #1102 (cache-first после прогона). Merge → deploy-verify (background worker, flag-независим → /health-green достаточно).
bot-reviewer merged commit dee7d64ac8 into main 2026-06-06 21:04:53 +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#1106
No description provided.