use crate::traits::{ConsolidationAction, ConsolidationStrategy, MemoryMeta, ScoredResult};
pub struct HashDedup;
impl ConsolidationStrategy for HashDedup {
fn consolidate(
&self,
_new: &MemoryMeta,
existing: &[ScoredResult],
) -> Vec<ConsolidationAction> {
if existing.is_empty() {
vec![ConsolidationAction::Add]
} else {
vec![ConsolidationAction::Noop]
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::traits::MemoryType;
use chrono::Utc;
fn meta() -> MemoryMeta {
MemoryMeta {
id: None,
searchable_text: "test".into(),
memory_type: MemoryType::Semantic,
importance: 5,
category: None,
created_at: Utc::now(),
metadata: Default::default(),
}
}
#[test]
fn no_existing_adds() {
let dedup = HashDedup;
let actions = dedup.consolidate(&meta(), &[]);
assert_eq!(actions, vec![ConsolidationAction::Add]);
}
#[test]
fn existing_match_noops() {
let dedup = HashDedup;
let existing = vec![ScoredResult {
memory_id: 42,
score: 1.0,
raw_score: 1.0,
score_multiplier: 1.0,
}];
let actions = dedup.consolidate(&meta(), &existing);
assert_eq!(actions, vec![ConsolidationAction::Noop]);
}
}