feat(sf-18): is_sales_started flag для domrf_kn_objects #292

Merged
lekss361 merged 1 commit from fix/sf-18-pre-sale-flag into main 2026-05-17 14:09:22 +00:00
Owner

Summary

SF FixList #18 (Wave 3) — отличать «Строящиеся с открытыми продажами» от pre-sale (квартиры ещё не выложены). Создаёт v_domrf_objects_with_sales — обёртка над domrf_kn_objects с derived-полем is_sales_started: bool.

Audit (region_cd=66, site_status='Строящиеся')

Metric Count %
Total Строящиеся 1 322 100%
With flats (sales started) 1 247 94.3%
Without flats (pre-sale) 75 5.7%

5.7% — это реальный pre-sale pool, который сейчас не различается в UI.

Design — VIEW, не GENERATED column

PostgreSQL не поддерживает subquery в GENERATED ALWAYS AS. Alternatives:

  • regular column + trigger — избыточно, риск при scrape upserts
  • VIEW v_domrf_objects_with_sales — идемпотентно, нет backfill, всегда актуально (читает из base + flats live)

Changes

  • data/sql/105_add_sales_started_flag.sqlCREATE OR REPLACE VIEW
  • Vault: fixes/Fix_SF_PreSaleFlag_May17.md

Base table domrf_kn_objects НЕ меняется.

How to use

SELECT * FROM v_domrf_objects_with_sales
WHERE site_status = 'Строящиеся' AND region_cd = 66 AND is_sales_started = TRUE;

Test plan

  • After deploy: SELECT is_sales_started, COUNT(*) FROM v_domrf_objects_with_sales WHERE region_cd=66 AND site_status='Строящиеся' GROUP BY 1 — ~1247 TRUE, ~75 FALSE
  • Idempotent: повторный прогон migration → no-op (CREATE OR REPLACE)
  • EXPLAIN: PG использует idx_kn_flats_obj в EXISTS subquery

Related: epic #271 item #18 · Wave 3 (P2)

## Summary SF FixList #18 (Wave 3) — отличать «Строящиеся с открытыми продажами» от pre-sale (квартиры ещё не выложены). Создаёт `v_domrf_objects_with_sales` — обёртка над `domrf_kn_objects` с derived-полем `is_sales_started: bool`. ## Audit (region_cd=66, site_status='Строящиеся') | Metric | Count | % | |---|---|---| | Total Строящиеся | 1 322 | 100% | | With flats (sales started) | **1 247** | 94.3% | | Without flats (pre-sale) | **75** | 5.7% | 5.7% — это реальный pre-sale pool, который сейчас не различается в UI. ## Design — VIEW, не GENERATED column PostgreSQL **не поддерживает** subquery в `GENERATED ALWAYS AS`. Alternatives: - ❌ regular column + trigger — избыточно, риск при scrape upserts - ✅ **VIEW** `v_domrf_objects_with_sales` — идемпотентно, нет backfill, всегда актуально (читает из base + flats live) ## Changes - `data/sql/105_add_sales_started_flag.sql` — `CREATE OR REPLACE VIEW` - Vault: `fixes/Fix_SF_PreSaleFlag_May17.md` Base table `domrf_kn_objects` НЕ меняется. ## How to use ```sql SELECT * FROM v_domrf_objects_with_sales WHERE site_status = 'Строящиеся' AND region_cd = 66 AND is_sales_started = TRUE; ``` ## Test plan - [ ] After deploy: `SELECT is_sales_started, COUNT(*) FROM v_domrf_objects_with_sales WHERE region_cd=66 AND site_status='Строящиеся' GROUP BY 1` — ~1247 TRUE, ~75 FALSE - [ ] Idempotent: повторный прогон migration → no-op (CREATE OR REPLACE) - [ ] EXPLAIN: PG использует `idx_kn_flats_obj` в EXISTS subquery Related: epic #271 item #18 · Wave 3 (P2)
lekss361 added 1 commit 2026-05-17 14:00:34 +00:00
View derives is_sales_started (bool) via EXISTS subquery on domrf_kn_flats.
Enables SiteFinder to separate pre-sale buildings (no flats listed yet) from
active-sale ones. 75/1322 Строящиеся buildings in region 66 are pre-sale (5.7%).
lekss361 merged commit 33f44b59cb into main 2026-05-17 14:09:22 +00:00
Author
Owner

Merged via deep-code-reviewer — verdict APPROVE.

EXPLAIN verified: Bitmap Index Scan on domrf_kn_objects + Index Only Scan on domrf_kn_flats (uses idx_kn_flats_obj). Cost 5445.89 — acceptable для 1322 строящихся.

Sequential numbering OK: 100..104 заняты, 105 — next free. No view name collision (24 existing views проверены).

Merged via deep-code-reviewer — verdict APPROVE. EXPLAIN verified: Bitmap Index Scan on `domrf_kn_objects` + Index Only Scan on `domrf_kn_flats` (uses `idx_kn_flats_obj`). Cost 5445.89 — acceptable для 1322 строящихся. Sequential numbering OK: 100..104 заняты, 105 — next free. No view name collision (24 existing views проверены).
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#292
No description provided.