fix(tradein/houses): персистить house_class из avito «Класс жилья» и yandex parse (#2003) #2359

Merged
lekss361 merged 1 commit from fix/tradein-house-class-persist into main 2026-07-04 00:49:49 +00:00
Owner

Closes #2003

houses.house_class (comfort/business/premium/economy, declared 009_houses.sql) заполнен у 0% (живой замер: 6958 домов, 0 с house_class — issue называл 13769, разница объясняется fias-dedup purge 2026-07-02, задокументировано в vault). Два независимых бага:

Bug 2 (quick win, сделано полностью): Avito newbuilding developmentPage отдаёт {"type":"Класс жилья","value":"Комфорт"} — уже сохранялось в houses.raw_characteristics, но не извлекалось в колонку (нет ключа в EXPAND_PARAMS_MAP). Добавлена RU→канон нормализация + COALESCE(CAST(:house_class AS text), houses.house_class) write в _persist_house (avito = топ-приоритетный источник, перезаписывает при наличии значения, None не затирает существующее). Зеркальная правка в scraper-kit копии (packages/scraper-kit/.../providers/avito/houses.py) — обязательна, там parity-тест сравнивает legacy vs kit dataclasses.asdict().

Bug 1 (частично): resolve_house_field/HOUSE_FIELD_PRIORITY (conflict_resolution.py) подтверждён dead code (0 продакшн-вызовов, только тесты) — не трогал, задокументировано. Вместо этого починен реальный producer-side gap: yandex_newbuilding_sweep.py парсил house_class, но нигде не персистил (терялось безвозвратно, писалось только в market.yandex_jk_enrichment без этой колонки) — добавлен fill-only UPDATE (COALESCE(houses.house_class, :new) — yandex_realty_nb низший приоритет, никогда не перетирает более приоритетный источник).

Проверено: ruff чисто, 50 relevant tests + parity-тест test_admin_avito_kit_parity.py (4 passed, независимо перезапущен reviewer'ом) + полный backend suite 3265 passed/6 skipped (1 pre-existing unrelated fail). code-reviewer APPROVE (после мелкого ruff-format fixup). Никакой миграции — колонка уже существовала, API её нигде не отдаёт (0 backward-compat риска).

Не в этом PR (сознательно): Серия/Перекрытия из raw_characteristics (issue называл необязательным); backfill существующих 6958 домов (эффект появится по мере естественного re-scrape).

Closes #2003 `houses.house_class` (comfort/business/premium/economy, declared `009_houses.sql`) заполнен у **0%** (живой замер: 6958 домов, 0 с house_class — issue называл 13769, разница объясняется fias-dedup purge 2026-07-02, задокументировано в vault). Два независимых бага: **Bug 2 (quick win, сделано полностью):** Avito newbuilding developmentPage отдаёт `{"type":"Класс жилья","value":"Комфорт"}` — уже сохранялось в `houses.raw_characteristics`, но не извлекалось в колонку (нет ключа в `EXPAND_PARAMS_MAP`). Добавлена RU→канон нормализация + `COALESCE(CAST(:house_class AS text), houses.house_class)` write в `_persist_house` (avito = топ-приоритетный источник, перезаписывает при наличии значения, `None` не затирает существующее). Зеркальная правка в scraper-kit копии (`packages/scraper-kit/.../providers/avito/houses.py`) — обязательна, там parity-тест сравнивает legacy vs kit `dataclasses.asdict()`. **Bug 1 (частично):** `resolve_house_field`/`HOUSE_FIELD_PRIORITY` (`conflict_resolution.py`) подтверждён dead code (0 продакшн-вызовов, только тесты) — не трогал, задокументировано. Вместо этого починен реальный producer-side gap: `yandex_newbuilding_sweep.py` парсил `house_class`, но нигде не персистил (терялось безвозвратно, писалось только в `market.yandex_jk_enrichment` без этой колонки) — добавлен fill-only `UPDATE` (`COALESCE(houses.house_class, :new)` — yandex_realty_nb низший приоритет, никогда не перетирает более приоритетный источник). Проверено: ruff чисто, 50 relevant tests + parity-тест `test_admin_avito_kit_parity.py` (4 passed, независимо перезапущен reviewer'ом) + полный backend suite 3265 passed/6 skipped (1 pre-existing unrelated fail). code-reviewer APPROVE (после мелкого ruff-format fixup). Никакой миграции — колонка уже существовала, API её нигде не отдаёт (0 backward-compat риска). **Не в этом PR (сознательно):** Серия/Перекрытия из raw_characteristics (issue называл необязательным); backfill существующих 6958 домов (эффект появится по мере естественного re-scrape).
lekss361 added 1 commit 2026-07-04 00:47:19 +00:00
fix(tradein/houses): персистить house_class из avito «Класс жилья» и yandex parse (#2003)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m37s
03d7884a80
houses.house_class (comfort/business/premium/economy) заполнен у 0% из 6958
домов. Два независимых бага:

Bug 2 (quick win): avito EXPAND_PARAMS_MAP не извлекал «Класс жилья»
(developmentPage/новостройки) в колонку — добавлена нормализация RU→канон
+ COALESCE-write в _persist_house (avito = топ-приоритетный источник,
перезаписывает при наличии значения, None не затирает существующее).
Зеркальная правка в scraper-kit копии (parity-тест этого требует).

Bug 1 (частично): resolve_house_field/HOUSE_FIELD_PRIORITY
(conflict_resolution.py) подтверждён dead code (0 прод-вызовов) — не
трогал. Вместо этого починен yandex_newbuilding_sweep.py: парсил
house_class, но нигде не персистил (терялось безвозвратно) — добавлен
fill-only UPDATE (COALESCE(houses.house_class, :new) — yandex_realty_nb
низший приоритет, не перетирает более приоритетный источник).
lekss361 merged commit 91c8365d91 into main 2026-07-04 00:49:49 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2359
No description provided.