CREATE TABLE files ( id INTEGER PRIMARY KEY, path TEXT NOT NULL UNIQUE, language TEXT NOT NULL, package TEXT, hash TEXT NOT NULL, indexed_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE symbols ( id INTEGER PRIMARY KEY, file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE, name TEXT NOT NULL, kind TEXT NOT NULL CHECK(kind IN ( 'function', 'method', 'class', 'type', 'interface', 'constant', 'variable', 'constructor' )), line INTEGER NOT NULL, line_end INTEGER, col INTEGER, col_end INTEGER, exported BOOLEAN, parent_id INTEGER REFERENCES symbols(id), UNIQUE(file_id, name, kind, line) ); CREATE INDEX idx_symbols_name ON symbols(name); CREATE INDEX idx_symbols_kind ON symbols(kind); CREATE INDEX idx_symbols_file_line ON symbols(file_id, line); CREATE INDEX idx_symbols_parent ON symbols(parent_id); CREATE INDEX idx_symbols_exported ON symbols(exported, kind); CREATE INDEX idx_files_path ON files(path); CREATE INDEX idx_files_language ON files(language); CREATE INDEX idx_files_package ON files(package); -- FTS5 virtual table for full-text search of file contents. -- content is stored here (not external content), keyed by file_id. CREATE VIRTUAL TABLE file_contents USING fts5( file_id UNINDEXED, content, tokenize='porter unicode61' );