use rusqlite::Connection;
use solo_core::{Error, Result, VectorIndex};
use crate::hnsw_id::{chunk_hnsw_id, episode_hnsw_id};
pub fn rebuild_episode_tombstones_from_sql(
conn: &Connection,
hnsw: &dyn VectorIndex,
) -> Result<usize> {
let mut stmt = conn
.prepare("SELECT rowid FROM episodes WHERE status = 'forgotten'")
.map_err(|e| Error::storage(format!("prepare forgotten episode select: {e}")))?;
let rows = stmt
.query_map([], |row| row.get::<_, i64>(0))
.map_err(|e| Error::storage(format!("query_map forgotten episodes: {e}")))?;
let mut count = 0usize;
for r in rows {
let rowid = r.map_err(|e| Error::storage(format!("forgotten episode row decode: {e}")))?;
hnsw.remove(episode_hnsw_id(rowid))?;
count += 1;
}
Ok(count)
}
pub fn rebuild_chunk_tombstones_from_sql(
conn: &Connection,
hnsw: &dyn VectorIndex,
) -> Result<usize> {
let mut stmt = conn
.prepare(
"SELECT dc.rowid \
FROM document_chunks dc \
JOIN documents d ON d.doc_id = dc.doc_id \
WHERE d.status = 'forgotten'",
)
.map_err(|e| Error::storage(format!("prepare forgotten chunks select: {e}")))?;
let rows = stmt
.query_map([], |row| row.get::<_, i64>(0))
.map_err(|e| Error::storage(format!("query_map forgotten chunks: {e}")))?;
let mut count = 0usize;
for r in rows {
let rowid = r.map_err(|e| Error::storage(format!("forgotten chunk row decode: {e}")))?;
hnsw.remove(chunk_hnsw_id(rowid))?;
count += 1;
}
Ok(count)
}