@@ -21,6 +21,7 @@ use chroma_types::F32_METADATA;
21
21
use chroma_types:: FULL_TEXT_PLS ;
22
22
use chroma_types:: STRING_METADATA ;
23
23
use chroma_types:: U32_METADATA ;
24
+ use chroma_types:: { CollectionSchema , ValueType } ;
24
25
use chroma_types:: { MaterializedLogOperation , MetadataValue , Segment , SegmentUuid } ;
25
26
use core:: panic;
26
27
use roaring:: RoaringBitmap ;
@@ -37,6 +38,7 @@ pub struct MetadataSegmentWriter<'me> {
37
38
pub ( crate ) f32_metadata_index_writer : Option < MetadataIndexWriter < ' me > > ,
38
39
pub ( crate ) u32_metadata_index_writer : Option < MetadataIndexWriter < ' me > > ,
39
40
pub id : SegmentUuid ,
41
+ pub schema : Option < HashMap < String , HashMap < ValueType , CollectionSchema > > > ,
40
42
}
41
43
42
44
impl Debug for MetadataSegmentWriter < ' _ > {
@@ -102,6 +104,7 @@ impl<'me> MetadataSegmentWriter<'me> {
102
104
database_id : & DatabaseUuid ,
103
105
segment : & Segment ,
104
106
blockfile_provider : & BlockfileProvider ,
107
+ schema : Option < HashMap < String , HashMap < ValueType , CollectionSchema > > > ,
105
108
) -> Result < MetadataSegmentWriter < ' me > , MetadataSegmentError > {
106
109
if segment. r#type != SegmentType :: BlockfileMetadata {
107
110
return Err ( MetadataSegmentError :: InvalidSegmentType ) ;
@@ -316,6 +319,7 @@ impl<'me> MetadataSegmentWriter<'me> {
316
319
f32_metadata_index_writer : Some ( f32_metadata_index_writer) ,
317
320
u32_metadata_index_writer : Some ( u32_metadata_index_writer) ,
318
321
id : segment. id ,
322
+ schema,
319
323
} )
320
324
}
321
325
@@ -325,6 +329,37 @@ impl<'me> MetadataSegmentWriter<'me> {
325
329
key : & MetadataValue ,
326
330
offset_id : u32 ,
327
331
) -> Result < ( ) , MetadataIndexError > {
332
+ let mut should_index = true ;
333
+ if let Some ( schema) = & self . schema {
334
+ let schema_key = prefix;
335
+ if let Some ( value_type_map) = schema. get ( schema_key) {
336
+ match key {
337
+ MetadataValue :: Str ( _) => {
338
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: String ) {
339
+ should_index = value_type_map. metadata_index ;
340
+ }
341
+ }
342
+ MetadataValue :: Int ( _) => {
343
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: Int ) {
344
+ should_index = value_type_map. metadata_index ;
345
+ }
346
+ }
347
+ MetadataValue :: Float ( _) => {
348
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: Float ) {
349
+ should_index = value_type_map. metadata_index ;
350
+ }
351
+ }
352
+ MetadataValue :: Bool ( _) => {
353
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: Boolean ) {
354
+ should_index = value_type_map. metadata_index ;
355
+ }
356
+ }
357
+ }
358
+ }
359
+ }
360
+ if !should_index {
361
+ return Ok ( ( ) ) ;
362
+ }
328
363
match key {
329
364
MetadataValue :: Str ( v) => {
330
365
match & self . string_metadata_index_writer {
@@ -391,6 +426,37 @@ impl<'me> MetadataSegmentWriter<'me> {
391
426
key : & MetadataValue ,
392
427
offset_id : u32 ,
393
428
) -> Result < ( ) , MetadataIndexError > {
429
+ let mut should_index = true ;
430
+ if let Some ( schema) = & self . schema {
431
+ let schema_key = prefix;
432
+ if let Some ( value_type_map) = schema. get ( schema_key) {
433
+ match key {
434
+ MetadataValue :: Str ( _) => {
435
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: String ) {
436
+ should_index = value_type_map. metadata_index ;
437
+ }
438
+ }
439
+ MetadataValue :: Int ( _) => {
440
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: Int ) {
441
+ should_index = value_type_map. metadata_index ;
442
+ }
443
+ }
444
+ MetadataValue :: Float ( _) => {
445
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: Float ) {
446
+ should_index = value_type_map. metadata_index ;
447
+ }
448
+ }
449
+ MetadataValue :: Bool ( _) => {
450
+ if let Some ( value_type_map) = value_type_map. get ( & ValueType :: Boolean ) {
451
+ should_index = value_type_map. metadata_index ;
452
+ }
453
+ }
454
+ }
455
+ }
456
+ }
457
+ if !should_index {
458
+ return Ok ( ( ) ) ;
459
+ }
394
460
match key {
395
461
MetadataValue :: Str ( v) => {
396
462
match & self . string_metadata_index_writer {
@@ -1063,6 +1129,7 @@ mod test {
1063
1129
& database_id,
1064
1130
& metadata_segment,
1065
1131
& blockfile_provider,
1132
+ None ,
1066
1133
)
1067
1134
. await
1068
1135
. expect ( "Error creating segment writer" ) ;
@@ -1202,6 +1269,7 @@ mod test {
1202
1269
& database_id,
1203
1270
& metadata_segment,
1204
1271
& blockfile_provider,
1272
+ None ,
1205
1273
)
1206
1274
. await
1207
1275
. expect ( "Error creating segment writer" ) ;
@@ -1291,6 +1359,7 @@ mod test {
1291
1359
& database_id,
1292
1360
& metadata_segment,
1293
1361
& blockfile_provider,
1362
+ None ,
1294
1363
)
1295
1364
. await
1296
1365
. expect ( "Error creating segment writer" ) ;
@@ -1388,6 +1457,7 @@ mod test {
1388
1457
& database_id,
1389
1458
& metadata_segment,
1390
1459
& blockfile_provider,
1460
+ None ,
1391
1461
)
1392
1462
. await
1393
1463
. expect ( "Error creating segment writer" ) ;
@@ -1530,6 +1600,7 @@ mod test {
1530
1600
& database_id,
1531
1601
& metadata_segment,
1532
1602
& blockfile_provider,
1603
+ None ,
1533
1604
)
1534
1605
. await
1535
1606
. expect ( "Error creating segment writer" ) ;
@@ -1658,6 +1729,7 @@ mod test {
1658
1729
& database_id,
1659
1730
& metadata_segment,
1660
1731
& blockfile_provider,
1732
+ None ,
1661
1733
)
1662
1734
. await
1663
1735
. expect ( "Error creating segment writer" ) ;
@@ -1773,6 +1845,7 @@ mod test {
1773
1845
& database_id,
1774
1846
& metadata_segment,
1775
1847
& blockfile_provider,
1848
+ None ,
1776
1849
)
1777
1850
. await
1778
1851
. expect ( "Error creating segment writer" ) ;
@@ -1897,6 +1970,7 @@ mod test {
1897
1970
& database_id,
1898
1971
& metadata_segment,
1899
1972
& blockfile_provider,
1973
+ None ,
1900
1974
)
1901
1975
. await
1902
1976
. expect ( "Error creating segment writer" ) ;
@@ -2001,6 +2075,7 @@ mod test {
2001
2075
& database_id,
2002
2076
& metadata_segment,
2003
2077
& blockfile_provider,
2078
+ None ,
2004
2079
)
2005
2080
. await
2006
2081
. expect ( "Error creating segment writer" ) ;
@@ -2124,6 +2199,7 @@ mod test {
2124
2199
& database_id,
2125
2200
& metadata_segment,
2126
2201
& blockfile_provider,
2202
+ None ,
2127
2203
)
2128
2204
. await
2129
2205
. expect ( "Error creating segment writer" ) ;
0 commit comments