fix(tradein): вернуть фотографии подсказок Avito IMV задним числом (#2674) (#2693)
All checks were successful
Deploy Trade-In / changes (push) Successful in 11s
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / build-browser (push) Has been skipped
Deploy Trade-In / test (push) Successful in 2m54s
Deploy Trade-In / build-backend (push) Successful in 28s
Deploy Trade-In / deploy (push) Successful in 1m7s

This commit is contained in:
bot-backend 2026-08-06 05:40:02 +00:00
parent e1c26c212a
commit a7ca0e9ee8

View file

@ -0,0 +1,44 @@
-- 221_backfill_house_suggestions_image_link.sql
-- Purpose (#2674, класс «площадка прислала, парсер разобрал, до базы не доехало»):
-- вернуть фотографии подсказок Avito IMV задним числом.
--
-- Контекст. Колонка house_suggestions.image_link существует с миграции 064; до
-- PR #2682 (2026-08-06) парсер выбрасывал suggestions.items[].imageLink, а INSERT
-- её не перечислял. Правка #2682 чинит только БУДУЩИЕ строки. На проде на момент
-- этой миграции: 25 055 строк house_suggestions, image_link заполнен у 0 (count
-- точный, не reltuples).
--
-- Почему исторические ВОССТАНОВИМЫ. Полный ответ /web/1/realty-imv/get-data
-- сохраняется целиком в house_imv_evaluations.raw_response (jsonb) — 2 685 строк,
-- у ВСЕХ 2 685 присутствует suggestions.items[0].imageLink. Ключ подсказки
-- (house_id, ext_item_id) однозначно соответствует (e.house_id, item->>'id').
--
-- Прод-замер ДО (SELECT-прогон этого же JOIN, 2026-08-06):
-- всего 25 055 · восстановимо 21 480 (85.7%) · не восстановимо 3 575 (14.3%).
-- 3 575 — это подсказки, чей house_id переоценивался позже: house_imv_evaluations
-- имеет UNIQUE(house_id) и ON CONFLICT DO UPDATE перетирает raw_response свежим
-- ответом, поэтому старый набор подсказок остаётся без своего сырья. Эти строки
-- невосстановимы в принципе — не «недоделанный бэкфилл», а утраченный источник.
--
-- Идемпотентно: WHERE hs.image_link IS NULL — повторный прогон не трогает уже
-- заполненные строки и не перетирает то, что напишет живой скрейпер.
--
-- Apply after: 216_dead_code_sweep.sql
BEGIN;
UPDATE house_suggestions hs
SET image_link = j.item ->> 'imageLink'
FROM house_imv_evaluations e
CROSS JOIN LATERAL jsonb_array_elements(e.raw_response -> 'suggestions' -> 'items') AS j(item)
WHERE e.house_id = hs.house_id
AND j.item ->> 'id' = hs.ext_item_id
AND hs.image_link IS NULL
AND nullif(j.item ->> 'imageLink', '') IS NOT NULL;
COMMENT ON COLUMN house_suggestions.image_link IS
'Ссылка на фото лота (suggestions.items[].imageLink). Пишется скрейпером с #2682; '
'исторические строки восстановлены из house_imv_evaluations.raw_response миграцией 221 '
'(21 480 из 25 055; остальные потеряли сырьё при перезаписи оценки дома).';
COMMIT;