argand-site-registry/crates/argand-site-registry/migrations/005.sql

25 lines
2 KiB
SQL

-- By Nic Weyand! ADR 0002: store immutable, subject-bound observation batches.
CREATE TABLE observation_batches (
id TEXT PRIMARY KEY,
source TEXT NOT NULL,
retrieved_at TEXT NOT NULL,
manifest_json TEXT NOT NULL,
records INTEGER NOT NULL DEFAULT 0 CHECK(records>=0),
complete INTEGER NOT NULL DEFAULT 0 CHECK(complete IN (0,1))
) STRICT;
CREATE TABLE observations (
fingerprint TEXT PRIMARY KEY,
batch_id TEXT NOT NULL REFERENCES observation_batches(id),
subject_kind TEXT NOT NULL CHECK(subject_kind IN ('name','edge','equivalence')),
subject_fingerprint TEXT NOT NULL,
document_json TEXT NOT NULL
) STRICT;
CREATE INDEX observation_subject ON observations(subject_kind,subject_fingerprint,fingerprint);
CREATE TRIGGER observation_batch_open_insert BEFORE INSERT ON observation_batches WHEN NEW.records<>0 OR NEW.complete<>0 BEGIN SELECT RAISE(ABORT,'observation batch must be created open'); END;
CREATE TRIGGER observation_batch_no_update BEFORE UPDATE OF id,source,retrieved_at,manifest_json ON observation_batches BEGIN SELECT RAISE(ABORT,'observation batch identity is immutable'); END;
CREATE TRIGGER observation_batch_finish_once BEFORE UPDATE OF records,complete ON observation_batches WHEN OLD.complete<>0 OR NEW.complete<>1 OR NEW.records<=0 OR NEW.records<>(SELECT count(*) FROM observations WHERE batch_id=OLD.id) BEGIN SELECT RAISE(ABORT,'observation batch can complete only once with its exact record count'); END;
CREATE TRIGGER observation_batch_no_delete BEFORE DELETE ON observation_batches BEGIN SELECT RAISE(ABORT,'observation batches are immutable'); END;
CREATE TRIGGER observation_insert_open BEFORE INSERT ON observations WHEN NOT EXISTS(SELECT 1 FROM observation_batches WHERE id=NEW.batch_id AND complete=0) BEGIN SELECT RAISE(ABORT,'observations require an open batch'); END;
CREATE TRIGGER observation_no_update BEFORE UPDATE ON observations BEGIN SELECT RAISE(ABORT,'observations are immutable'); END;
CREATE TRIGGER observation_no_delete BEFORE DELETE ON observations BEGIN SELECT RAISE(ABORT,'observations are immutable'); END;
PRAGMA user_version=5;