fix(site-finder): склеить разорванный regex в _PLANNING_NO_MATCH_SQL (#1230)
Some checks failed
Deploy / build-frontend (push) Blocked by required conditions
Deploy / deploy (push) Blocked by required conditions
Deploy / changes (push) Successful in 7s
Deploy / build-backend (push) Has been cancelled
Deploy / build-worker (push) Has been cancelled
CI / changes (pull_request) Successful in 7s
CI / changes (push) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (push) Has been skipped
CI / frontend-tests (push) Has been skipped

Литерал regex был разорван переносом строки внутри одной пары '...':
ветки 'Донбасской\\n' и 'Лумумбы\\n' содержали NL+8 пробелов
и никогда не матчили однострочные planning_projects.full_name (PG ~ —
POSIX ARE без (?x)). Geom-only КРТ-fallback молча терял ППТ по этим двум
топонимам.

Patch: вынес паттерн в _KRT_TOPONYM_REGEX через Python adjacent-literal
concat, склеил в SQL через +. Все 17 веток в одной строке.
9 krt_lookup тестов зелёные.

Closes #1230
This commit is contained in:
Light1YT 2026-06-13 12:43:28 +05:00
parent 06c4bb9fd6
commit 0c62d0b0c3

View file

@ -64,6 +64,20 @@ _PLANNING_KRT_SQL = text(
# Вторичный запрос: planning_projects без матча с ekb_krt_sites — geom-only без реквизитов. # Вторичный запрос: planning_projects без матча с ekb_krt_sites — geom-only без реквизитов.
# Запускается только если первый не дал результатов, чтобы не путать пользователя # Запускается только если первый не дал результатов, чтобы не путать пользователя
# двумя overlapping-источниками. # двумя overlapping-источниками.
#
# Regex-топонимы для geom-only КРТ-fallback — собран как ОДИН непрерывный паттерн.
# Раньше literal был разорван переносом строки внутри ОДНОЙ пары '...' внутри SQL,
# и ветки 'Донбасской\n ' / 'Лумумбы\n ' содержали NL+8 пробелов отступа,
# никогда не матчили однострочные full_name (PG `~` — POSIX ARE без (?x)) — #1230.
# Python склеивает соседние строковые литералы на этапе парсинга, поэтому regex попадает
# в SQL одной строкой. Не SQL-injection: статическая константа, без user input.
# При добавлении новых топонимов держим строки <100 chars и НЕ ломаем regex переносом.
_KRT_TOPONYM_REGEX = (
"[кК][рР][тТ]|комплексн.*развити|Краснофлотцев|Донбасской|Шефской|Азина"
"|Черкасской|Кварцевой|Летчиков|Вилонова|Лумумбы|Студенческой|Васильева"
"|Гурзуфск|Бакинских|Шадринский|Бабушкина"
)
_PLANNING_NO_MATCH_SQL = text( _PLANNING_NO_MATCH_SQL = text(
""" """
SELECT SELECT
@ -76,9 +90,9 @@ _PLANNING_NO_MATCH_SQL = text(
pp.geom, pp.geom,
ST_GeomFromText(CAST(:parcel_wkt AS text), 4326) ST_GeomFromText(CAST(:parcel_wkt AS text), 4326)
) )
AND pp.full_name ~ '[кК][рР][тТ]|комплексн.*развити|Краснофлотцев|Донбасской AND pp.full_name ~ '"""
|Шефской|Азина|Черкасской|Кварцевой|Летчиков|Вилонова|Лумумбы + _KRT_TOPONYM_REGEX
|Студенческой|Васильева|Гурзуфск|Бакинских|Шадринский|Бабушкина' + """'
ORDER BY pp.dmd_actual_year DESC ORDER BY pp.dmd_actual_year DESC
""" """
) )