Skip to content

Commit 886322f

Browse files
committed
cr
1 parent 73af3eb commit 886322f

1 file changed

Lines changed: 29 additions & 5 deletions

File tree

src/aggregation/intermediate_agg_result.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)