|
1 | 1 | CREATE SCHEMA IF NOT EXISTS pgml_rust;
|
2 | 2 |
|
| 3 | +--- |
| 4 | +--- Track of updates to data |
| 5 | +--- |
| 6 | +CREATE OR REPLACE FUNCTION pgml_rust.auto_updated_at(tbl regclass) |
| 7 | +RETURNS VOID |
| 8 | +AS $$ |
| 9 | + DECLARE name_parts TEXT[]; |
| 10 | + DECLARE name TEXT; |
| 11 | +BEGIN |
| 12 | + name_parts := string_to_array(tbl::TEXT, '.'); |
| 13 | + name := name_parts[array_upper(name_parts, 1)]; |
| 14 | + |
| 15 | + EXECUTE format('DROP TRIGGER IF EXISTS %s_auto_updated_at ON %s', name, tbl); |
| 16 | + EXECUTE format('CREATE TRIGGER %s_auto_updated_at BEFORE UPDATE ON %s |
| 17 | + FOR EACH ROW EXECUTE PROCEDURE pgml_rust.set_updated_at()', name, tbl); |
| 18 | +END; |
| 19 | +$$ |
| 20 | +LANGUAGE plpgsql; |
| 21 | + |
| 22 | + |
| 23 | +--- |
| 24 | +--- Called via trigger whenever a row changes |
| 25 | +--- |
| 26 | +CREATE OR REPLACE FUNCTION pgml_rust.set_updated_at() |
| 27 | +RETURNS TRIGGER |
| 28 | +AS $$ |
| 29 | +BEGIN |
| 30 | + IF ( |
| 31 | + NEW IS DISTINCT FROM OLD |
| 32 | + AND NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at |
| 33 | + ) THEN |
| 34 | + NEW.updated_at := clock_timestamp(); |
| 35 | + END IF; |
| 36 | + RETURN NEW; |
| 37 | +END; |
| 38 | +$$ |
| 39 | +LANGUAGE plpgsql; |
| 40 | + |
| 41 | +--- |
| 42 | +--- Projects organize work |
| 43 | +--- |
| 44 | +CREATE TABLE IF NOT EXISTS pgml_rust.projects( |
| 45 | + id BIGSERIAL PRIMARY KEY, |
| 46 | + name TEXT NOT NULL UNIQUE, |
| 47 | + task TEXT NOT NULL, |
| 48 | + created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT clock_timestamp(), |
| 49 | + updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT clock_timestamp() |
| 50 | +); |
| 51 | +SELECT pgml_rust.auto_updated_at('pgml_rust.projects'); |
| 52 | + |
| 53 | + |
3 | 54 | CREATE TABLE IF NOT EXISTS pgml_rust.models (
|
4 | 55 | id BIGSERIAL PRIMARY KEY,
|
| 56 | + project_id BIGINT NOT NULL REFERENCES pgml_rust.projects(id), |
5 | 57 | algorithm VARCHAR,
|
6 | 58 | data BYTEA
|
7 | 59 | );
|
| 60 | + |
| 61 | +--- |
| 62 | +--- Deployments determine which model is live |
| 63 | +--- |
| 64 | +CREATE TABLE IF NOT EXISTS pgml_rust.deployments( |
| 65 | + id BIGSERIAL PRIMARY KEY, |
| 66 | + project_id BIGINT NOT NULL, |
| 67 | + model_id BIGINT NOT NULL, |
| 68 | + strategy TEXT NOT NULL, |
| 69 | + created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT clock_timestamp(), |
| 70 | + CONSTRAINT project_id_fk FOREIGN KEY(project_id) REFERENCES pgml_rust.projects(id), |
| 71 | + CONSTRAINT model_id_fk FOREIGN KEY(model_id) REFERENCES pgml_rust.models(id) |
| 72 | +); |
| 73 | +CREATE INDEX IF NOT EXISTS deployments_project_id_created_at_idx ON pgml_rust.deployments(project_id); |
| 74 | +CREATE INDEX IF NOT EXISTS deployments_model_id_created_at_idx ON pgml_rust.deployments(model_id); |
| 75 | +SELECT pgml_rust.auto_updated_at('pgml_rust.deployments'); |
0 commit comments