Skip to main content

engram_storage/
consolidation.rs

1use rusqlite::params;
2
3use crate::database::Database;
4use crate::error::StorageError;
5
6impl Database {
7    pub fn log_consolidation(
8        &self,
9        id: &str,
10        action: &str,
11        memory_ids: &[String],
12        reason: Option<&str>,
13        performed_by: &str,
14        timestamp: &str,
15    ) -> Result<(), StorageError> {
16        let memory_ids_json = serde_json::to_string(memory_ids)
17            .map_err(|err| StorageError::DatabaseUnavailable(err.to_string()))?;
18        self.connection().execute(
19            "INSERT INTO consolidation_log (id, action, memory_ids, reason, performed_at, performed_by)
20             VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
21            params![id, action, memory_ids_json, reason, timestamp, performed_by],
22        )?;
23        Ok(())
24    }
25
26    pub fn track_search(
27        &self,
28        memory_id: &str,
29        query_id: &str,
30        timestamp: &str,
31    ) -> Result<(), StorageError> {
32        self.connection().execute(
33            "INSERT INTO feedback_tracking (memory_id, query_id, searched_at) VALUES (?1, ?2, ?3)",
34            params![memory_id, query_id, timestamp],
35        )?;
36        Ok(())
37    }
38
39    pub fn mark_judged(&self, memory_id: &str, timestamp: &str) -> Result<(), StorageError> {
40        self.connection().execute(
41            "UPDATE feedback_tracking SET judged = TRUE, judged_at = ?1
42             WHERE memory_id = ?2 AND judged = FALSE",
43            params![timestamp, memory_id],
44        )?;
45        Ok(())
46    }
47
48    pub fn get_pending_judgments(&self, limit: usize) -> Result<Vec<String>, StorageError> {
49        let mut statement = self.connection().prepare(
50            "SELECT memory_id FROM feedback_tracking \
51             GROUP BY memory_id HAVING MAX(judged) = 0 LIMIT ?1",
52        )?;
53        let rows = statement.query_map(params![limit as i64], |row| row.get(0))?;
54        let mut results = Vec::new();
55        for row in rows {
56            results.push(row?);
57        }
58        Ok(results)
59    }
60}