@@ -2,6 +2,8 @@ use async_trait::async_trait;
22use chroma_blockstore:: provider:: BlockfileProvider ;
33use chroma_config:: { registry:: Registry , Configurable } ;
44use chroma_error:: ChromaError ;
5+ #[ cfg( feature = "usearch" ) ]
6+ use chroma_index:: usearch:: USearchIndexProvider ;
57use chroma_index:: {
68 config:: SpannProviderConfig ,
79 hnsw_provider:: HnswIndexProvider ,
@@ -10,17 +12,28 @@ use chroma_index::{
1012use chroma_types:: { Cmek , Collection , Segment } ;
1113
1214use crate :: distributed_spann:: { SpannSegmentWriter , SpannSegmentWriterError } ;
15+ #[ cfg( feature = "usearch" ) ]
16+ use crate :: quantized_spann:: { QuantizedSpannSegmentError , QuantizedSpannSegmentWriter } ;
1317
14- #[ derive( Debug , Clone ) ]
18+ #[ derive( Clone ) ]
1519pub struct SpannProvider {
16- pub hnsw_provider : HnswIndexProvider ,
20+ pub adaptive_search_nprobe : bool ,
1721 pub blockfile_provider : BlockfileProvider ,
1822 pub garbage_collection_context : GarbageCollectionContext ,
23+ pub hnsw_provider : HnswIndexProvider ,
1924 pub metrics : SpannMetrics ,
2025 pub pl_block_size : usize ,
21- pub adaptive_search_nprobe : bool ,
26+ #[ cfg( feature = "usearch" ) ]
27+ pub usearch_provider : USearchIndexProvider ,
2228}
2329
30+ impl std:: fmt:: Debug for SpannProvider {
31+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
32+ f. debug_struct ( "SpannProvider" ) . finish ( )
33+ }
34+ }
35+
36+ #[ cfg( not( feature = "usearch" ) ) ]
2437#[ async_trait]
2538impl Configurable < ( HnswIndexProvider , BlockfileProvider , SpannProviderConfig ) > for SpannProvider {
2639 async fn try_from_config (
@@ -36,12 +49,51 @@ impl Configurable<(HnswIndexProvider, BlockfileProvider, SpannProviderConfig)> f
3649 )
3750 . await ?;
3851 Ok ( SpannProvider {
39- hnsw_provider : config. 0 . clone ( ) ,
52+ adaptive_search_nprobe : config. 2 . adaptive_search_nprobe ,
4053 blockfile_provider : config. 1 . clone ( ) ,
4154 garbage_collection_context,
55+ hnsw_provider : config. 0 . clone ( ) ,
4256 metrics : SpannMetrics :: default ( ) ,
4357 pl_block_size : config. 2 . pl_block_size ,
58+ } )
59+ }
60+ }
61+
62+ #[ cfg( feature = "usearch" ) ]
63+ #[ async_trait]
64+ impl
65+ Configurable < (
66+ HnswIndexProvider ,
67+ BlockfileProvider ,
68+ SpannProviderConfig ,
69+ USearchIndexProvider ,
70+ ) > for SpannProvider
71+ {
72+ async fn try_from_config (
73+ config : & (
74+ HnswIndexProvider ,
75+ BlockfileProvider ,
76+ SpannProviderConfig ,
77+ USearchIndexProvider ,
78+ ) ,
79+ registry : & Registry ,
80+ ) -> Result < Self , Box < dyn ChromaError > > {
81+ let garbage_collection_context = GarbageCollectionContext :: try_from_config (
82+ & (
83+ config. 2 . pl_garbage_collection . clone ( ) ,
84+ config. 2 . hnsw_garbage_collection . clone ( ) ,
85+ ) ,
86+ registry,
87+ )
88+ . await ?;
89+ Ok ( SpannProvider {
4490 adaptive_search_nprobe : config. 2 . adaptive_search_nprobe ,
91+ blockfile_provider : config. 1 . clone ( ) ,
92+ garbage_collection_context,
93+ hnsw_provider : config. 0 . clone ( ) ,
94+ metrics : SpannMetrics :: default ( ) ,
95+ pl_block_size : config. 2 . pl_block_size ,
96+ usearch_provider : config. 3 . clone ( ) ,
4597 } )
4698 }
4799}
@@ -67,4 +119,22 @@ impl SpannProvider {
67119 )
68120 . await
69121 }
122+
123+ #[ cfg( feature = "usearch" ) ]
124+ pub async fn write_quantized (
125+ & self ,
126+ collection : & Collection ,
127+ vector_segment : & Segment ,
128+ record_segment : & Segment ,
129+ ) -> Result < QuantizedSpannSegmentWriter , QuantizedSpannSegmentError > {
130+ QuantizedSpannSegmentWriter :: from_segment (
131+ self . pl_block_size ,
132+ collection,
133+ vector_segment,
134+ record_segment,
135+ & self . blockfile_provider ,
136+ & self . usearch_provider ,
137+ )
138+ . await
139+ }
70140}
0 commit comments