小橘 d84a860d15 feat: initial ograph repo — engine (85 tests) + cli (31 tests)
Extracted from uncaged monorepo (oc-xiaoju/uncaged).
Resolves oc-xiaoju/uncaged#224.

- @uncaged/ograph: CF Worker engine (events, projections, reactions)
- @uncaged/ograph-cli: CLI for managing OGraph instances
- Removed @uncaged/oid dependency (unused)
- 116 tests, all passing
- CI: GitHub Actions

小橘 🍊(NEKO Team)
2026-04-12 23:43:56 +00:00

66 lines
1.6 KiB
SQL

-- Drop v2.0 tables
DROP TABLE IF EXISTS reactions;
DROP TABLE IF EXISTS projections;
DROP TABLE IF EXISTS reducers;
DROP TABLE IF EXISTS event_log;
DROP TABLE IF EXISTS edges;
DROP TABLE IF EXISTS nodes;
DROP TABLE IF EXISTS relation_types;
DROP TABLE IF EXISTS types;
-- v2.1 Schema
CREATE TABLE event_types (
name TEXT PRIMARY KEY,
label TEXT NOT NULL,
schema TEXT NOT NULL
);
CREATE TABLE events (
oid TEXT PRIMARY KEY,
type TEXT NOT NULL REFERENCES event_types(name),
payload TEXT NOT NULL,
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
);
CREATE INDEX idx_events_type ON events(type);
CREATE INDEX idx_events_created ON events(created_at);
CREATE TABLE event_refs (
event_oid TEXT NOT NULL REFERENCES events(oid),
property TEXT NOT NULL,
ref_oid TEXT NOT NULL,
PRIMARY KEY (event_oid, property)
);
CREATE INDEX idx_event_refs_obj ON event_refs(ref_oid);
CREATE TABLE reducers (
name TEXT PRIMARY KEY,
driven_by TEXT NOT NULL,
params TEXT NOT NULL,
filter TEXT NOT NULL,
expression TEXT NOT NULL,
initial_value TEXT
);
CREATE TABLE projections (
reducer TEXT NOT NULL REFERENCES reducers(name),
params TEXT NOT NULL,
params_hash TEXT NOT NULL,
value TEXT,
updated_by TEXT,
updated_at INTEGER,
live INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (reducer, params_hash)
);
CREATE TABLE reactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
reducer TEXT NOT NULL,
params_hash TEXT,
condition TEXT,
worker_url TEXT NOT NULL,
config TEXT NOT NULL DEFAULT '{}',
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
);
CREATE INDEX idx_reactions_reducer ON reactions(reducer);