Files
Kigi-CLI/crates/codegen/kigi-memory/src/schema.rs
T
ZacharyZhang-NY a02b555e66 docs(comments): rewrite comments across all crates to the guidelines
Sweep every first-party crate source (1956 .rs files) to the project comment
guidelines: delete redundant restatements, decorative banners, change
narration, and end-of-line comments; keep and tighten the crucial ones
(invariants, bug rationale, SAFETY blocks, ported-source attribution).

No functional code changed. Every edit is proven comment-only against the
prior tree by a comment-stripping lexer (string/char/raw-string aware) plus a
separate doctest-fence check. Where removing a comment made rustfmt or clippy
want to re-lay-out adjacent code, the minimal triggering comment is restored so
code tokens stay byte-identical.

Gates green: cargo fmt --all --check (0 diffs), cargo check and cargo clippy
--workspace --all-targets (0 warnings).

Adds scripts/check_codegen_comment_guidelines.py — the enforcement gate for
these guidelines (flags banners, end-of-line comments, change narration, and
commented-out code).
2026-07-23 16:55:39 -04:00

88 lines
2.8 KiB
Rust

//! SQL schema for the memory index: `meta` key-value settings, `chunks` text
//! with blake3 content hashes, a contentless FTS5 `chunks_fts` for BM25
//! keyword search, and — only when sqlite-vec loaded — a vec0 `chunks_vec`
//! for KNN vector search.
/// Bump on a breaking change that requires dropping and recreating tables.
pub const SCHEMA_VERSION: u32 = 1;
/// `dimensions` sizes the `chunks_vec` embedding column; when `vec_available`
/// is false that table is omitted entirely.
///
/// Connection pragmas (busy_timeout, journal_mode) deliberately live on the
/// open path (`kigi_sqlite_journal::JournalMode::open`) instead of here,
/// because the journal mode depends on the database's filesystem.
pub fn schema_sql(dimensions: usize, vec_available: bool) -> String {
let mut sql = r#"
CREATE TABLE IF NOT EXISTS meta (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS chunks (
rowid INTEGER PRIMARY KEY AUTOINCREMENT,
id TEXT UNIQUE NOT NULL,
path TEXT NOT NULL,
start_line INTEGER NOT NULL,
end_line INTEGER NOT NULL,
text TEXT NOT NULL,
hash TEXT NOT NULL,
source TEXT NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
access_count INTEGER DEFAULT 0,
last_accessed INTEGER
);
CREATE INDEX IF NOT EXISTS idx_chunks_path ON chunks(path);
CREATE INDEX IF NOT EXISTS idx_chunks_hash ON chunks(hash);
CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(text, content='');
INSERT OR IGNORE INTO meta(key, value) VALUES ('reindex_claim', '');
"#
.to_string();
if vec_available {
sql.push_str(&format!(
"\nCREATE VIRTUAL TABLE IF NOT EXISTS chunks_vec USING vec0(\n \
chunk_id TEXT PRIMARY KEY,\n \
embedding FLOAT[{dimensions}]\n);\n"
));
}
sql
}
pub const UPSERT_META_SQL: &str = "INSERT OR REPLACE INTO meta(key, value) VALUES (?1, ?2)";
pub const GET_META_SQL: &str = "SELECT value FROM meta WHERE key = ?1";
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_schema_sql_without_vec() {
let sql = schema_sql(1536, false);
assert!(sql.contains("CREATE TABLE IF NOT EXISTS chunks"));
assert!(sql.contains("CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts"));
assert!(!sql.contains("chunks_vec"));
// Connection pragmas live on the open path, not in the schema batch.
assert!(!sql.contains("PRAGMA"));
}
#[test]
fn test_schema_sql_with_vec() {
let sql = schema_sql(384, true);
assert!(sql.contains("chunks_vec"));
assert!(sql.contains("FLOAT[384]"));
}
#[test]
fn test_schema_sql_different_dimensions() {
let sql = schema_sql(768, true);
assert!(sql.contains("FLOAT[768]"));
}
}