public abstract class TopBucketBuilder<B extends InternalMultiBucketAggregation.InternalBucket> extends Object
Merges many buckets into the "top" buckets as sorted by BucketOrder.
  • Field Details

  • Method Details

    • build

      public static <B extends InternalMultiBucketAggregation.InternalBucket> TopBucketBuilder<B> build(int size, BucketOrder order, Consumer<DelayedBucket<B>> nonCompetitive)
      Create a TopBucketBuilder to build a list of the top buckets.

      If there are few required results we use a TopBucketBuilder.PriorityQueueTopBucketBuilder which is simpler and when the priority queue is full but allocates size + 1 slots in an array. If there are many required results we prefer a TopBucketBuilder.BufferingTopBucketBuilder which doesn't preallocate and is faster for the first size results. 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 size is very very large because this backs the reduction of the terms aggregation and folks often set the size of 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
    • add

      public abstract void add(DelayedBucket<B> bucket)
      Add 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.

    • build

      public abstract List<B> build()
      Return the most competitive buckets sorted by the comparator.