use laurus::storage::memory::{MemoryStorage, MemoryStorageConfig};
use laurus::vector::DistanceMetric;
use laurus::vector::StoredVector;
use laurus::vector::VectorFieldConfig;
use laurus::vector::index::field::{VectorFieldReader, VectorFieldWriter};
use laurus::vector::index::hnsw::segment::manager::{SegmentManager, SegmentManagerConfig};
use laurus::vector::index::segmented_field::SegmentedVectorField;
use laurus::vector::{FieldOption, HnswOption};
use std::sync::Arc;
#[tokio::test]
async fn test_segmented_field_manual_merge() -> Result<(), Box<dyn std::error::Error>> {
let storage = Arc::new(MemoryStorage::new(MemoryStorageConfig::default()));
let manager_config = SegmentManagerConfig {
max_segments: 2, merge_factor: 2, min_vectors_per_segment: 1, ..Default::default()
};
let manager = Arc::new(SegmentManager::new(manager_config, storage.clone())?);
let field_config = VectorFieldConfig {
vector: Some(FieldOption::Hnsw(HnswOption {
dimension: 4,
distance: DistanceMetric::Euclidean,
m: 16, ef_construction: 200, base_weight: 1.0,
quantizer: None,
embedder: None,
})),
lexical: None,
};
let field = SegmentedVectorField::create(
"test_field",
field_config,
manager.clone(),
storage.clone(),
None,
)?;
field
.add_stored_vector(1, &StoredVector::new(vec![1.0, 0.0, 0.0, 0.0]), 0)
.await?;
field.flush().await?;
field
.add_stored_vector(2, &StoredVector::new(vec![0.0, 1.0, 0.0, 0.0]), 0)
.await?;
field.flush().await?;
field
.add_stored_vector(3, &StoredVector::new(vec![0.0, 0.0, 1.0, 0.0]), 0)
.await?;
field.flush().await?;
let segments = manager.list_segments();
assert_eq!(segments.len(), 3, "Should have 3 segments before merge");
field.perform_merge()?;
let segments_after = manager.list_segments();
assert_eq!(
segments_after.len(),
2,
"Should have 2 segments after merge"
);
let stats = field.stats()?; assert_eq!(stats.vector_count, 3);
Ok(())
}