use std::sync::Arc;
use fathomdb_embedder_api::{Embedder, EmbedderError, EmbedderIdentity, Vector};
use fathomdb_engine::{Engine, Explanation, OpenedEngine, SearchResult, SoftFallback};
use fathomdb_schema::SQLITE_SUFFIX;
use tempfile::TempDir;
#[derive(Clone, Debug)]
struct FixedEmbedder;
impl Embedder for FixedEmbedder {
fn identity(&self) -> EmbedderIdentity {
EmbedderIdentity::new("deterministic", "rev-a", 8)
}
fn embed(&self, _text: &str) -> Result<Vector, EmbedderError> {
let mut v = vec![0.0_f32; 8];
v[0] = 1.0;
Ok(v)
}
}
fn opened(name: &str) -> (TempDir, OpenedEngine) {
let dir = TempDir::new().unwrap();
let path = dir.path().join(format!("{name}{SQLITE_SUFFIX}"));
let opened = Engine::open_with_embedder_for_test(&path, Arc::new(FixedEmbedder)).expect("open");
(dir, opened)
}
#[test]
fn search_result_exposes_optional_soft_fallback_and_explanation() {
let (_dir, opened) = opened("shape_default");
let r: SearchResult = opened.engine.search("anything").expect("search");
let _: u64 = r.projection_cursor;
let _: Option<SoftFallback> = r.soft_fallback.clone();
let _: Option<Explanation> = r.explanation.clone();
assert!(r.explanation.is_none(), "default search must suppress the explanation sidecar");
opened.engine.close().unwrap();
}
#[test]
fn search_explained_populates_the_explanation_sidecar() {
let (_dir, opened) = opened("shape_explained");
let r = opened
.engine
.search_explained("anything", None, 0, false, 0.3, 0)
.expect("search_explained");
assert!(r.explanation.is_some(), "search_explained must populate the explanation sidecar");
opened.engine.close().unwrap();
}