@@ -31,7 +31,7 @@ use tantivy::aggregation::{AggregationLimits, AggregationSegmentCollector};
31
31
use tantivy:: collector:: { Collector , SegmentCollector } ;
32
32
use tantivy:: columnar:: ColumnType ;
33
33
use tantivy:: fastfield:: Column ;
34
- use tantivy:: { DocId , Score , SegmentOrdinal , SegmentReader } ;
34
+ use tantivy:: { DocId , Score , SegmentOrdinal , SegmentReader , TantivyError } ;
35
35
36
36
use crate :: filters:: { create_timestamp_filter_builder, TimestampFilter , TimestampFilterBuilder } ;
37
37
use crate :: find_trace_ids_collector:: { FindTraceIdsCollector , FindTraceIdsSegmentCollector } ;
@@ -267,15 +267,16 @@ impl SegmentCollector for QuickwitSegmentCollector {
267
267
. collect ( ) ;
268
268
269
269
let intermediate_aggregation_result = match self . aggregation {
270
- Some ( AggregationSegmentCollectors :: FindTraceIdsSegmentCollector ( collector) ) => Some (
271
- serde_json:: to_string ( & collector. harvest ( ) )
272
- . expect ( "Collector fruit should be JSON serializable." ) ,
273
- ) ,
270
+ Some ( AggregationSegmentCollectors :: FindTraceIdsSegmentCollector ( collector) ) => {
271
+ let fruit = collector. harvest ( ) ;
272
+ let serialized =
273
+ postcard:: to_allocvec ( & fruit) . expect ( "Collector fruit should be serializable." ) ;
274
+ Some ( serialized)
275
+ }
274
276
Some ( AggregationSegmentCollectors :: TantivyAggregationSegmentCollector ( collector) ) => {
275
- Some (
276
- serde_json:: to_string ( & collector. harvest ( ) ?)
277
- . expect ( "Collector fruit should be JSON serializable." ) ,
278
- )
277
+ let serialized = postcard:: to_allocvec ( & collector. harvest ( ) ?)
278
+ . expect ( "Collector fruit should be serializable." ) ;
279
+ Some ( serialized)
279
280
}
280
281
None => None ,
281
282
} ;
@@ -438,15 +439,19 @@ impl Collector for QuickwitCollector {
438
439
}
439
440
}
440
441
442
+ fn map_error ( err : postcard:: Error ) -> TantivyError {
443
+ TantivyError :: InternalError ( format ! ( "Merge Result Postcard Error: {}" , err) )
444
+ }
445
+
441
446
/// Merges a set of Leaf Results.
442
447
fn merge_leaf_responses (
443
448
aggregations_opt : & Option < QuickwitAggregations > ,
444
- leaf_responses : Vec < LeafSearchResponse > ,
449
+ mut leaf_responses : Vec < LeafSearchResponse > ,
445
450
max_hits : usize ,
446
451
) -> tantivy:: Result < LeafSearchResponse > {
447
452
// Optimization: No merging needed if there is only one result.
448
453
if leaf_responses. len ( ) == 1 {
449
- return Ok ( leaf_responses. into_iter ( ) . next ( ) . unwrap_or_default ( ) ) ; //< default is actually never called
454
+ return Ok ( leaf_responses. pop ( ) . unwrap ( ) ) ;
450
455
}
451
456
let merged_intermediate_aggregation_result = match aggregations_opt {
452
457
Some ( QuickwitAggregations :: FindTraceIdsAggregation ( collector) ) => {
@@ -457,21 +462,24 @@ fn merge_leaf_responses(
457
462
. filter_map ( |leaf_response| {
458
463
leaf_response. intermediate_aggregation_result . as_ref ( ) . map (
459
464
|intermediate_aggregation_result| {
460
- serde_json:: from_str ( intermediate_aggregation_result)
465
+ postcard:: from_bytes ( intermediate_aggregation_result. as_slice ( ) )
466
+ . map_err ( map_error)
461
467
} ,
462
468
)
463
469
} )
464
470
. collect :: < Result < _ , _ > > ( ) ?;
465
471
let merged_fruit = collector. merge_fruits ( fruits) ?;
466
- Some ( serde_json:: to_string ( & merged_fruit) ?)
472
+ let serialized = postcard:: to_allocvec ( & merged_fruit) . map_err ( map_error) ?;
473
+ Some ( serialized)
467
474
}
468
475
Some ( QuickwitAggregations :: TantivyAggregations ( _) ) => {
469
476
let fruits: Vec < IntermediateAggregationResults > = leaf_responses
470
477
. iter ( )
471
478
. filter_map ( |leaf_response| {
472
479
leaf_response. intermediate_aggregation_result . as_ref ( ) . map (
473
480
|intermediate_aggregation_result| {
474
- serde_json:: from_str ( intermediate_aggregation_result)
481
+ postcard:: from_bytes ( intermediate_aggregation_result. as_slice ( ) )
482
+ . map_err ( map_error)
475
483
} ,
476
484
)
477
485
} )
@@ -483,7 +491,9 @@ fn merge_leaf_responses(
483
491
for fruit in fruit_iter {
484
492
merged_fruit. merge_fruits ( fruit) ?;
485
493
}
486
- Some ( serde_json:: to_string ( & merged_fruit) ?)
494
+ let serialized = postcard:: to_allocvec ( & merged_fruit) . map_err ( map_error) ?;
495
+
496
+ Some ( serialized)
487
497
} else {
488
498
None
489
499
}
0 commit comments