-- Initial pf schema: sources, column metadata, versions, audit log, generated SQL. -- -- This is the schema as it stood before the additive columns in later migrations. -- Columns added afterwards are declared once, in their own migration — not here. CREATE SCHEMA IF NOT EXISTS pf; CREATE TABLE pf.source ( id serial PRIMARY KEY, schema text NOT NULL, tname text NOT NULL, label text, status text NOT NULL DEFAULT 'active', -- active | archived created_at timestamptz NOT NULL DEFAULT now(), created_by text, UNIQUE (schema, tname) ); CREATE TABLE pf.col_meta ( id serial PRIMARY KEY, source_id integer NOT NULL REFERENCES pf.source(id) ON DELETE CASCADE, cname text NOT NULL, label text, role text NOT NULL DEFAULT 'ignore', -- dimension | value | units | date | filter | ignore is_key boolean NOT NULL DEFAULT false, -- true = usable in WHERE slice opos integer, UNIQUE (source_id, cname) ); CREATE TABLE pf.version ( id serial PRIMARY KEY, source_id integer NOT NULL REFERENCES pf.source(id) ON DELETE RESTRICT, name text NOT NULL, description text, status text NOT NULL DEFAULT 'open', -- open | closed exclude_iters jsonb NOT NULL DEFAULT '["reference"]'::jsonb, created_at timestamptz NOT NULL DEFAULT now(), created_by text, closed_at timestamptz, closed_by text, UNIQUE (source_id, name) ); CREATE TABLE pf.log ( id bigserial PRIMARY KEY, version_id integer NOT NULL REFERENCES pf.version(id) ON DELETE CASCADE, pf_user text NOT NULL, stamp timestamptz NOT NULL DEFAULT now(), operation text NOT NULL, -- baseline | reference | scale | recode | clone slice jsonb, params jsonb, note text ); -- generated operation SQL per source, stored after col_meta is configured CREATE TABLE pf.sql ( id serial PRIMARY KEY, source_id integer NOT NULL REFERENCES pf.source(id) ON DELETE CASCADE, operation text NOT NULL, -- get_data | get_agg | baseline | reference | scale | recode | clone | undo sql text NOT NULL, generated_at timestamptz NOT NULL DEFAULT now(), UNIQUE (source_id, operation) );