use std::sync::Arc;
use iqdb_flat::{FlatConfig, FlatIndex};
use iqdb_index::{Index, IndexCore};
use iqdb_types::{DistanceMetric, IqdbError, Result, SearchParams, VectorId};
fn arc(v: &[f32]) -> Arc<[f32]> {
Arc::from(v)
}
fn order(idx: &FlatIndex) -> Vec<u64> {
idx.search(&[0.0], &SearchParams::new(10, DistanceMetric::Euclidean))
.expect("search ok")
.into_iter()
.map(|h| match h.id {
VectorId::U64(v) => v,
VectorId::Bytes(_) => unreachable!("example inserts only U64 ids"),
})
.collect()
}
fn main() -> Result<()> {
let mut idx = FlatIndex::new(1, DistanceMetric::Euclidean, FlatConfig)?;
for id in [10u64, 20, 30] {
idx.insert(VectorId::from(id), arc(&[1.0]), None)?;
}
println!("inserted: {:?}", order(&idx));
assert_eq!(order(&idx), vec![10, 20, 30]);
idx.delete(&VectorId::from(20u64))?;
println!("after delete(20): {:?}", order(&idx));
assert_eq!(order(&idx), vec![10, 30]);
assert_eq!(idx.len(), 2);
assert_eq!(idx.delete(&VectorId::from(99u64)), Err(IqdbError::NotFound));
idx.insert(VectorId::from(20u64), arc(&[1.0]), None)?;
println!("after re-insert(20): {:?}", order(&idx));
assert_eq!(order(&idx), vec![10, 30, 20]);
Ok(())
}