Add Schema files
This commit is contained in:
parent
122085b1f8
commit
779ac57f50
|
|
@ -0,0 +1,2 @@
|
||||||
|
CREATE ROLE kompanion LOGIN PASSWORD 'komp';
|
||||||
|
CREATE DATABASE kompanion OWNER kompanion;
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
CREATE EXTENSION IF NOT EXISTS vector;
|
||||||
|
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
CREATE TABLE IF NOT EXISTS namespaces (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
name TEXT UNIQUE NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS memory_items (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
namespace_id UUID NOT NULL REFERENCES namespaces(id) ON DELETE CASCADE,
|
||||||
|
key TEXT,
|
||||||
|
content TEXT NOT NULL,
|
||||||
|
metadata JSONB NOT NULL DEFAULT '{}',
|
||||||
|
tags TEXT[] NOT NULL DEFAULT '{}',
|
||||||
|
revision INT NOT NULL DEFAULT 1,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||||
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||||
|
expires_at TIMESTAMPTZ,
|
||||||
|
deleted_at TIMESTAMPTZ,
|
||||||
|
last_accessed_at TIMESTAMPTZ
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS memory_chunks (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
item_id UUID NOT NULL REFERENCES memory_items(id) ON DELETE CASCADE,
|
||||||
|
seq INT NOT NULL,
|
||||||
|
content TEXT NOT NULL,
|
||||||
|
expires_at TIMESTAMPTZ,
|
||||||
|
deleted_at TIMESTAMPTZ,
|
||||||
|
content_tsv tsvector GENERATED ALWAYS AS (to_tsvector('english', content)) STORED
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS embeddings (
|
||||||
|
id BIGSERIAL PRIMARY KEY,
|
||||||
|
chunk_id UUID NOT NULL REFERENCES memory_chunks(id) ON DELETE CASCADE,
|
||||||
|
model TEXT NOT NULL,
|
||||||
|
dim INT NOT NULL,
|
||||||
|
vector VECTOR(1536),
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||||
|
UNIQUE(chunk_id, model)
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS ux_items_ns_key
|
||||||
|
ON memory_items(namespace_id, key)
|
||||||
|
WHERE key IS NOT NULL;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS ix_chunks_item ON memory_chunks(item_id);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_chunks_content_tsv
|
||||||
|
ON memory_chunks USING GIN(content_tsv);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS ix_embed_model_dim ON embeddings(model, dim);
|
||||||
|
|
||||||
|
-- per-model ANN index (duplicate with each concrete model name)
|
||||||
|
CREATE INDEX IF NOT EXISTS ix_embed_vec_model_default
|
||||||
|
ON embeddings USING ivfflat (vector vector_cosine_ops)
|
||||||
|
WHERE model = 'default-emb';
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
DB_NAME=${1:-kompanion}
|
||||||
|
ROLE=${ROLE:-kompanion}
|
||||||
|
PASS=${PASS:-komp}
|
||||||
|
|
||||||
|
psql -v ON_ERROR_STOP=1 <<SQL
|
||||||
|
DO $$ BEGIN
|
||||||
|
PERFORM 1 FROM pg_roles WHERE rolname = '$ROLE';
|
||||||
|
IF NOT FOUND THEN EXECUTE format('CREATE ROLE %I LOGIN PASSWORD %L', '$ROLE', '$PASS'); END IF;
|
||||||
|
END $$;
|
||||||
|
DO $$ BEGIN
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = '$DB_NAME') THEN
|
||||||
|
EXECUTE format('CREATE DATABASE %I OWNER %I', '$DB_NAME', '$ROLE');
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
for f in db/init/*.sql; do
|
||||||
|
echo "Applying $f"
|
||||||
|
psql -d "$DB_NAME" -f "$f"
|
||||||
|
done
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
DB_NAME=${1:-kompanion_test}
|
||||||
|
ROLE=${ROLE:-kompanion}
|
||||||
|
PASS=${PASS:-komup}
|
||||||
|
|
||||||
|
psql -v ON_ERROR_STOP=1 <<SQL
|
||||||
|
DROP DATABASE IF EXISTS "$DB_NAME";
|
||||||
|
CREATE DATABASE "$DB_NAME" OWNER "$ROLE";
|
||||||
|
SQL
|
||||||
|
|
||||||
|
for f in db/init/*.sql; do
|
||||||
|
echo "Applying $f"
|
||||||
|
psql -d "$DB_NAME" -f "$f"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✓ Database $DB_NAME initialized."
|
||||||
Loading…
Reference in New Issue