@@ -97,30 +97,42 @@ pub struct VectorIndex {
9797impl VectorIndex {
9898 /// Create a new vector index
9999 pub fn new (
100- name : & str ,
101- dimensions : usize ,
100+ name : & str ,
101+ dimensions : usize ,
102102 distance_metric : DistanceMetric ,
103103 metrics : Option < Arc < MetricsCollector > > ,
104- ) -> Self {
105- // Determine bits per dimension based on dimensions
106- // We want to keep the total bits under 64 (for u64 hilbert index)
107- let max_total_bits = 60 ; // Leave some room for safety
108- let bits_per_dimension = std:: cmp:: min (
109- 10 , // Maximum reasonable value
110- max_total_bits / dimensions
111- ) ;
112-
104+ ) -> Result < Self , String > {
105+ let max_total_bits = 60 ;
106+
107+ if dimensions == 0 {
108+ return Err ( "dimensions must be greater than zero" . to_string ( ) ) ;
109+ }
110+ if dimensions > max_total_bits {
111+ return Err ( format ! (
112+ "dimensions ({}) exceed maximum supported {}" ,
113+ dimensions, max_total_bits
114+ ) ) ;
115+ }
116+
117+ let bits_per_dimension = std:: cmp:: min ( 10 , max_total_bits / dimensions) ;
118+ if bits_per_dimension == 0 {
119+ return Err ( format ! (
120+ "calculated bits_per_dimension is zero for {} dimensions" ,
121+ dimensions
122+ ) ) ;
123+ }
124+
113125 let hilbert_curve = HilbertCurve :: new ( dimensions, bits_per_dimension) ;
114-
115- Self {
126+
127+ Ok ( Self {
116128 name : name. to_string ( ) ,
117129 vectors : RwLock :: new ( HashMap :: new ( ) ) ,
118130 hilbert_curve,
119131 hilbert_map : RwLock :: new ( HashMap :: new ( ) ) ,
120132 dimensions,
121133 distance_metric,
122134 metrics,
123- }
135+ } )
124136 }
125137
126138 /// Convert a vector to a Hilbert index
@@ -432,7 +444,7 @@ mod tests {
432444 use rand:: Rng ;
433445
434446 async fn create_test_index ( vector_count : usize , dimensions : usize ) -> VectorIndex {
435- let index = VectorIndex :: new ( "test_index" , dimensions, DistanceMetric :: Euclidean , None ) ;
447+ let index = VectorIndex :: new ( "test_index" , dimensions, DistanceMetric :: Euclidean , None ) . unwrap ( ) ;
436448
437449 // Add random vectors
438450 for _ in 0 ..vector_count {
@@ -454,7 +466,7 @@ mod tests {
454466
455467 #[ tokio:: test]
456468 async fn test_remove ( ) {
457- let index = VectorIndex :: new ( "test_remove" , 3 , DistanceMetric :: Euclidean , None ) ;
469+ let index = VectorIndex :: new ( "test_remove" , 3 , DistanceMetric :: Euclidean , None ) . unwrap ( ) ;
458470
459471 // Add a vector
460472 let vector = Vector :: random ( 3 ) ;
@@ -512,7 +524,7 @@ mod tests {
512524 // Test each metric
513525 for metric in [ DistanceMetric :: Euclidean , DistanceMetric :: Cosine ,
514526 DistanceMetric :: Manhattan , DistanceMetric :: Hamming ] . iter ( ) {
515- let index = VectorIndex :: new ( "test_metric" , dimensions, * metric, None ) ;
527+ let index = VectorIndex :: new ( "test_metric" , dimensions, * metric, None ) . unwrap ( ) ;
516528
517529 // Add all vectors
518530 for v in & vectors {
0 commit comments