fix(analytics): de-inflate domrf_kn snapshot counts (8.49×) + backfill UPSERT columns (#2464) #2470
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#2470
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "worktree-agent-aab4625f7363b7d87"
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?
Что
Волна 3 эпика #2464, честность данных — кластеры E + F.
domrf_kn_objectsхранит ~9 исторических снапшотов наobj_id(UNIQUE(obj_id, snapshot_date), без ретенции).Read-side де-инфляция (cluster E)
Наивный
COUNT(*)/SELECT ... WHERE dev_idсчитал каждый снапшот отдельным объектом. Фикс —DISTINCT ON (obj_id) ORDER BY snapshot_date DESC NULLS LAST(latest-snapshot-per-obj_id, сиблинг-паттернsupply_layers._L3_FUTURE_SQL+ прецедент0de32cd2)._active_competitors_count._q()— де-инфляция + волатильные фильтры наружу CTE. Прод-замер per-obj_id variance (authoritative):dev_id=0, region_cd=0стабильны;district_name=1, obj_class=29, site_status=11волатильны. Поэтомуsite_status,district_name,COALESCE(obj_class,obj_class_fallback)применяются послеDISTINCT ON(на истинно-последней строке), в CTE остаётся только стабильныйregion_cdкак partition-scope. Иначе для 29 объектов со сменившимся классом взяли бы «последний снапшот, где класс совпал», а не актуальный.developer_portfolio()— тот же дедуп;dev_id(variance 0) остаётся в CTE; форма колонок неизменна._competitors_two_dimactiveCTE — тот же анти-паттерн (site_status внутриDISTINCT ON), разбит наlatest(дедуп)→active(волатильные фильтры), форма вывода сохранена. (follow-up из ревью, свёрнут сюда.)Write-side UPSERT-пропуски (clusters E + F)
UPSERT_OBJECT_SQLON CONFLICT DO UPDATE SETтерял 8 свежевычисляемых колонок при ре-скрейпе (problem_flag, green_house, floor_min, floor_max, hobj_id, short_addr, dev_inn, region_cd) → устаревали. Добавлены как прямойEXCLUDED.<col>(не COALESCE — чтобыproblem_flagмог сброситься в NULL при исчезновении проблемы).UPSERT_PHOTO_SQL— добавленbuild_type = EXCLUDED.build_type.Индекс: существующий
uq_kn_objects_id_snap UNIQUE (obj_id, snapshot_date)покрываетDISTINCT ON— миграция не нужна.Тесты
24 новых (SQL-shape + algorithm-spec): дедуп присутствует · волатильные предикаты post-DISTINCT-ON (site_status + district + class) · sold-out объект со старым Строящиеся-снапшотом НЕ считается активным · UPSERT покрывает все INSERT-колонки (generic-guard от рецидива).
analytics+scrapers= 24 passed; wider (recommend/forecasting/site_finder) = 1746 passed, ruff чисто.Ревью
code-reviewer: ✅ APPROVE (по core), + tightening после моего прод-замера (obj_class волатилен у 29 obj_id — reviewer предполагал стабильность абстрактно, замер решающий) и свёрнутый сиблинг
_competitors_two_dim. Прецедент дедупа0de32cd2подтверждён.Post-deploy: сверю
Строящиеся-счётчик региона на проде (ожидаю ~8× падение).Refs #2464 (clusters E + F).