feat(db): nspd_quarter_dumps table for PKK harvest persistence (#94 pt.3/4) #110
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#110
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/nspd-quarter-dumps-schema"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Sprint 1.1 item #2 из 4-частного плана #94 part 2 — persistent storage для
QuarterDumpsnapshots (PR #109 уже merged).Foundation для:
harvest_quartertask + beat schedule — пишет dumps батчамиanalyze_parcelintegration — читает квартал из этой таблицы, не делая NSPD HTTP запросов в request-циклеSchema (data/sql/88_nspd_quarter_dumps.sql)
Table
nspd_quarter_dumps— 17 columns matchingQuarterDumpdataclassquarter_cadquarter_geombbox_3857parcels_count/ ... /risks_counttotal_featuresfeatures_jsonlayers_fetchedfetched_at_utcharvest_duration_msharvest_errorregion_code6 indexes
quarter_cadbbox_gistbbox_3857geom_gistquarter_geomfetched_idxfetched_at_utc DESCregion_idxregion_codehealthy_idxWHERE harvest_error IS NULLView
v_quarter_dumps_freshnessAdmin monitoring helper:
quarter_cad,region_code,fetched_at_utc,total_features,harvest_error,AGE(NOW(), fetched_at_utc) AS age,harvest_error IS NOT NULL AS is_failed. Backed byfetched_idx.Conventions
BEGIN; ... COMMIT;atomic transactionCREATE TABLE IF NOT EXISTS+CREATE INDEX IF NOT EXISTS— idempotent re-applicableCOMMENT ON TABLE+ 7COMMENT ON COLUMN+ comments на каждом index88_(после 86 v_bucket_success_score, 87 on_demand_indexes)Applied to prod
DDL applied к prod в рамках database-expert verification (idempotent, безопасно для re-run). Файл — canonical source.
EXPLAIN sanity (prod, empty table)
WHERE quarter_cad = '66:41:0204016'→ Index Scan on PKWHERE ST_Intersects(bbox_3857, ST_MakeEnvelope(...,3857))→ Index Scan via GISTWHERE fetched_at_utc < NOW() - INTERVAL '30 days'→ Seq Scan на пустой таблице; planner переключится на B-tree после ~50 rowsVault
code/schemas/Schema_Nspd_Quarter_Dumps.md— full schema description, indexes, EXPLAIN, upsert template сON CONFLICT DO UPDATEcovering all columns (perBug_Cad_Buildings_OnConflict_PartialUpdate_Apr30convention).Code review (pre-push, code-reviewer agent)
Verdict: APPROVE, 0 blocking, 2 minor non-blocking observations:
quarter_geom MultiPolygonvs NSPD plainPolygon— резолвится в Sprint 1.1 #3 PR (Celery task) черезST_Multi(ST_Transform(...))на ingest contract. Schema strict как guardrail.layers_fetched TEXT[] DEFAULT '{}'— documented в comment как partial-failure path для error rows (когда harvest упал до фактических fetches).Acceptance
nspd_quarter_dumpsсоздана с 17 columnsv_quarter_dumps_freshnessTest plan
QuarterDumpdataclass (PR #109)harvest_quartertask → verifytotal_features > 0analyze_parcelиспользует cached dump вместо NSPD HTTPSequential rule — следующий PR (Celery task) создаётся ТОЛЬКО после merge этого.
Part of #94.
✅ Auto-review passed (LGTM) — pt.3/4, schema чист и идемпотентен.
Schema correctness:
BEGIN/COMMITатомарно, всеIF NOT EXISTS/CREATE OR REPLACE VIEW— идемпотентно.features_json JSONB DEFAULT '[]'+NOT NULL— safe для empty harvests.layers_fetched TEXT[] DEFAULT '{}'правильный empty array literal.region_code SMALLINT NOT NULLбез DEFAULT — caller обязан supply, NOT NULL защищает.Performance:
bbox_3857иquarter_geom— correct.fetched_at_utc DESCдля staleness queries.WHERE harvest_error IS NULL— deliberate optimization для healthy-dump queries.Data model match с QuarterDump (PR #109):
quarter_cadPK TEXT,layers_fetched TEXT[],bbox_3857geometry(Polygon, 3857),fetched_at_utc TIMESTAMPTZ— все совпадают.search_features+layer_featurescollapsed вfeatures_json JSONBс"layer"discriminator key — valid denormalization, no data loss.Minor observation (non-blocker):
v_quarter_dumps_freshness:183—ORDER BYвнутри view body не гарантируется PostgreSQL при wrapping в subquery/CTE. Здесь view admin/monitoring only,SELECT *работает как ожидается, но future developer должен знать.Merging.