fix(cian): recover new-build house via cadastral anchor + listings (source,source_id) dedup (#1773) #1912

Merged
bot-backend merged 1 commit from fix/cian-address-anchor-1773 into main 2026-06-26 07:45:23 +00:00
Collaborator

Адреса убивают same-building anchor. Два независимых фикса (PART 1 + 2; avito «29р-н» слип — отдельно, не тут).

PART 1 — cian new-build house recovery: когда geo.address[] без {type:"house"} и это новостройка → восстанавливаем номер: (a) building.houseNumber/address, (c) хвост из newbuilding.name, и КЛЮЧЕВОЕ — building_cadastral_number как same-building anchor key (cian_building_cad → Tier-0 cadastr_exact), чтобы дробящиеся корпуса (6679/11110/7019) схлопывались даже без номера дома. Без фабрикации catch-all.

PART 2 — dedup: data/sql/133 — partial UNIQUE listings(source, source_id) WHERE source_id IS NOT NULL. Существующие дубли (cian 330047129) дедуплицируются ДО constraint: keeper по (house_id_fk IS NOT NULL, is_active, last_seen_at, id), дети (price_history/snapshots/sources/valuations/merged_into) collision-safe пере-привязываются. Атомарно, идемпотентно, guard на остаток. Провалидировано на throwaway PG 16. save_listings ON CONFLICT (dedup_hash) совместим (не менял).

+6 тестов (new-build house-less fixture). 259 cian-тестов passed, ruff clean. Refs #1773

Адреса убивают same-building anchor. Два независимых фикса (PART 1 + 2; avito «29р-н» слип — отдельно, не тут). **PART 1 — cian new-build house recovery:** когда `geo.address[]` без `{type:"house"}` и это новостройка → восстанавливаем номер: (a) `building.houseNumber/address`, (c) хвост из `newbuilding.name`, и КЛЮЧЕВОЕ — `building_cadastral_number` как same-building anchor key (`cian_building_cad` → Tier-0 cadastr_exact), чтобы дробящиеся корпуса (6679/11110/7019) схлопывались даже без номера дома. Без фабрикации catch-all. **PART 2 — dedup:** `data/sql/133` — partial UNIQUE `listings(source, source_id) WHERE source_id IS NOT NULL`. Существующие дубли (cian 330047129) дедуплицируются ДО constraint: keeper по `(house_id_fk IS NOT NULL, is_active, last_seen_at, id)`, дети (price_history/snapshots/sources/valuations/merged_into) collision-safe пере-привязываются. Атомарно, идемпотентно, guard на остаток. **Провалидировано на throwaway PG 16.** `save_listings` ON CONFLICT (dedup_hash) совместим (не менял). +6 тестов (new-build house-less fixture). 259 cian-тестов passed, ruff clean. Refs #1773
bot-backend added 1 commit 2026-06-26 07:31:21 +00:00
fix(cian): recover new-build house number via cadastral anchor + listings (source,source_id) dedup (#1773)
All checks were successful
CI / changes (pull_request) Successful in 11s
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
282243fb97
PART 1 — cian-новостройки теряли номер дома: geo.address[] для ЖК часто без
части {type:"house"}, адрес выходил house-less («…улица Евгения Савкова» без
«29») и раздробленные корпуса схлопывались в catch-all → same-building anchor
рвался. Теперь для новостроек без house восстанавливаем номер по приоритету:
(a) building.houseNumber / building.address, (b) building_cadastral_number как
anchor-ключ, (c) хвостовой дом-токен из newbuilding.name — без catch-all
фабрикации. building_cadastral_number предпочтён как house anchor
(house_source=cian_building_cad) → Tier 0 cadastr_exact схлопывает корпуса;
nb_id остаётся fallback'ом.

PART 2 — дубль-листинги: миграция 133 дедупит listings по (source, source_id)
(keeper = house_id_fk → активность → свежесть → id), безопасно перепривязывает
детей (price_history/snapshots/listing_sources/external_valuations/merged_into)
collision-safe и вешает частичный UNIQUE (source, source_id) WHERE source_id IS
NOT NULL. Идемпотентно, недеструктивно для keeper. save_listings оставлен на
ON CONFLICT (dedup_hash) — арбитр согласован с новым constraint, source_id=NULL
(yandex/url-only) не ломается.

Refs #1773
bot-backend merged commit 1d5b081cb4 into main 2026-06-26 07:45:23 +00:00
bot-backend deleted branch fix/cian-address-anchor-1773 2026-06-26 07:45:24 +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#1912
No description provided.