fix(tradein): дедуп объявлений по квартире + over_100 NULL-фикс (500 на списке) (148) #2075

Merged
lekss361 merged 1 commit from fix/tradein-dedup-apartments into main 2026-06-28 18:04:32 +00:00
Owner

Два фикса (после QA Макса)

1. 🔴 HOTFIX: 500 на списке домов (over_100 = NULL)

После роста покрытия (38%→76.9%) список домов упал с 500. Причина: over_100 = (sale_share_pct > 100 OR sale_share_pct_45d > 100) — когда один % NULL, SQL даёт false OR NULL = NULL, а схема over_100: bool (не nullable) → Pydantic ValidationError. Фикс: COALESCE(... , false) на обе ветки → over_100 всегда bool.

  • Прод уже восстановлен in-container hotfix'ом (sed + restart); этот PR делает фикс постоянным (иначе следующий деплой вернёт баг).

2. Дедуп объявлений по квартире (миграция 148)

Одна квартира на avito+cian+domklik = разные dedup_hash → считалась многократно. Фикс: числители считают distinct (комнаты, площадь, этаж), а не объявления.

  • Искровцев 33: active_secondary 4→2 (твой пример: 2-к на domklik+avito, 3-к на avito+cian).
  • Общий active_secondary 23401→18524 (−20.8%), listings_45d −19.7%, 0 домов с ростом (монотонно).

Validation

  • over_100: прод-список снова 200 после рестарта с фиксом.
  • Дедуп: ROLLBACK-tx на проде, числа выше; view компилируется.

Test plan

  • Прод-список 200 после фикса.
  • Дедуп: Искровцев 4→2, −20.8% общий, 0 инфляций.
  • Авто-apply 148 + новый образ (over_100) на деплое.
## Два фикса (после QA Макса) ### 1. 🔴 HOTFIX: 500 на списке домов (`over_100` = NULL) После роста покрытия (38%→**76.9%**) список домов упал с 500. Причина: `over_100 = (sale_share_pct > 100 OR sale_share_pct_45d > 100)` — когда один % NULL, SQL даёт `false OR NULL = NULL`, а схема `over_100: bool` (не nullable) → Pydantic ValidationError. Фикс: `COALESCE(... , false)` на обе ветки → over_100 всегда bool. - **Прод уже восстановлен** in-container hotfix'ом (sed + restart); этот PR делает фикс постоянным (иначе следующий деплой вернёт баг). ### 2. Дедуп объявлений по квартире (миграция 148) Одна квартира на avito+cian+domklik = разные `dedup_hash` → считалась многократно. Фикс: числители считают **distinct (комнаты, площадь, этаж)**, а не объявления. - Искровцев 33: `active_secondary` **4→2** (твой пример: 2-к на domklik+avito, 3-к на avito+cian). - Общий `active_secondary` 23401→18524 (**−20.8%**), `listings_45d` −19.7%, **0 домов с ростом** (монотонно). ## Validation - over_100: прод-список снова `200` после рестарта с фиксом. - Дедуп: ROLLBACK-tx на проде, числа выше; view компилируется. ## Test plan - [x] Прод-список 200 после фикса. - [x] Дедуп: Искровцев 4→2, −20.8% общий, 0 инфляций. - [ ] Авто-apply 148 + новый образ (over_100) на деплое.
lekss361 added 1 commit 2026-06-28 18:04:07 +00:00
fix(tradein): дедуп объявлений по квартире (комнаты+площадь+этаж) — кросс-площадочные дубли
All checks were successful
CI / changes (pull_request) Successful in 6s
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
44dbbbeaee
lekss361 merged commit 0641183ecd into main 2026-06-28 18:04:32 +00:00
lekss361 deleted branch fix/tradein-dedup-apartments 2026-06-28 18:04:33 +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#2075
No description provided.