[P0][tradein][вторичка] #647-2 Schema + refresh: хранить quarter_price_index, cron-refresh #762

Closed
opened 2026-05-30 16:06:40 +00:00 by lekss361 · 2 comments
Owner

Sub-issue 2/4 эпика #647. FULL SEND к 2026-06-01. Неклиентский — инфра данных, цену клиента НЕ меняет.

Задача

Материализовать quarter_price_index (из #647-1 / #740) в таблицу или MV, читаемую estimator'ом за O(1), + механизм обновления по cron (ДКП обновляются → index дрейфует).

DoD

  • Таблица/MV quarter_price_index (cad_quarter PK, index float, n_deals, computed_at) в tradein БД (или MV в main + FDW-чтение — решить с #647-1).
  • Refresh-механизм (cron / scheduled task), идемпотентный, логируемый.
  • Индекс на cad_quarter для lookup из estimator.
  • Документировано в vault.

Зависимости

  • Зависит от #647-1 (#740) — методология/источник.
  • Блокирует #647-3.
  • НЕ трогает estimator → нулевой риск для клиентской цены.

Parent: #647.

> Sub-issue 2/4 эпика #647. FULL SEND к 2026-06-01. **Неклиентский — инфра данных, цену клиента НЕ меняет.** ## Задача Материализовать `quarter_price_index` (из #647-1 / #740) в таблицу или MV, читаемую estimator'ом за O(1), + механизм обновления по cron (ДКП обновляются → index дрейфует). ## DoD - [ ] Таблица/MV `quarter_price_index` (cad_quarter PK, index float, n_deals, computed_at) в tradein БД (или MV в main + FDW-чтение — решить с #647-1). - [ ] Refresh-механизм (cron / scheduled task), идемпотентный, логируемый. - [ ] Индекс на cad_quarter для lookup из estimator. - [ ] Документировано в vault. ## Зависимости - Зависит от #647-1 (#740) — методология/источник. - Блокирует #647-3. - НЕ трогает estimator → нулевой риск для клиентской цены. Parent: #647.
lekss361 added the
scope/backend
вторичка
status/ready
tradein
priority/p0
labels 2026-05-30 16:06:40 +00:00
bot-backend self-assigned this 2026-05-30 17:06:53 +00:00
bot-backend added
status/wip
and removed
status/ready
labels 2026-05-30 17:06:55 +00:00
bot-backend added
status/review
and removed
status/wip
labels 2026-05-30 17:13:56 +00:00
Collaborator

PR #797 → status/review. FDW foreign table quarter_price_index (tradein, server gendesign_remote) + GRANT на роль tradein_fdw_reader (main 99b) + Celery-beat monthly refresh (chained source→index, CONCURRENTLY). Column mapping 1:1 валидирован на live MV. Разблокирует #647-3 после merge.

PR #797 → status/review. FDW foreign table `quarter_price_index` (tradein, server gendesign_remote) + GRANT на роль tradein_fdw_reader (main 99b) + Celery-beat monthly refresh (chained source→index, CONCURRENTLY). Column mapping 1:1 валидирован на live MV. Разблокирует #647-3 после merge.
bot-reviewer added
status/qa
and removed
status/review
labels 2026-05-30 17:16:34 +00:00
lekss361 added this to the Praktika demo — Mon 2026-06-01 milestone 2026-05-30 17:21:09 +00:00
Collaborator

QA PASS — PR #797 (merged 17:16:28). Инфра-issue, не клиентский (estimator-интеграция = #647-3, за гейтом) → UI-смоук неприменим; верификация по DB-state + merged diff.

DB-реальность (postgres-gendesign, main):

  • mv_quarter_price_index1972 строки, 0 NULL-ключей, owner=gendesign.
  • has_table_privilege('tradein_fdw_reader', 'mv_quarter_price_index', 'SELECT')true → GRANT 99b раскатан (это runtime-критичный гейт — без него foreign table падает на чтении; ).
  • Оба MV в refresh-цепочке (mv_quarter_price_per_m2, mv_quarter_price_index) имеют UNIQUE-индекс → монтлий REFRESH CONCURRENTLY валиден, не упадёт.

Code-level DoD (merged diff):

  • FDW foreign table quarter_price_index (085, tradein) — колонки 1:1 с MV, DROP IF EXISTS идемпот, server gendesign_remote.
  • GRANT (99b, main) — идемпот, ordering 99a99b документирован.
  • Refresh helper: chained source→derived, CONCURRENTLY + non-concurrent fallback.
  • Celery task refresh_quarter_price_index_chain + beat-entry 0 2 5 * * (05:00 MSK, 5-е, после refresh-ekb-districts-medians).
  • Lookup O(1) через remote UNIQUE-индекс pushdown (локальный FDW-индекс не нужен/невозможен).

NB: tradein-side foreign-table SELECT напрямую не проверял (нет postgres-tradein в этом окне), но единственная его runtime-зависимость (main GRANT) подтверждена live, а 085 идемпотентна и применяется в том же деплое. DoD «документировано в vault» — вне QA-скоупа (оставляю владельцу), PR + миграции самодокументированы.

Разблокирует #647-3. → status/done, closing.

✅ **QA PASS** — PR #797 (merged 17:16:28). Инфра-issue, не клиентский (estimator-интеграция = #647-3, за гейтом) → UI-смоук неприменим; верификация по DB-state + merged diff. **DB-реальность (postgres-gendesign, main):** - `mv_quarter_price_index` — **1972 строки**, 0 NULL-ключей, owner=gendesign. - `has_table_privilege('tradein_fdw_reader', 'mv_quarter_price_index', 'SELECT')` → **true** → GRANT 99b раскатан (это runtime-критичный гейт — без него foreign table падает на чтении; ✅). - Оба MV в refresh-цепочке (`mv_quarter_price_per_m2`, `mv_quarter_price_index`) имеют **UNIQUE-индекс** → монтлий `REFRESH CONCURRENTLY` валиден, не упадёт. **Code-level DoD (merged diff):** - FDW foreign table `quarter_price_index` (085, tradein) — колонки 1:1 с MV, `DROP IF EXISTS` идемпот, server `gendesign_remote`. ✅ - GRANT (99b, main) — идемпот, ordering `99a`→`99b` документирован. ✅ - Refresh helper: chained source→derived, CONCURRENTLY + non-concurrent fallback. ✅ - Celery task `refresh_quarter_price_index_chain` + beat-entry `0 2 5 * *` (05:00 MSK, 5-е, после `refresh-ekb-districts-medians`). ✅ - Lookup O(1) через remote UNIQUE-индекс pushdown (локальный FDW-индекс не нужен/невозможен). ✅ **NB:** tradein-side foreign-table SELECT напрямую не проверял (нет postgres-tradein в этом окне), но единственная его runtime-зависимость (main GRANT) подтверждена live, а 085 идемпотентна и применяется в том же деплое. DoD «документировано в vault» — вне QA-скоупа (оставляю владельцу), PR + миграции самодокументированы. Разблокирует #647-3. → `status/done`, closing.
bot-qa added
status/done
and removed
status/qa
labels 2026-05-30 17:23:43 +00:00
Sign in to join this conversation.
No project
No assignees
3 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#762
No description provided.