@@ -727,7 +727,17 @@ impl IntermediateBucketResult {
727727 } => {
728728 sub_aggregations. prune_intermediate_results ( req. sub_aggregation ( ) , use_segment_size)
729729 }
730- IntermediateBucketResult :: Composite { .. } => Ok ( ( ) ) ,
730+ IntermediateBucketResult :: Composite { buckets } => {
731+ if !use_segment_size {
732+ buckets. trim ( ) ?;
733+ }
734+ for entry in buckets. entries . values_mut ( ) {
735+ entry
736+ . sub_aggregation
737+ . prune_intermediate_results ( req. sub_aggregation ( ) , use_segment_size) ?;
738+ }
739+ Ok ( ( ) )
740+ }
731741 }
732742 }
733743
@@ -962,6 +972,11 @@ impl IntermediateTermBucketResult {
962972 req_internal. size as usize
963973 } ;
964974
975+ if !use_segment_size {
976+ let min_doc_count = req_internal. min_doc_count ;
977+ self . entries . retain ( |_, e| e. doc_count >= min_doc_count) ;
978+ }
979+
965980 if self . entries . len ( ) > size {
966981 let mut entries: Vec < ( IntermediateKey , IntermediateTermBucketEntry ) > =
967982 self . entries . drain ( ) . collect ( ) ;
@@ -991,17 +1006,23 @@ impl IntermediateTermBucketResult {
9911006 entries = keyed. into_iter ( ) . map ( |( _, entry) | entry) . collect ( ) ;
9921007 }
9931008 OrderTarget :: Key => {
1009+ let mut keyed: Vec < ( Key , ( IntermediateKey , IntermediateTermBucketEntry ) ) > =
1010+ entries
1011+ . into_iter ( )
1012+ . map ( |entry| ( entry. 0 . clone ( ) . into ( ) , entry) )
1013+ . collect ( ) ;
9941014 if req_internal. order . order == Order :: Desc {
995- entries . select_nth_unstable_by ( size, |( k1, _) , ( k2, _) | {
1015+ keyed . select_nth_unstable_by ( size, |( k1, _) , ( k2, _) | {
9961016 k2. partial_cmp ( k1)
9971017 . expect ( "expected type string, which is always sortable" )
9981018 } ) ;
9991019 } else {
1000- entries . select_nth_unstable_by ( size, |( k1, _) , ( k2, _) | {
1020+ keyed . select_nth_unstable_by ( size, |( k1, _) , ( k2, _) | {
10011021 k1. partial_cmp ( k2)
10021022 . expect ( "expected type string, which is always sortable" )
10031023 } ) ;
10041024 }
1025+ entries = keyed. into_iter ( ) . map ( |( _, entry) | entry) . collect ( ) ;
10051026 }
10061027 OrderTarget :: Count => {
10071028 if req_internal. order . order == Order :: Desc {
@@ -1018,7 +1039,9 @@ impl IntermediateTermBucketResult {
10181039 . iter ( )
10191040 . map ( |( _, e) | e. doc_count )
10201041 . sum :: < u64 > ( ) ;
1021- self . doc_count_error_upper_bound += cutoff_doc_count;
1042+ if use_segment_size {
1043+ self . doc_count_error_upper_bound += cutoff_doc_count;
1044+ }
10221045 entries. truncate ( size) ;
10231046 self . entries = entries. into_iter ( ) . collect ( ) ;
10241047 }
@@ -1486,7 +1509,8 @@ mod tests {
14861509 . entries
14871510 . contains_key( & IntermediateKey :: Str ( "e" . to_string( ) ) ) ) ;
14881511 assert_eq ! ( term_result. sum_other_doc_count, 10 + 5 + 1 ) ;
1489- assert_eq ! ( term_result. doc_count_error_upper_bound, 10 ) ; // doc_count of first cut entry (a)
1512+ // final-size cutoff doesn't contribute to error bound
1513+ assert_eq ! ( term_result. doc_count_error_upper_bound, 0 ) ;
14901514 }
14911515
14921516 #[ test]
0 commit comments