Class TopBucketBuilder<B extends InternalMultiBucketAggregation.InternalBucket>
buildpublic static <B extends InternalMultiBucketAggregation.InternalBucket> TopBucketBuilder<B> build
(int size, BucketOrder order, Consumer<DelayedBucket<B>> nonCompetitive)Create a
TopBucketBuilderto build a list of the top buckets.
If there are few required results we use a
TopBucketBuilder.PriorityQueueTopBucketBuilderwhich is simpler and when the priority queue is full but allocates
size + 1slots in an array. If there are many required results we prefer a
TopBucketBuilder.BufferingTopBucketBuilderwhich doesn't preallocate and is faster for the first
sizeresults. But it's a little slower when the priority queue is full.
It's important for this not to preallocate a bunch of memory when
sizeis very very large because this backs the reduction of the
termsaggregation and folks often set the
sizeof that to something quite large. The choice in the paragraph above handles this case.
size- the requested size of the list
order- the sort order of the buckets
nonCompetitive- called with non-competitive buckets
addAdd a bucket if it is competitive. If there isn't space but the bucket is competitive then this will drop the least competitive bucket to make room for the new bucket.
Instead of operating on complete buckets we this operates on a wrapper containing what we need to merge the buckets called
DelayedBucket. We can evaluate some common sort criteria directly on the DelayedBuckets so we only need to merge exactly the sub-buckets we need.
buildReturn the most competitive buckets sorted by the comparator.