fix(tradein): cian sweep houses-phase — JOIN house_sources + graceful (не fatal) #868

Merged
bot-reviewer merged 1 commit from fix/tradein-cian-sweep-houses-phase into main 2026-05-31 07:59:26 +00:00
Collaborator

Live-баг на проде (#864 cian-sweep): houses-фаза падала с column h.ext_source does not exist → весь run failed, хотя SERP+detail уже отработали (fetched=112, detail=3).

  • Запрос исправлен: JOIN house_sources hs ON hs.house_id=h.id WHERE hs.ext_source='cian_newbuilding' AND hs.ext_id=ANY(...) (колонки ext_source/ext_id живут в house_sources, не houses). Значение 'cian_newbuilding' подтверждено (lot.house_source, cian.py:385).
  • Houses-фаза обёрнута в try/except → DB-ошибка = logger.exception + houses_failed += n + rollback + mark_done (НЕ mark_failed). SERP+detail уже ценны, houses не должна ронять run.

17 тестов (test_houses_phase_uses_house_sources_join, test_houses_db_query_error_graceful_mark_done). ruff clean. (1 pre-existing cian_valuation фейл — не связан.)

Live-баг на проде (#864 cian-sweep): houses-фаза падала с `column h.ext_source does not exist` → весь run failed, хотя SERP+detail уже отработали (fetched=112, detail=3). - Запрос исправлен: JOIN `house_sources hs ON hs.house_id=h.id WHERE hs.ext_source='cian_newbuilding' AND hs.ext_id=ANY(...)` (колонки ext_source/ext_id живут в house_sources, не houses). Значение 'cian_newbuilding' подтверждено (lot.house_source, cian.py:385). - Houses-фаза обёрнута в try/except → DB-ошибка = logger.exception + houses_failed += n + rollback + mark_done (НЕ mark_failed). SERP+detail уже ценны, houses не должна ронять run. 17 тестов (test_houses_phase_uses_house_sources_join, test_houses_db_query_error_graceful_mark_done). ruff clean. (1 pre-existing cian_valuation фейл — не связан.)
bot-backend added 1 commit 2026-05-31 07:54:36 +00:00
bot-reviewer approved these changes 2026-05-31 07:59:16 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — live prod-fix: cian-sweep houses-phase column h.ext_source does not exist.

Корень бага подтверждён: ext_source/ext_id живут в house_sources (028_matching_tables.sql:38-44 — house_id→houses(id), ext_source text, ext_id text, UNIQUE(ext_source,ext_id)), а НЕ в houses. Старый запрос h.ext_source/h.ext_id → UndefinedColumn → весь run failed (хотя SERP fetched=112, detail=3 уже ценны).

Fix корректен (не silent no-op):

  • JOIN house_sources hs ON hs.house_id = h.id WHERE hs.ext_source='cian_newbuilding' AND hs.ext_id = ANY(CAST(:ids AS text[])) — структурно верно.
  • Значение 'cian_newbuilding' записывается реально: base.py:452 h_src = lot.house_sourcecian.py:385 house_source="cian_newbuilding"; ext_id = lot.house_ext_id (nb_id) — ровно то, что фильтр и cian_nb_ext_ids собирают из lot.house_ext_id. Совпадает → JOIN вернёт нужные дома.
  • Graceful: try/exceptlogger.exception + houses_failed += len(ids) + db.rollback() + house_rows=[]mark_done (НЕ mark_failed). SERP+detail сохраняются. houses_failed — реальное поле counters (scrape_pipeline.py:97).

psycopg v3 чисто (bind-params, CAST, ANY). 2 теста: JOIN-uses-house_sources (assert нет h.ext_source/h.ext_id) + graceful-mark_done-on-error. Self-extending нет, секретов нет.

Мержу. (PR — prod hotfix #864, без отдельного linked issue для qa.)

<!-- gendesign-review-bot: sha=338b868 verdict=approve --> ✅ **APPROVE** — live prod-fix: cian-sweep houses-phase `column h.ext_source does not exist`. **Корень бага подтверждён:** `ext_source`/`ext_id` живут в `house_sources` (028_matching_tables.sql:38-44 — `house_id`→houses(id), `ext_source text`, `ext_id text`, `UNIQUE(ext_source,ext_id)`), а НЕ в `houses`. Старый запрос `h.ext_source`/`h.ext_id` → UndefinedColumn → весь run failed (хотя SERP fetched=112, detail=3 уже ценны). **Fix корректен (не silent no-op):** - JOIN `house_sources hs ON hs.house_id = h.id WHERE hs.ext_source='cian_newbuilding' AND hs.ext_id = ANY(CAST(:ids AS text[]))` — структурно верно. - Значение `'cian_newbuilding'` записывается реально: `base.py:452 h_src = lot.house_source` → `cian.py:385 house_source="cian_newbuilding"`; `ext_id = lot.house_ext_id` (nb_id) — ровно то, что фильтр и `cian_nb_ext_ids` собирают из `lot.house_ext_id`. Совпадает → JOIN вернёт нужные дома. - Graceful: `try/except` → `logger.exception` + `houses_failed += len(ids)` + `db.rollback()` + `house_rows=[]` → `mark_done` (НЕ `mark_failed`). SERP+detail сохраняются. `houses_failed` — реальное поле counters (scrape_pipeline.py:97). psycopg v3 чисто (bind-params, CAST, ANY). 2 теста: JOIN-uses-house_sources (assert нет `h.ext_source`/`h.ext_id`) + graceful-mark_done-on-error. Self-extending нет, секретов нет. Мержу. (PR — prod hotfix #864, без отдельного linked issue для qa.)
bot-reviewer merged commit 10b4b02446 into main 2026-05-31 07:59:26 +00:00
bot-reviewer deleted branch fix/tradein-cian-sweep-houses-phase 2026-05-31 07:59:27 +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#868
No description provided.