fix(pipeline): enrich obj_class via objective_lots COALESCE fallback (#165)

domrf_kn_objects.obj_class всегда NULL (Bug_Kn_API_Obj_Class_Always_Null_OPEN).
Pipeline 24mo UI показывал 'Не указан: 4075 квартир'.

Fix: SQL COALESCE с correlated subquery через objective_complex_mapping →
objective_lots.class. Mapped complexes (114/4548) теперь резолвят корректный
класс — комфорт/стандарт/бизнес/премиум.

## Coverage impact (verified via MCP)

Pre-fix: 0 of 1316 planned ЖК имели obj_class
Post-fix: 339 of 1316 (25.8%) — 249 комфорт, 45 стандарт, 42 бизнес

Не-mapped objects остаются 'Не указан' (upstream kn-scraper fix всё ещё open).

Closes #162

Co-authored-by: lekss361 <claudestars@proton.me>
This commit is contained in:
lekss361 2026-05-15 10:07:52 +03:00 committed by GitHub
parent 46584d7c75
commit 30d78c5030
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -375,8 +375,9 @@ def _aggregate_pipeline(rows: list[Any]) -> dict[str, Any]:
- top_objects: PIPELINE_TOP_OBJECTS_LIMIT крупнейших ЖК по flat_count
NB: `obj_class` в production часто NULL (см.
`fixes/Bug_Kn_API_Obj_Class_Always_Null_OPEN`) by_class dominated by
"unknown" пока не закрыт D6/#38.
`fixes/Bug_Kn_API_Obj_Class_Always_Null_OPEN`). Pipeline SQL обогащает
obj_class через objective_lots + objective_complex_mapping (COALESCE
fallback). Объекты без маппинга остаются "unknown".
Используется для UI pipeline-bar и severity badge.
"""
@ -1312,7 +1313,16 @@ def analyze_parcel(
SELECT obj_id,
comm_name,
dev_name,
obj_class,
COALESCE(
obj_class,
(SELECT DISTINCT ol.class
FROM objective_lots ol
JOIN objective_complex_mapping m
ON m.objective_complex_name = ol.project_name
WHERE m.domrf_obj_id = o.obj_id
AND ol.class IS NOT NULL
LIMIT 1)
) AS obj_class,
flat_count,
ready_dt,
ST_Distance(