fix(tradein/avito): обогащать деталями листинги всей области, не только ЕКБ (#2576) #2578

Merged
lekss361 merged 2 commits from fix/tradein-avito-detail-oblast into main 2026-07-31 15:16:50 +00:00
Owner

Эпик #2576, этап B. Тихий дефект: avito_detail_backfill.py:208 жёстко фильтровал source_url LIKE '%/ekaterinburg/%' → у листингов области detail_enriched_at навсегда NULL, а detail-страница это источник координат и 30+ полей. Без координат карточка молча выпадает из подбора аналогов по радиусу. Стало актуально сейчас: развёртки по городам области включены, Каменск-Уральский уже даёт объявления.

Решение — два CTE в одном запросе:

  • ekb — прежний паттерн, прежний LIMIT :batch_size, прежний ORDER BY: для Екатеринбурга поведение байт-в-байт.
  • oblastLIKE ANY(CAST(:oblast_patterns AS text[])), паттерны строятся из CITY_LOCATIONS (единственный источник правды по avito-слагам: kamensk-uralskiy через дефис, verhnyaya_pyshma без «kh») — не дублируются вручную. Свой LIMIT :oblast_batch_size (default 100).

Почему не единый WHERE ... OR ...: общий ORDER BY scraped_at DESC отдавал бы приоритет свежим строкам независимо от города, и всплеск области (первичный краул нового города) вытеснил бы часть ЕКБ из фиксированного батча. Раздельные квоты гарантируют, что ЕКБ не урезается, а область не конкурирует за его слоты. Чужие регионы (Москва/СПб) по-прежнему вне выборки.

Грепом проверено: в yandex_detail_backfill.py / domclick_detail_backfill.py фильтра по городу нет вовсе (дефект не продублирован). product_handlers.py:226 — конфигурируемый дефолт планировщика, другая природа, вне scope.

Нагрузка на прокси: потолок за прогон 800 → 900 (+12.5%), частота запросов и ротации не менялись. Worst case +10 мин к прогону при budget_sec=3600.

Тесты: +2 новых (реальные прод-паттерны, семантика Postgres LIKE через fnmatch; ЕКБ и область проходят, Москва/СПб — нет), обновлён существующий. Новый тест на старом коде падал (ImportError: _OBLAST_AVITO_URL_PATTERNS). Полный uv run pytest -q: 2828 passed, 1 pre-existing fail.

Эпик #2576, этап B. Тихий дефект: `avito_detail_backfill.py:208` жёстко фильтровал `source_url LIKE '%/ekaterinburg/%'` → у листингов области `detail_enriched_at` навсегда `NULL`, а detail-страница это источник координат и 30+ полей. Без координат карточка молча выпадает из подбора аналогов по радиусу. Стало актуально сейчас: развёртки по городам области включены, Каменск-Уральский уже даёт объявления. **Решение — два CTE в одном запросе:** - `ekb` — прежний паттерн, прежний `LIMIT :batch_size`, прежний `ORDER BY`: для Екатеринбурга поведение байт-в-байт. - `oblast` — `LIKE ANY(CAST(:oblast_patterns AS text[]))`, паттерны строятся из `CITY_LOCATIONS` (единственный источник правды по avito-слагам: `kamensk-uralskiy` через дефис, `verhnyaya_pyshma` без «kh») — не дублируются вручную. Свой `LIMIT :oblast_batch_size` (default 100). Почему не единый `WHERE ... OR ...`: общий `ORDER BY scraped_at DESC` отдавал бы приоритет свежим строкам независимо от города, и всплеск области (первичный краул нового города) вытеснил бы часть ЕКБ из фиксированного батча. Раздельные квоты гарантируют, что ЕКБ не урезается, а область не конкурирует за его слоты. Чужие регионы (Москва/СПб) по-прежнему вне выборки. **Грепом проверено:** в `yandex_detail_backfill.py` / `domclick_detail_backfill.py` фильтра по городу нет вовсе (дефект не продублирован). `product_handlers.py:226` — конфигурируемый дефолт планировщика, другая природа, вне scope. **Нагрузка на прокси:** потолок за прогон 800 → 900 (+12.5%), частота запросов и ротации не менялись. Worst case +10 мин к прогону при `budget_sec=3600`. Тесты: +2 новых (реальные прод-паттерны, семантика Postgres `LIKE` через `fnmatch`; ЕКБ и область проходят, Москва/СПб — нет), обновлён существующий. Новый тест на старом коде падал (`ImportError: _OBLAST_AVITO_URL_PATTERNS`). Полный `uv run pytest -q`: 2828 passed, 1 pre-existing fail.
lekss361 added 1 commit 2026-07-31 13:35:20 +00:00
fix(tradein/avito): обогащать деталями листинги всей области, не только ЕКБ (#2576)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 11s
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 2m27s
10442d0187
bot-backend added 1 commit 2026-07-31 14:04:03 +00:00
fix(tradein/avito): экранировать _ в LIKE-паттернах + честная эмуляция LIKE в тесте (#2576)
All checks were successful
CI / changes (pull_request) Successful in 10s
CI Trade-In / changes (pull_request) Successful in 12s
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 2m15s
5a66c2df51
lekss361 merged commit eb44718677 into main 2026-07-31 15:16:50 +00:00
Sign in to join this conversation.
No reviewers
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#2578
No description provided.