fix(analyze): 500 on NULL-geometry parcels (random-parcel crash) #1033

Merged
bot-backend merged 1 commit from fix/analyze-null-geom-500 into main 2026-06-03 14:50:13 +00:00
Collaborator

Критфикс: 500 на участках с NULL-геометрией (краш «рандомного участка»).

POST /analyze 500-ил (TypeError: float(None)) на ~964 строках cad_parcels_geom, у которых есть meta-строка, но geom IS NULL: резолв возвращал строку (без NULL-фильтра) → geom_wkt=NULL → ST_Centroid(NULL) → NULL lat/lon → float(centroid_row["lat"]) краш (guard if centroid_row проверял наличие строки, не NULL-значения). Любой такой «рандомный участок» → 500.

Фикс: AND geom IS NOT NULL во все 3 geom-резолв запроса → NULL-geom участок идёт в #93 graceful fallback (NSPD-fetch → 202), как отсутствующий в БД; fetch подтянет реальную геометрию. + defensive: centroid проверяет именно ЗНАЧЕНИЕ (не наличие строки) перед float().

Проверено: badformat→400, not-in-DB→202, валидный→200 (цель 66:41:0702048:27 не затронута). 39 analyze/by-bbox тестов зелёные. Refs #944.

**Критфикс: 500 на участках с NULL-геометрией** (краш «рандомного участка»). POST /analyze 500-ил (`TypeError: float(None)`) на ~964 строках cad_parcels_geom, у которых есть meta-строка, но `geom IS NULL`: резолв возвращал строку (без NULL-фильтра) → geom_wkt=NULL → ST_Centroid(NULL) → NULL lat/lon → `float(centroid_row["lat"])` краш (guard `if centroid_row` проверял наличие строки, не NULL-значения). Любой такой «рандомный участок» → 500. **Фикс:** `AND geom IS NOT NULL` во все 3 geom-резолв запроса → NULL-geom участок идёт в #93 graceful fallback (NSPD-fetch → 202), как отсутствующий в БД; fetch подтянет реальную геометрию. + defensive: centroid проверяет именно ЗНАЧЕНИЕ (не наличие строки) перед float(). Проверено: badformat→400, not-in-DB→202, валидный→200 (цель 66:41:0702048:27 не затронута). 39 analyze/by-bbox тестов зелёные. Refs #944.
bot-backend added 1 commit 2026-06-03 14:50:09 +00:00
fix(analyze): 500 on parcels with NULL geometry (random-parcel crash)
All checks were successful
Deploy / changes (push) Successful in 6s
Deploy / build-backend (push) Successful in 1m38s
Deploy / build-worker (push) Successful in 3m12s
Deploy / deploy (push) Successful in 1m6s
Deploy / build-frontend (push) Has been skipped
cdfa4b3ab4
POST /analyze 500'd (TypeError: float(None)) for ~964 cad_parcels_geom rows
that have a meta row but geom IS NULL: the resolution query returned the row
(no NULL filter), geom_wkt became NULL → ST_Centroid(NULL) → NULL lat/lon →
float(centroid_row["lat"]) crashed (the `if centroid_row else` guard checked
row existence, not NULL values). A user entering any such "random parcel" hit
a 500.

Fix:
- Add `AND geom IS NOT NULL` to all three geometry-resolution queries (initial
  UNION, inline-refetch UNION, geom_row WKT subquery) so a NULL-geometry parcel
  is treated as "no usable geometry" → falls into the #93 graceful fallback
  (enqueue NSPD on-demand fetch → 202 polling), exactly like a parcel absent
  from the DB. The fetch then populates real geometry and analyze succeeds.
- Defensive: centroid_lat/lon now check the VALUE is not None (not just row
  existence) before float(), falling back to EKB center.

Verified: badformat→400, not-in-DB→202(fetching), valid parcel→200 unaffected.
39 analyze/by-bbox tests green. Refs #944.
bot-backend merged commit cdfa4b3ab4 into main 2026-06-03 14:50:13 +00:00
bot-backend deleted branch fix/analyze-null-geom-500 2026-06-03 14:50:13 +00:00
Sign in to join this conversation.
No reviewers
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#1033
No description provided.