[tradein] A: Query-side guard вторички — estimator/asking_to_sold/matview не должны читать novostroyki из listings #1186

Closed
opened 2026-06-12 08:39:23 +00:00 by lekss361 · 1 comment
Owner

Часть плана «парсим все сегменты, фильтруем на чтении» (Anton, 2026-06-12). Шаг 1 из 4 (A→B #след., C, D). ⚠️ Это не подготовка, а багфикс: avito-sweep не имеет scrape-time фильтра сегмента → строки listing_segment='novostroyki' уже есть в проде, а читатели listings не guard'ятся → comps estimator'а возможно уже подмешаны первичкой.

Ground truth

  • listing_segment колонка существует (миграция 011), значения 'vtorichka'/'novostroyki'/NULL (NULL = строки до 011, по построению вторичка — sweep'ы были secondary-only).
  • cian.py:583-584 / yandex_realty.py:521 фильтруют на scrape (пока), avito.py:727-728 только маркирует segment, НЕ фильтрует.

Scope

  1. Инвентаризация: rg "FROM listings" -t py по tradein-backend + rg -i "from listings" tradein-mvp/backend/data/sql/ — таблица ВСЕХ читателей в PR body: file:line → вердикт (нужен guard / не нужен + почему).
  2. Guard-предикат (КАНОН): AND (listing_segment IS NULL OR listing_segment = 'vtorichka') — НЕ = 'vtorichka' (иначе выкинем NULL-строки до-011 и сузим comps). Комментарий у каждого guard'а.
  3. Применить guard минимум в: estimator.py (fetch_analogs и все listings-SELECT'ы comps), tasks/asking_to_sold_ratio.py (re-derive SQL), search matview (refresh_search_matview) — если matview кормит UI-выдачу estimator-контекста; миграция нового определения matview если SQL в data/sql (NN idempotent, авто-applied!).
  4. Тесты: estimator-тест «новостройка в listings НЕ попадает в аналоги»; существующие тесты не ломать.

DoD

  • Инвентаризационная таблица в PR body, каждый читатель разобран.
  • Guard'ы с каноничным предикатом + комменты.
  • Полный pytest tradein-backend (меняем estimator — shared!), ruff.
  • Поведение для текущих НЕ-novostroyki данных не изменилось (NULL включены).

Effort: M · Блокирует: B (полная загрузка), C (API segment) · Связано: ADR market-слой, #944 (#952 supply)

**Часть плана «парсим все сегменты, фильтруем на чтении» (Anton, 2026-06-12).** Шаг 1 из 4 (A→B #след., C, D). ⚠️ Это не подготовка, а **багфикс**: avito-sweep не имеет scrape-time фильтра сегмента → строки `listing_segment='novostroyki'` уже есть в проде, а читатели listings не guard'ятся → comps estimator'а возможно уже подмешаны первичкой. ## Ground truth - `listing_segment` колонка существует (миграция 011), значения `'vtorichka'/'novostroyki'/NULL` (NULL = строки до 011, по построению вторичка — sweep'ы были secondary-only). - cian.py:583-584 / yandex_realty.py:521 фильтруют на scrape (пока), avito.py:727-728 только маркирует segment, НЕ фильтрует. ## Scope 1. **Инвентаризация:** `rg "FROM listings" -t py` по tradein-backend + `rg -i "from listings" tradein-mvp/backend/data/sql/` — таблица ВСЕХ читателей в PR body: file:line → вердикт (нужен guard / не нужен + почему). 2. **Guard-предикат (КАНОН):** `AND (listing_segment IS NULL OR listing_segment = 'vtorichka')` — НЕ `= 'vtorichka'` (иначе выкинем NULL-строки до-011 и сузим comps). Комментарий у каждого guard'а. 3. Применить guard минимум в: `estimator.py` (_fetch_analogs и все listings-SELECT'ы comps), `tasks/asking_to_sold_ratio.py` (re-derive SQL), search matview (`refresh_search_matview`) — если matview кормит UI-выдачу estimator-контекста; миграция нового определения matview если SQL в data/sql (NN_ idempotent, авто-applied!). 4. Тесты: estimator-тест «новостройка в listings НЕ попадает в аналоги»; существующие тесты не ломать. ## DoD - Инвентаризационная таблица в PR body, каждый читатель разобран. - Guard'ы с каноничным предикатом + комменты. - **Полный pytest** tradein-backend (меняем estimator — shared!), ruff. - Поведение для текущих НЕ-novostroyki данных не изменилось (NULL включены). **Effort:** M · Блокирует: B (полная загрузка), C (API segment) · Связано: ADR market-слой, #944 (#952 supply)
lekss361 added the
bug
scope/backend
status/ready
вторичка
labels 2026-06-12 08:40:51 +00:00
lekss361 added
status/review
and removed
status/ready
labels 2026-06-12 09:02:11 +00:00
Collaborator

qa : novostroyki query-side guard задеплоен в prod tradein-backend — подтверждено в asking_to_sold_ratio.py (6 мест, коммент novostroyki guard (#1186)), sber_index.py:397, estimator.py. Скраперы тегируют listing_segment на scrape-time (avito.py:728, cian.py:340). Read-side фильтрация на существующих данных (не зависит от scraping/browser) → verifiable. PR #1192/#1193 merged. Закрываю.

qa ✅: novostroyki query-side guard задеплоен в prod tradein-backend — подтверждено в `asking_to_sold_ratio.py` (6 мест, коммент `novostroyki guard (#1186)`), `sber_index.py:397`, `estimator.py`. Скраперы тегируют `listing_segment` на scrape-time (avito.py:728, cian.py:340). Read-side фильтрация на существующих данных (не зависит от scraping/browser) → verifiable. PR #1192/#1193 merged. Закрываю.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#1186
No description provided.