use crate::db::SqliteStore;
use anyhow::Result;
#[derive(Debug, Clone)]
pub struct UpdateStats {
pub files_processed: i32,
pub chunks_processed: i32,
pub embeddings_generated: i32,
}
pub async fn get_last_indexed_tree(store: &SqliteStore, worktree_id: i64) -> Result<String> {
store
.run(move |conn| {
use rusqlite::{params, OptionalExtension};
let result: Option<String> = conn
.query_row(
"SELECT tree_sha FROM index_state WHERE worktree_id = ?1",
params![worktree_id],
|row| row.get(0),
)
.optional()?;
Ok(result.unwrap_or_else(|| "init".to_string()))
})
.await
}
pub async fn update_index_state(
store: &SqliteStore,
worktree_id: i64,
tree_sha: &str,
stats: &UpdateStats,
) -> Result<()> {
let tree_sha = tree_sha.to_string();
let chunks_processed = stats.chunks_processed;
let embeddings_generated = stats.embeddings_generated;
store
.run(move |conn| {
use rusqlite::params;
conn.execute(
r#"
INSERT INTO index_state
(worktree_id, tree_sha, last_indexed, chunks_processed, embeddings_generated)
VALUES (?1, ?2, datetime('now'), ?3, ?4)
ON CONFLICT (worktree_id) DO UPDATE
SET
tree_sha = excluded.tree_sha,
last_indexed = datetime('now'),
chunks_processed = excluded.chunks_processed,
embeddings_generated = excluded.embeddings_generated
"#,
params![
worktree_id,
tree_sha,
chunks_processed,
embeddings_generated,
],
)?;
Ok(())
})
.await
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_update_stats_creation() {
let stats = UpdateStats {
files_processed: 100,
chunks_processed: 500,
embeddings_generated: 500,
};
assert_eq!(stats.files_processed, 100);
assert_eq!(stats.chunks_processed, 500);
assert_eq!(stats.embeddings_generated, 500);
}
#[test]
fn test_update_stats_clone() {
let stats = UpdateStats {
files_processed: 50,
chunks_processed: 250,
embeddings_generated: 250,
};
let cloned = stats.clone();
assert_eq!(cloned.files_processed, 50);
assert_eq!(cloned.chunks_processed, 250);
assert_eq!(cloned.embeddings_generated, 250);
}
#[test]
fn test_update_stats_debug() {
let stats = UpdateStats {
files_processed: 10,
chunks_processed: 50,
embeddings_generated: 50,
};
let debug_str = format!("{:?}", stats);
assert!(debug_str.contains("files_processed"));
assert!(debug_str.contains("chunks_processed"));
assert!(debug_str.contains("embeddings_generated"));
}
}