fix(sf-10): velocity LEFT JOIN + velocity_data_available flag #284
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#284
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/sf-10-velocity-left-join-v2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
SF FixList #10 (Wave 2) —
velocity.pyStep 2 использовал де-факто INNER JOIN сobjective_complex_mapping→ ЖК без маппинга полностью выпадали из ответа вместо честногоvelocity=0. После SF#4 (Малевич mapping) мы знаем что ещё ~91.5% ЖК ЕКБ unmapped — silent dropout.Audit (postgres MCP, EKB region_cd=66)
Изменения
backend/app/services/site_finder/velocity.pyall_competitorsчерезunnest(CAST(:obj_ids AS int[]))+ LEFT JOIN с mapped + LEFT JOIN с crm. Полеhas_mappingper row. Три случая: no mapping anywhere →velocity=0 + velocity_data_available=False; mapped но нет в окне → то же; нормальный путь → flag=Truebackend/app/schemas/parcel.py(через VelocityResult dataclass +as_dict())velocity_data_available: bool = True(additive backward compat)frontend/src/types/site-finder.tsVelocity.velocity_data_available?: booleanfrontend/src/components/site-finder/VelocityBlock.tsxbg-slate-100 text-slate-500 text-xs px-2 py-0.5 rounded"нет данных velocity" когда flag=false + скрытие gaugefixes/Fix_SF_Velocity_LeftJoin_May17.mdTest plan
66:41:0702048:27(есть маппнутые) → velocity показывается как раньше,velocity_data_available=trueRelated: epic #271 item #10 · Wave 2 · также частично решает silent-dropout от SF#4 audit (Малевич + 13 HIGH + 25 MEDIUM unmapped)
Merged via deep-code-reviewer — verdict APPROVE.
Что проверено:
report_month >= ...иdeals_total_count > 0в ON (не WHERE) — unmapped строки сохраняются.GROUP BY ac.obj_id, m.obj_idправильный,has_mappingderived из grouped column.CAST(:obj_ids AS int[])+CAST(:window_interval AS interval)— соответствует backend.md (psycopg v3, не::type).parcels.py:2095— additive field вas_dict()backward compat.best_layouts.pyиспользует свой_INLINE_VELOCITY_SQL, неcompute_velocity→ recommendation pipeline (rb_deals,sum=100) не затронут.dataAvailable = velocity.velocity_data_available !== false— корректно обрабатывает undefined для старых ответов.fixes/Fix_SF_Velocity_LeftJoin_May17.md— есть.MINOR (follow-up, не блокирующее):
backend/tests/test_velocity.pyмокаетsales_rowsбез ключаhas_mapping— следующий pytest CI упадёт сKeyError: 'has_mapping'. Нужен follow-up PR: добавить"has_mapping": True/Falseв_sales_row(...)fixture.mapped_confветке fallbackdenominator = ... else ekb_median * 2.0теперь dead branch (n_with_sales==0 уже отбрасывается раньше) — nit, не влияет на корректность.schemas/parcel.py, но фактически schema не менялся — изменения черезVelocityResult.as_dict(). Косметика описания.Smoke план:
/analyzeдля cad где все ЖК unmapped (например далеко от центра ЕКБ) → response:velocity.velocity_data_available=false, badge "нет данных velocity" в UI, gauge скрыт.66:41:0702048:27(есть маппнутые) →velocity_data_available=true, normal gauge + period./analyze.recommendationrooms_mix sum=100 invariant не сломан.