66 lines
3.7 KiB
Plaintext
66 lines
3.7 KiB
Plaintext
|
|
-- Migration 004: RAG (Retrieval-Augmented Generation)
|
||
|
|
-- Creates tables for document storage and semantic search
|
||
|
|
|
||
|
|
-- Documents table
|
||
|
|
DEFINE TABLE documents SCHEMAFULL
|
||
|
|
PERMISSIONS
|
||
|
|
FOR select WHERE tenant_id = $auth.tenant_id
|
||
|
|
FOR create, update, delete WHERE tenant_id = $auth.tenant_id;
|
||
|
|
|
||
|
|
DEFINE FIELD id ON TABLE documents TYPE record<documents>;
|
||
|
|
DEFINE FIELD tenant_id ON TABLE documents TYPE string ASSERT $value != NONE;
|
||
|
|
DEFINE FIELD project_id ON TABLE documents TYPE option<string>;
|
||
|
|
DEFINE FIELD title ON TABLE documents TYPE string ASSERT $value != NONE;
|
||
|
|
DEFINE FIELD content ON TABLE documents TYPE string ASSERT $value != NONE;
|
||
|
|
DEFINE FIELD content_type ON TABLE documents TYPE string ASSERT $value INSIDE ["markdown", "code", "text", "json"] DEFAULT "text";
|
||
|
|
DEFINE FIELD metadata ON TABLE documents TYPE object DEFAULT {};
|
||
|
|
DEFINE FIELD embedding ON TABLE documents TYPE option<array<float>>;
|
||
|
|
DEFINE FIELD source_path ON TABLE documents TYPE option<string>;
|
||
|
|
DEFINE FIELD tags ON TABLE documents TYPE array<string> DEFAULT [];
|
||
|
|
DEFINE FIELD created_at ON TABLE documents TYPE datetime DEFAULT time::now();
|
||
|
|
DEFINE FIELD updated_at ON TABLE documents TYPE datetime DEFAULT time::now() VALUE time::now();
|
||
|
|
|
||
|
|
DEFINE INDEX idx_documents_tenant ON TABLE documents COLUMNS tenant_id;
|
||
|
|
DEFINE INDEX idx_documents_project ON TABLE documents COLUMNS project_id;
|
||
|
|
DEFINE INDEX idx_documents_content_type ON TABLE documents COLUMNS content_type;
|
||
|
|
DEFINE INDEX idx_documents_tags ON TABLE documents COLUMNS tags;
|
||
|
|
|
||
|
|
-- Vector index for semantic search (HNSW)
|
||
|
|
-- Note: SurrealDB 2.x+ supports vector search with MTREE indexes
|
||
|
|
DEFINE INDEX idx_documents_embedding ON TABLE documents FIELDS embedding MTREE DIMENSION 1536;
|
||
|
|
|
||
|
|
-- Document chunks table (for large documents split into chunks)
|
||
|
|
DEFINE TABLE document_chunks SCHEMAFULL
|
||
|
|
PERMISSIONS
|
||
|
|
FOR select WHERE $parent.tenant_id = $auth.tenant_id
|
||
|
|
FOR create, update, delete WHERE $parent.tenant_id = $auth.tenant_id;
|
||
|
|
|
||
|
|
DEFINE FIELD id ON TABLE document_chunks TYPE record<document_chunks>;
|
||
|
|
DEFINE FIELD document_id ON TABLE document_chunks TYPE string ASSERT $value != NONE;
|
||
|
|
DEFINE FIELD chunk_index ON TABLE document_chunks TYPE int ASSERT $value >= 0;
|
||
|
|
DEFINE FIELD content ON TABLE document_chunks TYPE string ASSERT $value != NONE;
|
||
|
|
DEFINE FIELD embedding ON TABLE document_chunks TYPE option<array<float>>;
|
||
|
|
DEFINE FIELD token_count ON TABLE document_chunks TYPE option<int>;
|
||
|
|
DEFINE FIELD created_at ON TABLE document_chunks TYPE datetime DEFAULT time::now();
|
||
|
|
|
||
|
|
DEFINE INDEX idx_document_chunks_document ON TABLE document_chunks COLUMNS document_id;
|
||
|
|
DEFINE INDEX idx_document_chunks_document_index ON TABLE document_chunks COLUMNS document_id, chunk_index UNIQUE;
|
||
|
|
DEFINE INDEX idx_document_chunks_embedding ON TABLE document_chunks FIELDS embedding MTREE DIMENSION 1536;
|
||
|
|
|
||
|
|
-- Search history table (for analytics and improvement)
|
||
|
|
DEFINE TABLE search_history SCHEMAFULL
|
||
|
|
PERMISSIONS
|
||
|
|
FOR select WHERE tenant_id = $auth.tenant_id
|
||
|
|
FOR create WHERE tenant_id = $auth.tenant_id;
|
||
|
|
|
||
|
|
DEFINE FIELD id ON TABLE search_history TYPE record<search_history>;
|
||
|
|
DEFINE FIELD tenant_id ON TABLE search_history TYPE string ASSERT $value != NONE;
|
||
|
|
DEFINE FIELD query ON TABLE search_history TYPE string ASSERT $value != NONE;
|
||
|
|
DEFINE FIELD results_count ON TABLE search_history TYPE int DEFAULT 0;
|
||
|
|
DEFINE FIELD top_result_id ON TABLE search_history TYPE option<string>;
|
||
|
|
DEFINE FIELD search_time_ms ON TABLE search_history TYPE int;
|
||
|
|
DEFINE FIELD created_at ON TABLE search_history TYPE datetime DEFAULT time::now();
|
||
|
|
|
||
|
|
DEFINE INDEX idx_search_history_tenant ON TABLE search_history COLUMNS tenant_id;
|
||
|
|
DEFINE INDEX idx_search_history_created ON TABLE search_history COLUMNS created_at;
|