(low) Несогласованный вывод quarter_cad для 3-сегментного кад. номера: REGEXP_REPLACE vs _quarter_cad #1373

Closed
opened 2026-06-14 18:09:54 +00:00 by bot-backend · 0 comments
Collaborator

Описание

District-query (строка 1458) сопоставляет mv_quarter_price_per_m2 по REGEXP_REPLACE(:cad_num, ':[^:]+$', '') — отрезает последний сегмент. market_price (строки 2385-2386) берёт _quarter_cad = ':'.join(cad_num.split(':')[:3]). Для штатного 4-сегментного ЗУ 66:41:0204016:10 обе формулы дают 66:41:0204016 — ок. Но если в /analyze передан УЖЕ квартал-уровневый 3-сегментный номер 66:41:0204016 (source='cad_quarter' — реальная ветка в geometry UNION), REGEXP_REPLACE отрежет до 66:41 (двух-сегментный, в mv_quarter_price_per_m2 отсутствует → LEFT JOIN NULL → COALESCE откатывается на дистриктный медиан), тогда как _quarter_cad оставит полный 66:41:0204016 и найдёт квартальный медиан. Для одного и того же входа district-блок и market_price берут разные источники медианы.

Корень

Два разных способа деривации квартала из кадастрового номера в одном endpoint: regexp «отрезать последний сегмент» против «первые 3 сегмента». Они расходятся ровно на quarter-level входе.

Evidence

/Users/anton/Птица/gendesign/backend/app/api/v1/parcels.py:1458 и :2385-2386

-- district query (1458):
  LEFT JOIN mv_quarter_price_per_m2 mq
     ON mq.quarter_cad_number = REGEXP_REPLACE(:cad_num, ':[^:]+$', '')
# market_price (2385-2386):
  _cad_parts = cad_num.split(":")
  _quarter_cad = ":".join(_cad_parts[:3]) if len(_cad_parts) >= 3 else cad_num

Suggested fix

Использовать единый способ деривации квартала. Заменить REGEXP_REPLACE на тот же _quarter_cad (передать bound-param :q = ':'.join(parts[:3])) либо в обоих местах применять «первые 3 сегмента», чтобы quarter-level cad обрабатывался одинаково.

Обоснование severity

Low: нет краша, fallback на дистриктный медиан функционально корректен; median_price_per_m2 в district-блоке лишь тихо деградирует до менее точного источника именно тогда, когда у квартала есть более точный медиан. Достижимо в проде через квартальные участки (source='cad_quarter').


week ревью 1 · multi-agent аудит 2026-06-14 · severity=low · category=correctness

Затронутые файлы:

  • /Users/anton/Птица/gendesign/backend/app/api/v1/parcels.py
## Описание District-query (строка 1458) сопоставляет `mv_quarter_price_per_m2` по `REGEXP_REPLACE(:cad_num, ':[^:]+$', '')` — отрезает последний сегмент. `market_price` (строки 2385-2386) берёт `_quarter_cad = ':'.join(cad_num.split(':')[:3])`. Для штатного 4-сегментного ЗУ `66:41:0204016:10` обе формулы дают `66:41:0204016` — ок. Но если в `/analyze` передан УЖЕ квартал-уровневый 3-сегментный номер `66:41:0204016` (`source='cad_quarter'` — реальная ветка в geometry UNION), `REGEXP_REPLACE` отрежет до `66:41` (двух-сегментный, в `mv_quarter_price_per_m2` отсутствует → LEFT JOIN NULL → COALESCE откатывается на дистриктный медиан), тогда как `_quarter_cad` оставит полный `66:41:0204016` и найдёт квартальный медиан. Для одного и того же входа district-блок и `market_price` берут разные источники медианы. ## Корень Два разных способа деривации квартала из кадастрового номера в одном endpoint: regexp «отрезать последний сегмент» против «первые 3 сегмента». Они расходятся ровно на quarter-level входе. ## Evidence `/Users/anton/Птица/gendesign/backend/app/api/v1/parcels.py:1458` и `:2385-2386` ```sql -- district query (1458): LEFT JOIN mv_quarter_price_per_m2 mq ON mq.quarter_cad_number = REGEXP_REPLACE(:cad_num, ':[^:]+$', '') ``` ```python # market_price (2385-2386): _cad_parts = cad_num.split(":") _quarter_cad = ":".join(_cad_parts[:3]) if len(_cad_parts) >= 3 else cad_num ``` ## Suggested fix Использовать единый способ деривации квартала. Заменить `REGEXP_REPLACE` на тот же `_quarter_cad` (передать bound-param `:q = ':'.join(parts[:3])`) либо в обоих местах применять «первые 3 сегмента», чтобы quarter-level cad обрабатывался одинаково. ## Обоснование severity Low: нет краша, fallback на дистриктный медиан функционально корректен; `median_price_per_m2` в district-блоке лишь тихо деградирует до менее точного источника именно тогда, когда у квартала есть более точный медиан. Достижимо в проде через квартальные участки (`source='cad_quarter'`). --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`correctness`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/backend/app/api/v1/parcels.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:09:54 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:54 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#1373
No description provided.