pub(super) const MIGRATION_001_CORE_TABLES: &str = r#"
CREATE TABLE sources (
source_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
source_type TEXT NOT NULL,
uri TEXT NOT NULL,
schema_json TEXT,
options TEXT,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT)),
updated_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
CREATE TABLE embedding_sets (
set_id TEXT PRIMARY KEY,
source_id TEXT NOT NULL REFERENCES sources(source_id),
model_id TEXT NOT NULL,
text_column TEXT NOT NULL,
table_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
num_rows INTEGER,
dimensions INTEGER,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT)),
updated_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
CREATE INDEX idx_embedding_sets_source ON embedding_sets(source_id);
CREATE INDEX idx_embedding_sets_model ON embedding_sets(model_id);
CREATE INDEX idx_embedding_sets_status ON embedding_sets(status);
CREATE TABLE models (
model_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
model_type TEXT NOT NULL,
task TEXT NOT NULL,
backend TEXT,
version INTEGER NOT NULL DEFAULT 1,
source TEXT,
dimensions INTEGER,
status TEXT NOT NULL DEFAULT 'available',
metadata TEXT,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT)),
updated_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
CREATE INDEX idx_models_type ON models(model_type);
CREATE INDEX idx_models_task ON models(task);
CREATE TABLE fine_tune_jobs (
job_id TEXT PRIMARY KEY,
base_model_id TEXT NOT NULL REFERENCES models(model_id),
output_model_id TEXT,
training_source TEXT NOT NULL,
loss_type TEXT NOT NULL,
hyperparams TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
metrics TEXT,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT)),
updated_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
CREATE INDEX idx_fine_tune_jobs_status ON fine_tune_jobs(status);
CREATE TABLE eval_runs (
run_id TEXT PRIMARY KEY,
model_id TEXT NOT NULL REFERENCES models(model_id),
eval_type TEXT NOT NULL,
source_id TEXT,
metrics TEXT NOT NULL,
config TEXT,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
CREATE INDEX idx_eval_runs_model ON eval_runs(model_id);
CREATE INDEX idx_eval_runs_type ON eval_runs(eval_type);
CREATE INDEX idx_eval_runs_created ON eval_runs(created_at);
CREATE TABLE evidence_channels (
channel_name TEXT PRIMARY KEY,
schema_json TEXT NOT NULL,
priority INTEGER NOT NULL,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
INSERT INTO evidence_channels (channel_name, schema_json, priority) VALUES
('vector', '{"similarity": "Float32"}', 1),
('inference', '{"inference_model": "Utf8", "inference_task": "Utf8", "inference_confidence": "Float32"}', 2);
"#;
pub(super) const MIGRATION_002_RESULT_TABLES: &str = r#"
CREATE TABLE result_tables (
table_name TEXT PRIMARY KEY,
source_id TEXT NOT NULL,
model_id TEXT NOT NULL,
task TEXT NOT NULL,
parquet_path TEXT NOT NULL,
index_path TEXT,
dimensions INTEGER,
distance_metric TEXT DEFAULT 'cosine',
row_count INTEGER NOT NULL DEFAULT 0,
status TEXT NOT NULL DEFAULT 'building',
key_column TEXT,
text_columns TEXT,
checkpoint INTEGER,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT)),
completed_at TEXT
);
CREATE INDEX idx_result_tables_source ON result_tables(source_id);
CREATE INDEX idx_result_tables_task ON result_tables(task);
CREATE INDEX idx_result_tables_status ON result_tables(status);
"#;
pub(super) const MIGRATION_003_EVAL_COLUMNS: &str = r#"
ALTER TABLE eval_runs ADD COLUMN golden_source TEXT;
ALTER TABLE eval_runs ADD COLUMN k INTEGER;
ALTER TABLE eval_runs ADD COLUMN status TEXT NOT NULL DEFAULT 'completed';
"#;
pub(super) const MIGRATION_004_DROP_EMBEDDING_SETS: &str = r#"
DROP TABLE IF EXISTS embedding_sets;
"#;
pub(super) const MIGRATION_005_TENANT_SCOPE: &str = r#"
ALTER TABLE sources ADD COLUMN tenant_id TEXT;
ALTER TABLE models ADD COLUMN tenant_id TEXT;
ALTER TABLE fine_tune_jobs ADD COLUMN tenant_id TEXT;
ALTER TABLE eval_runs ADD COLUMN tenant_id TEXT;
ALTER TABLE result_tables ADD COLUMN tenant_id TEXT;
ALTER TABLE evidence_channels ADD COLUMN tenant_id TEXT;
CREATE INDEX idx_sources_tenant ON sources(tenant_id);
CREATE INDEX idx_models_tenant ON models(tenant_id);
CREATE INDEX idx_fine_tune_jobs_tenant ON fine_tune_jobs(tenant_id);
CREATE INDEX idx_eval_runs_tenant ON eval_runs(tenant_id);
CREATE INDEX idx_result_tables_tenant ON result_tables(tenant_id);
CREATE INDEX idx_evidence_channels_tenant ON evidence_channels(tenant_id);
"#;
pub(super) const MIGRATION_006_CHANNEL_COLUMNS: &str = r#"
CREATE TABLE evidence_channel_columns (
channel_name TEXT NOT NULL REFERENCES evidence_channels(channel_name),
column_name TEXT NOT NULL,
column_type TEXT NOT NULL,
ordinal INTEGER NOT NULL,
declared_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT)),
PRIMARY KEY (channel_name, column_name)
);
CREATE UNIQUE INDEX idx_channel_cols_ordinal
ON evidence_channel_columns(channel_name, ordinal);
INSERT INTO evidence_channel_columns(channel_name, column_name, column_type, ordinal) VALUES
('vector', 'similarity', 'Float32', 0),
('inference', 'inference_model', 'Utf8', 0),
('inference', 'inference_task', 'Utf8', 1),
('inference', 'inference_confidence', 'Float32', 2);
ALTER TABLE evidence_channels DROP COLUMN schema_json;
"#;
pub(super) const MIGRATION_007_MUTABLE_TABLES: &str = r#"
CREATE TABLE mutable_tables (
id TEXT PRIMARY KEY,
schema_json TEXT NOT NULL,
primary_key TEXT NOT NULL,
tenant_id TEXT,
user_metadata TEXT NOT NULL DEFAULT '{}',
backend_kind TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT)),
updated_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
CREATE INDEX idx_mutable_tables_tenant ON mutable_tables(tenant_id);
CREATE TABLE mutable_table_indexes (
table_id TEXT NOT NULL REFERENCES mutable_tables(id) ON DELETE CASCADE,
index_name TEXT NOT NULL,
columns TEXT NOT NULL,
-- BIGINT (8-byte) so the column decodes as `i64` on both SQLite (stores
-- INTEGER as variable-width up to 8 bytes) and Postgres (where `INTEGER`
-- is INT4 / i32, incompatible with the engine's i64 read shape).
is_unique BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (table_id, index_name)
);
"#;
pub(super) const MIGRATION_008_MUTABLE_ORDER_COLUMN: &str = r#"
ALTER TABLE mutable_tables ADD COLUMN order_column TEXT;
"#;
pub(super) const MIGRATION_010_RENAME_SOURCE_TYPE_LOCAL_TO_FILE: &str = r#"
UPDATE sources SET source_type = '"file"' WHERE source_type = '"local"';
"#;
pub(super) const MIGRATION_009_TOPICS: &str = r#"
CREATE TABLE topics (
topic_id TEXT PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
schema_json TEXT NOT NULL,
tenant_id TEXT,
broker_metadata TEXT NOT NULL DEFAULT '{}',
backing_table TEXT NOT NULL UNIQUE REFERENCES mutable_tables(id) ON DELETE RESTRICT,
created_at TEXT NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS TEXT))
);
CREATE INDEX idx_topics_tenant ON topics(tenant_id);
CREATE INDEX idx_topics_name ON topics(name);
"#;