use aletheiadb::core::id::NodeId;
use aletheiadb::index::vector::{DistanceMetric, HnswIndexBuilder, VectorIndex};
#[test]
fn test_issue_207_update_optimization() {
let index = HnswIndexBuilder::new(4, DistanceMetric::Cosine)
.build()
.unwrap();
let node = NodeId::new(1).unwrap();
let vector_a = vec![1.0, 0.0, 0.0, 0.0];
let vector_b = vec![0.0, 1.0, 0.0, 0.0];
index.add(node, &vector_a).unwrap();
assert_eq!(index.len(), 1);
index.add(node, &vector_b).unwrap();
assert_eq!(index.len(), 1, "Update should not increase vector count");
let results = index.search(&vector_b, 1).unwrap();
assert_eq!(results.len(), 1);
assert_eq!(results[0].0, node);
assert!(
results[0].1 > 0.99,
"Should find updated vector B with high similarity"
);
let results_a = index.search(&vector_a, 1).unwrap();
assert_eq!(results_a[0].0, node);
assert!(
results_a[0].1 < 0.5,
"Old vector A should have low similarity"
);
}
#[test]
fn test_issue_207_delete_readd_flow() {
let index = HnswIndexBuilder::new(4, DistanceMetric::Cosine)
.build()
.unwrap();
let node = NodeId::new(1).unwrap();
index.add(node, &[1.0, 0.0, 0.0, 0.0]).unwrap();
assert_eq!(index.len(), 1);
index.remove(node).unwrap();
assert_eq!(index.len(), 0);
index.add(node, &[0.0, 1.0, 0.0, 0.0]).unwrap();
assert_eq!(index.len(), 1);
let results = index.search(&[0.0, 1.0, 0.0, 0.0], 1).unwrap();
assert_eq!(results.len(), 1);
assert_eq!(results[0].0, node);
assert!(results[0].1 > 0.99);
}
#[test]
fn test_issue_207_update_performance() {
let index = HnswIndexBuilder::new(128, DistanceMetric::Cosine)
.build()
.unwrap();
let node = NodeId::new(1).unwrap();
let mut vector = vec![0.0f32; 128];
vector[0] = 1.0;
index.add(node, &vector).unwrap();
let start = std::time::Instant::now();
for i in 1..=100 {
let mut updated_vector = vec![0.0f32; 128];
updated_vector[i % 128] = 1.0;
index.add(node, &updated_vector).unwrap();
}
let duration = start.elapsed();
assert_eq!(index.len(), 1, "Should still have exactly 1 vector");
println!(
"100 updates completed in {:?} ({:.2} µs/update)",
duration,
duration.as_micros() as f64 / 100.0
);
assert!(
duration.as_millis() < 1000,
"100 updates took {:?}, may indicate performance regression",
duration
);
}