Skip to content

Commit 7306dde

Browse files
authored
More features from Python going into Rust (#296)
1 parent 7a989d7 commit 7306dde

File tree

2 files changed

+397
-141
lines changed

2 files changed

+397
-141
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,75 @@
11
CREATE SCHEMA IF NOT EXISTS pgml_rust;
22

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+
354
CREATE TABLE IF NOT EXISTS pgml_rust.models (
455
id BIGSERIAL PRIMARY KEY,
56+
project_id BIGINT NOT NULL REFERENCES pgml_rust.projects(id),
557
algorithm VARCHAR,
658
data BYTEA
759
);
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

Comments
 (0)