use std::collections::HashMap;
use crate::memory::Memory;
pub(super) fn sanitize_fts_query(raw: &str) -> String {
let tokens: Vec<String> = raw
.split_whitespace()
.map(|token| {
let escaped = token.replace('"', "\"\"");
format!("\"{escaped}\"")
})
.collect();
if tokens.len() <= 1 {
tokens.join("")
} else {
tokens.join(" OR ")
}
}
pub(super) fn rrf_fuse(channels: &[Vec<i64>], k: f64) -> Vec<(i64, f64)> {
let mut scores: HashMap<i64, f64> = HashMap::new();
for channel in channels {
for (rank, &id) in channel.iter().enumerate() {
*scores.entry(id).or_default() += 1.0 / (k + rank as f64 + 1.0);
}
}
let mut results: Vec<_> = scores.into_iter().collect();
results.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap_or(std::cmp::Ordering::Equal));
results
}
pub(super) fn paginate_memories(memories: Vec<Memory>, limit: i64, offset: i64) -> Vec<Memory> {
let start = offset.max(0) as usize;
if start >= memories.len() {
return vec![];
}
let end = (start + limit.max(0) as usize).min(memories.len());
memories[start..end].to_vec()
}