@@ -27,9 +27,7 @@ use quickwit_common::temp_dir::TempDirectory;
2727use quickwit_directories:: write_hotcache;
2828use quickwit_doc_mapper:: NamedField ;
2929use quickwit_doc_mapper:: tag_pruning:: append_to_tag_set;
30- use quickwit_proto:: search:: {
31- ListFieldType , ListFields , ListFieldsEntryResponse , serialize_split_fields,
32- } ;
30+ use quickwit_proto:: search:: { ListFieldsEntry , ListFieldsMetadata , ListFieldsType } ;
3331use tantivy:: index:: FieldMetadata ;
3432use tantivy:: schema:: { FieldType , Type } ;
3533use tantivy:: { InvertedIndexReader , ReloadPolicy , SegmentMeta } ;
@@ -314,7 +312,7 @@ fn create_packaged_split(
314312 build_hotcache ( split. split_scratch_directory . path ( ) , & mut hotcache_bytes) ?;
315313 ctx. record_progress ( ) ;
316314
317- let serialized_split_fields = serialize_field_metadata ( & fields_metadata) ;
315+ let serialized_split_fields = serialize_fields_metadata ( & fields_metadata) ;
318316
319317 let packaged_split = PackagedSplit {
320318 serialized_split_fields,
@@ -327,37 +325,19 @@ fn create_packaged_split(
327325 Ok ( packaged_split)
328326}
329327
330- /// Serializes the Split fields.
331- ///
332- /// `fields_metadata` has to be sorted.
333- fn serialize_field_metadata ( fields_metadata : & [ FieldMetadata ] ) -> Vec < u8 > {
334- let fields = fields_metadata
328+ /// Serializes the fields metadata from a split sorted by (name, type).
329+ fn serialize_fields_metadata ( fields_metadata : & [ FieldMetadata ] ) -> Vec < u8 > {
330+ let entries = fields_metadata
335331 . iter ( )
336- . map ( field_metadata_to_list_field_serialized)
332+ . map ( field_metadata_to_list_fields_entry)
333+ . sorted_unstable_by ( |left, right| left. cmp_by_name_and_type ( right) )
337334 . collect :: < Vec < _ > > ( ) ;
338335
339- serialize_split_fields ( ListFields { fields } )
340- }
341-
342- fn tantivy_type_to_list_field_type ( typ : Type ) -> ListFieldType {
343- match typ {
344- Type :: Str => ListFieldType :: Str ,
345- Type :: U64 => ListFieldType :: U64 ,
346- Type :: I64 => ListFieldType :: I64 ,
347- Type :: F64 => ListFieldType :: F64 ,
348- Type :: Bool => ListFieldType :: Bool ,
349- Type :: Date => ListFieldType :: Date ,
350- Type :: Facet => ListFieldType :: Facet ,
351- Type :: Bytes => ListFieldType :: Bytes ,
352- Type :: Json => ListFieldType :: Json ,
353- Type :: IpAddr => ListFieldType :: IpAddr ,
354- }
336+ ListFieldsMetadata { entries } . serialize ( )
355337}
356338
357- fn field_metadata_to_list_field_serialized (
358- field_metadata : & FieldMetadata ,
359- ) -> ListFieldsEntryResponse {
360- ListFieldsEntryResponse {
339+ fn field_metadata_to_list_fields_entry ( field_metadata : & FieldMetadata ) -> ListFieldsEntry {
340+ ListFieldsEntry {
361341 field_name : field_metadata. field_name . to_string ( ) ,
362342 field_type : tantivy_type_to_list_field_type ( field_metadata. typ ) as i32 ,
363343 searchable : field_metadata. is_indexed ( ) ,
@@ -368,6 +348,21 @@ fn field_metadata_to_list_field_serialized(
368348 }
369349}
370350
351+ fn tantivy_type_to_list_field_type ( typ : Type ) -> ListFieldsType {
352+ match typ {
353+ Type :: Bool => ListFieldsType :: Bool ,
354+ Type :: Bytes => ListFieldsType :: Bytes ,
355+ Type :: Date => ListFieldsType :: Date ,
356+ Type :: F64 => ListFieldsType :: F64 ,
357+ Type :: Facet => ListFieldsType :: Facet ,
358+ Type :: I64 => ListFieldsType :: I64 ,
359+ Type :: IpAddr => ListFieldsType :: IpAddr ,
360+ Type :: Json => ListFieldsType :: Json ,
361+ Type :: Str => ListFieldsType :: Str ,
362+ Type :: U64 => ListFieldsType :: U64 ,
363+ }
364+ }
365+
371366/// Reads u64 from stored term data.
372367fn u64_from_term_data ( data : & [ u8 ] ) -> anyhow:: Result < u64 > {
373368 let u64_bytes: [ u8 ; 8 ] = data[ 0 ..8 ]
@@ -382,7 +377,7 @@ mod tests {
382377
383378 use quickwit_actors:: { ObservationType , Universe } ;
384379 use quickwit_metastore:: checkpoint:: IndexCheckpointDelta ;
385- use quickwit_proto:: search:: { ListFieldsEntryResponse , deserialize_split_fields } ;
380+ use quickwit_proto:: search:: { ListFieldsEntry , ListFieldsMetadata } ;
386381 use quickwit_proto:: types:: { DocMappingUid , IndexUid , NodeId } ;
387382 use tantivy:: directory:: MmapDirectory ;
388383 use tantivy:: schema:: { FAST , NumericOptions , STRING , Schema , TEXT , Type } ;
@@ -424,24 +419,24 @@ mod tests {
424419 } ,
425420 ] ;
426421
427- let out = serialize_field_metadata ( & fields_metadata) ;
422+ let out = serialize_fields_metadata ( & fields_metadata) ;
428423
429- let deserialized: Vec < ListFieldsEntryResponse > =
430- deserialize_split_fields ( & mut & out[ ..] ) . unwrap ( ) . fields ;
424+ let deserialized: Vec < ListFieldsEntry > =
425+ ListFieldsMetadata :: deserialize ( & out[ ..] ) . unwrap ( ) . entries ;
431426
432427 assert_eq ! ( fields_metadata. len( ) , deserialized. len( ) ) ;
433428 assert_eq ! ( deserialized[ 0 ] . field_name, "test" ) ;
434- assert_eq ! ( deserialized[ 0 ] . field_type, ListFieldType :: Str as i32 ) ;
429+ assert_eq ! ( deserialized[ 0 ] . field_type, ListFieldsType :: Str as i32 ) ;
435430 assert ! ( deserialized[ 0 ] . searchable) ;
436431 assert ! ( deserialized[ 0 ] . aggregatable) ;
437432
438433 assert_eq ! ( deserialized[ 1 ] . field_name, "test2" ) ;
439- assert_eq ! ( deserialized[ 1 ] . field_type, ListFieldType :: Str as i32 ) ;
434+ assert_eq ! ( deserialized[ 1 ] . field_type, ListFieldsType :: Str as i32 ) ;
440435 assert ! ( deserialized[ 1 ] . searchable) ;
441436 assert ! ( !deserialized[ 1 ] . aggregatable) ;
442437
443438 assert_eq ! ( deserialized[ 2 ] . field_name, "test3" ) ;
444- assert_eq ! ( deserialized[ 2 ] . field_type, ListFieldType :: U64 as i32 ) ;
439+ assert_eq ! ( deserialized[ 2 ] . field_type, ListFieldsType :: U64 as i32 ) ;
445440 assert ! ( deserialized[ 2 ] . searchable) ;
446441 assert ! ( deserialized[ 2 ] . aggregatable) ;
447442 }
0 commit comments