use anyhow::Result;
use crate::memory::chunks::get_chunks_batch;
use crate::memory::config::MemoryConfig;
use crate::memory::score::store::get_scores_batch;
use super::types::{hit_from_chunk, RetrievalHit};
pub const MAX_BATCH: usize = 20;
pub fn fetch_leaves(config: &MemoryConfig, chunk_ids: &[String]) -> Result<Vec<RetrievalHit>> {
if chunk_ids.is_empty() {
return Ok(Vec::new());
}
let ids: &[String] = if chunk_ids.len() > MAX_BATCH {
&chunk_ids[..MAX_BATCH]
} else {
chunk_ids
};
let chunk_by_id = get_chunks_batch(config, ids)?;
let score_by_id = get_scores_batch(config, ids)?;
let mut out: Vec<RetrievalHit> = Vec::with_capacity(ids.len());
for id in ids {
let Some(chunk) = chunk_by_id.get(id) else {
continue;
};
let score = score_by_id.get(id).copied().unwrap_or(0.0);
let scope = chunk.metadata.source_id.clone();
out.push(hit_from_chunk(chunk, "", &scope, score));
}
Ok(out)
}
#[cfg(test)]
#[path = "fetch_tests.rs"]
mod tests;