gendesign/tradein-mvp/backend/data/sql/064_house_imv_phase_c.sql
lekss361 b0d377c984
All checks were successful
Deploy Trade-In / changes (push) Successful in 5s
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / build-backend (push) Successful in 25s
Deploy Trade-In / deploy (push) Successful in 36s
feat(tradein): Phase C — Avito IMV per-house backfill (SQL + script) (#534)
2026-05-24 14:50:31 +00:00

79 lines
2.7 KiB
PL/PgSQL

-- 064: Phase C — Avito IMV per-house backfill schema.
-- Idempotent: re-run safe (IF NOT EXISTS).
BEGIN;
-- Track IMV scrape state per house (resumable backfill)
ALTER TABLE houses
ADD COLUMN IF NOT EXISTS imv_status text NOT NULL DEFAULT 'pending',
ADD COLUMN IF NOT EXISTS last_imv_attempt_at timestamptz,
ADD COLUMN IF NOT EXISTS imv_error_reason text;
CREATE INDEX IF NOT EXISTS houses_imv_status_idx
ON houses(imv_status, last_imv_attempt_at NULLS FIRST)
WHERE imv_status IN ('pending', 'transient_error');
-- House-level IMV evaluation result (1:1 with houses, latest fetch)
CREATE TABLE IF NOT EXISTS house_imv_evaluations (
id bigserial PRIMARY KEY,
house_id bigint NOT NULL REFERENCES houses(id) ON DELETE CASCADE,
cache_key text,
recommended_price bigint,
lower_price bigint,
higher_price bigint,
market_count integer,
raw_response jsonb,
fetched_at timestamptz NOT NULL DEFAULT NOW(),
-- Lot-params used (median from listings or default)
rooms integer,
area_m2 numeric(8,2),
floor integer,
floor_at_home integer,
house_type text,
renovation_type text,
has_balcony boolean,
has_loggia boolean
);
CREATE UNIQUE INDEX IF NOT EXISTS house_imv_eval_house_uniq_idx
ON house_imv_evaluations(house_id);
CREATE INDEX IF NOT EXISTS house_imv_eval_fetched_idx
ON house_imv_evaluations(fetched_at DESC);
-- Avito suggestions[] per house — 8 similar lots nearby
CREATE TABLE IF NOT EXISTS house_suggestions (
id bigserial PRIMARY KEY,
house_id bigint NOT NULL REFERENCES houses(id) ON DELETE CASCADE,
ext_item_id text NOT NULL, -- Avito item id
title text,
address text,
price_rub bigint,
area_m2 numeric(8,2),
rooms integer,
floor integer,
total_floors integer,
exposure_days integer,
publish_date date,
item_link text,
image_link text,
metro_name text,
metro_distance text,
has_good_price_badge boolean,
raw_payload jsonb,
fetched_at timestamptz NOT NULL DEFAULT NOW()
);
CREATE UNIQUE INDEX IF NOT EXISTS house_suggestions_uniq_idx
ON house_suggestions(house_id, ext_item_id);
CREATE INDEX IF NOT EXISTS house_suggestions_house_idx
ON house_suggestions(house_id, fetched_at DESC);
-- Verify
DO $$
DECLARE
pending_n bigint;
BEGIN
SELECT count(*) INTO pending_n FROM houses WHERE imv_status = 'pending';
RAISE NOTICE 'migration 064: % houses pending IMV backfill', pending_n;
END $$;
COMMIT;