mirror of
https://github.com/zvx-echo6/central.git
synced 2026-05-21 18:14:44 +02:00
feat(schema): add adapter column to events, drop source
Replaces module-path-based source column (e.g. "central/adapters/nws") with stable adapter identifier (e.g. "nws") that foreign-keys to config.adapters.name. Migration 011: - ADD COLUMN adapter TEXT - Backfill via REPLACE(source, 'central/adapters/', '') - SET NOT NULL + FK RESTRICT - CREATE INDEX (adapter, received DESC) for dashboard queries - DROP COLUMN source Code changes: - Event model: source field renamed to adapter - All adapters: use adapter="name" instead of source="central/adapters/name" - Archive: write adapter column instead of source Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
4c9ca176a9
commit
8601a19f60
10 changed files with 150 additions and 18 deletions
46
sql/migrations/011_events_add_adapter_column.sql
Normal file
46
sql/migrations/011_events_add_adapter_column.sql
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
-- Migration 011: Add adapter column to events, drop source column
|
||||
-- Replaces module-path-based source with stable adapter identifier
|
||||
|
||||
-- Add adapter column (idempotent)
|
||||
ALTER TABLE public.events ADD COLUMN IF NOT EXISTS adapter TEXT;
|
||||
|
||||
-- Backfill from existing source values
|
||||
UPDATE public.events
|
||||
SET adapter = REPLACE(source, 'central/adapters/', '')
|
||||
WHERE adapter IS NULL AND source IS NOT NULL;
|
||||
|
||||
-- Make NOT NULL after backfill (idempotent check)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name = 'events'
|
||||
AND column_name = 'adapter'
|
||||
AND is_nullable = 'YES'
|
||||
) THEN
|
||||
ALTER TABLE public.events ALTER COLUMN adapter SET NOT NULL;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Add FK constraint (idempotent check)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.table_constraints
|
||||
WHERE constraint_name = 'events_adapter_fkey'
|
||||
AND table_name = 'events'
|
||||
) THEN
|
||||
ALTER TABLE public.events
|
||||
ADD CONSTRAINT events_adapter_fkey
|
||||
FOREIGN KEY (adapter) REFERENCES config.adapters(name)
|
||||
ON DELETE RESTRICT;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Add index for dashboard queries (idempotent)
|
||||
CREATE INDEX IF NOT EXISTS events_adapter_received_idx
|
||||
ON public.events (adapter, received DESC);
|
||||
|
||||
-- Drop deprecated source column (idempotent)
|
||||
ALTER TABLE public.events DROP COLUMN IF EXISTS source;
|
||||
|
|
@ -1,9 +1,12 @@
|
|||
-- Central Data Hub schema
|
||||
-- PostgreSQL 16 + TimescaleDB + PostGIS
|
||||
-- NOTE: Migrations in sql/migrations/ are the source of truth.
|
||||
-- This file is for reference and initial setup only.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS events (
|
||||
id TEXT NOT NULL, -- CloudEvent id
|
||||
source TEXT NOT NULL, -- adapter identity
|
||||
adapter TEXT NOT NULL -- adapter identity (FK to config.adapters.name)
|
||||
REFERENCES config.adapters(name) ON DELETE RESTRICT,
|
||||
category TEXT NOT NULL, -- "wx.alert.<type>"
|
||||
time TIMESTAMPTZ NOT NULL, -- event-time UTC
|
||||
expires TIMESTAMPTZ,
|
||||
|
|
@ -21,6 +24,9 @@ SELECT create_hypertable('events', 'time', if_not_exists => TRUE);
|
|||
CREATE INDEX IF NOT EXISTS events_category_time_idx
|
||||
ON events (category, time DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS events_adapter_received_idx
|
||||
ON events (adapter, received DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS events_geom_gist
|
||||
ON events USING GIST (geom);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue