From 30d78c503070ca4130a9507f80cde5fb33b641d4 Mon Sep 17 00:00:00 2001 From: lekss361 <47113017+lekss361@users.noreply.github.com> Date: Fri, 15 May 2026 10:07:52 +0300 Subject: [PATCH] fix(pipeline): enrich obj_class via objective_lots COALESCE fallback (#165) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- backend/app/api/v1/parcels.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/backend/app/api/v1/parcels.py b/backend/app/api/v1/parcels.py index 0e18adc4..a1697a9a 100644 --- a/backend/app/api/v1/parcels.py +++ b/backend/app/api/v1/parcels.py @@ -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(