小橘 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

45 lines
1.2 KiB
SQL

-- Drop all v1 tables
DROP TABLE IF EXISTS subscriptions;
DROP TABLE IF EXISTS events;
DROP TABLE IF EXISTS edges;
DROP TABLE IF EXISTS objects;
DROP TABLE IF EXISTS relation_types;
DROP TABLE IF EXISTS object_types;
-- v2 Schema
CREATE TABLE types (
name TEXT PRIMARY KEY,
kind TEXT NOT NULL CHECK(kind IN ('obj', 'evt')),
label TEXT NOT NULL
);
CREATE TABLE relation_types (
name TEXT PRIMARY KEY,
from_kind TEXT NOT NULL CHECK(from_kind IN ('obj', 'evt')),
to_kind TEXT NOT NULL CHECK(to_kind IN ('obj', 'evt')),
inverse TEXT NOT NULL,
UNIQUE(inverse)
);
CREATE TABLE nodes (
oid TEXT PRIMARY KEY,
type TEXT NOT NULL REFERENCES types(name),
data TEXT,
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
);
CREATE INDEX idx_nodes_type ON nodes(type);
CREATE INDEX idx_nodes_created ON nodes(created_at);
CREATE TABLE edges (
oid TEXT PRIMARY KEY,
from_oid TEXT NOT NULL REFERENCES nodes(oid),
rel TEXT NOT NULL REFERENCES relation_types(name),
to_oid TEXT NOT NULL REFERENCES nodes(oid),
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
UNIQUE(from_oid, rel, to_oid)
);
CREATE INDEX idx_edges_from ON edges(from_oid);
CREATE INDEX idx_edges_to ON edges(to_oid);
CREATE INDEX idx_edges_rel ON edges(rel);