feat(tradein): ГАР-loader знаменателя — apartments-per-house → gar_house_flats + match к houses #2059
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#2059
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-gar-flats-loader"
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
Загрузчик знаменателя «всего квартир в доме» для страницы «доля квартир дома в продаже». Парсит региональный ГАР/ФИАС-дамп (новый формат, папка региона напр.
66/), считает помещения-квартиры на дом и матчит кhousesпо нормализованному адресу → проставляетhouses.gar_flat_count(его подхватывает viewv_building_sale_share, мигр. 143).services/gar_flats_loader.py— стриминговыйlxml.iterparse(clear + prune siblings,huge_tree, XXE-safe; региональныеAS_APARTMENTS/AS_MUN_HIERARCHYмногогигабайтны). Считает квартиры = число активных помещений, чейPARENTOBJID==OBJECTIDдома; собирает адрес по иерархии; batched upsert (ON CONFLICT, SAVEPOINT-per-batch); матчер.tasks/gar_flats_load.py— CLI:python -m app.tasks.gar_flats_load --dir /data/gar/66 --region 66 --version 2026-06-01.docs/gar-flats-runbook.md— откуда брать дамп (fias.nalog.ru → регион 66 / распаковать папку66из gar_xml.zip), размер, команда. Лоадер потребляет уже распакованные XML (скачивание десятков ГБ — ops-шаг).Качество / проверки
CAST(:x AS type)+executemany/ON CONFLICT, детерминированный tie-breakDISTINCT ON (norm_address) … flat_count DESC, идемпотентный матчер черезIS DISTINCT FROM, XXE-safe).houses.gar_flat_count=150, tie-break выбрал max-flat-count guid, view посчиталsale_share_pct, повторный прогонUPDATE 0(idempotent), ROLLBACK — ничего не записано.⚠️ Известное ограничение (важно для запуска)
Матч — точное равенство нормализованных адресов.
tradein_normalize_short_addrслабо канонизирует («ул. Шаумяна,20»остаётся как есть, с точкой/пунктуацией/«р-н …»), а ГАР даёт «ул Шаумяна, д 20» → реальный yield точного матча будет низким. Перед опорой на знаменатель нужен tune матчинга (усиленная канонизация обеих сторон + trgm-fuzzy; GIN-trgm индекс наgar_house_flats.norm_addressуже есть, мигр. 143) — измеритьmatched/totalпосле первого реального прогона. Это отдельный шаг, не блокер кода.Test plan
pytest tests/test_gar_flats_loader.py→ 14 passed / 1 skip; ruff clean.gar_flat_count → view → %работает.Финальный PR серии (loader). Остальное (схема, API, страница) уже в main.