gendesign/tradein-mvp/backend/data/sql/085_quarter_price_index_fdw.sql
bot-backend 87a5de0cae
All checks were successful
Deploy Trade-In / changes (push) Successful in 6s
Deploy / changes (push) Successful in 5s
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy / build-frontend (push) Has been skipped
Deploy Trade-In / test (push) Successful in 26s
Deploy Trade-In / build-backend (push) Successful in 25s
Deploy / build-backend (push) Successful in 1m30s
Deploy Trade-In / deploy (push) Successful in 37s
Deploy / build-worker (push) Successful in 2m54s
Deploy / deploy (push) Successful in 1m8s
feat(db): quarter_price_index FDW foreign table + monthly refresh (Refs #762) (#797)
Co-authored-by: bot-backend <bot-backend@gendsgn.local>
Co-committed-by: bot-backend <bot-backend@gendsgn.local>
2026-05-30 17:16:28 +00:00

58 lines
2.7 KiB
PL/PgSQL

-- 085_quarter_price_index_fdw.sql
-- Issue #762 — Foreign table over MAIN DB's mv_quarter_price_index MV.
--
-- Context:
-- #760 (PR #792) created public.mv_quarter_price_index in the MAIN gendesign DB.
-- The estimator (#647-3) needs O(1) lookup by quarter_cad_number without a
-- cross-service HTTP round-trip. FDW foreign table lets tradein read the MV
-- directly via the already-established gendesign_remote server.
--
-- Reused infra:
-- SERVER gendesign_remote — created by 060_postgres_fdw_extension.sql.
-- Pattern: per-table FOREIGN TABLE (not IMPORT FOREIGN SCHEMA) — matches repo convention.
-- USER MAPPING is managed at backend startup from env (see 060_postgres_fdw_extension.sql).
--
-- Column mapping (verified against live MV via pg_attribute, 2026-05-30):
-- quarter_cad_number character varying(30) → varchar(30) / text (FDW accepts text for varchar)
-- price_index double precision → double precision
-- n_deals bigint → bigint
-- basis text → text
-- computed_at timestamp with time zone → timestamptz
--
-- Index note:
-- The remote MV has UNIQUE index mv_quarter_price_index_uq on quarter_cad_number.
-- FDW pushes equality predicates (WHERE quarter_cad_number = $1) down to MAIN,
-- so remote index gives O(1) lookup. No local index on the foreign table is needed
-- or possible (postgres_fdw does not support local indexes on foreign tables).
--
-- Idempotency:
-- DROP FOREIGN TABLE IF EXISTS → CREATE is safe to re-apply.
-- BEGIN/COMMIT per sql.md conventions.
--
-- Apply order:
-- After 060_postgres_fdw_extension.sql (server must exist).
-- After 99a_quarter_price_index.sql is applied in MAIN (MV must exist remotely).
-- Before estimator code referencing this table is deployed (#647-3).
BEGIN;
DROP FOREIGN TABLE IF EXISTS quarter_price_index;
CREATE FOREIGN TABLE quarter_price_index (
quarter_cad_number varchar(30) NOT NULL,
price_index double precision NOT NULL,
n_deals bigint NOT NULL,
basis text NOT NULL,
computed_at timestamp with time zone NOT NULL
)
SERVER gendesign_remote
OPTIONS (schema_name 'public', table_name 'mv_quarter_price_index');
COMMENT ON FOREIGN TABLE quarter_price_index IS
'FDW read-only view of gendesign.public.mv_quarter_price_index. '
'Per-cadastral-quarter price index normalised to EKB city median (=1.0). '
'Lookup by quarter_cad_number is O(1) via remote UNIQUE index on MAIN. '
'Refresh cadence: MAIN refreshes MV via Celery beat (see quarter_price_index_refresh task). '
'Issue: #762. Source MV: #760.';
COMMIT;