Class ObjectArrayPriorityQueue<T>

java.lang.Object
org.elasticsearch.common.util.ObjectArrayPriorityQueue<T>
All Implemented Interfaces:
Closeable, AutoCloseable, Iterable<T>, Releasable
Direct Known Subclasses:
BucketPriorityQueue, BucketSignificancePriorityQueue

public abstract class ObjectArrayPriorityQueue<T> extends Object implements Iterable<T>, Releasable
A priority queue maintains a partial ordering of its elements such that the least element can always be found in constant time. Put()'s and pop()'s require log(size) but the remove() cost implemented here is linear.

NOTE: Iteration order is not specified. Based in lucene's PriorityQueue but it uses a ObjectArray instead of plain {code Object[]}. This class only track the ObjectArray and not the memory usage of the elements. Furthermore, the elements are not closed even if they implement Releasable.

  • Constructor Summary

    Constructors
    Constructor
    Description
    ObjectArrayPriorityQueue(long maxSize, BigArrays bigArrays)
    Create a priority queue.
  • Method Summary

    Modifier and Type
    Method
    Description
    final T
    add(T element)
    Adds an Object to a PriorityQueue in log(size) time.
    void
    addAll(Collection<T> elements)
    Adds all elements of the collection into the queue.
    final void
    Removes all entries from the PriorityQueue.
    final void
     
    protected void
     
    Adds an Object to a PriorityQueue in log(size) time.
    final Iterator<T>
     
    protected abstract boolean
    lessThan(T a, T b)
    Determines the ordering of objects in this priority queue.
    final T
    pop()
    Removes and returns the least element of the PriorityQueue in log(size) time.
    final boolean
    remove(T element)
    Removes an existing element currently stored in the PriorityQueue.
    final long
    Returns the number of elements currently stored in the PriorityQueue.
    final T
    top()
    Returns the least element of the PriorityQueue in constant time.
    final T
    Should be called when the Object at top changes values.
    final T
    updateTop(T newTop)
    Replace the top of the pq with newTop and run updateTop().

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface java.lang.Iterable

    forEach, spliterator
  • Constructor Details

    • ObjectArrayPriorityQueue

      public ObjectArrayPriorityQueue(long maxSize, BigArrays bigArrays)
      Create a priority queue.
  • Method Details

    • lessThan

      protected abstract boolean lessThan(T a, T b)
      Determines the ordering of objects in this priority queue. Subclasses must define this one method.
      Returns:
      true iff parameter a is less than parameter b.
    • add

      public final T add(T element)
      Adds an Object to a PriorityQueue in log(size) time. If one tries to add more objects than maxSize from initialize an ArrayIndexOutOfBoundsException is thrown.
      Returns:
      the new 'top' element in the queue.
    • addAll

      public void addAll(Collection<T> elements)
      Adds all elements of the collection into the queue. This method should be preferred over calling add(Object) in loop if all elements are known in advance as it builds queue faster.

      If one tries to add more objects than the maxSize passed in the constructor, an ArrayIndexOutOfBoundsException is thrown.

    • insertWithOverflow

      public T insertWithOverflow(T element)
      Adds an Object to a PriorityQueue in log(size) time. It returns the object (if any) that was dropped off the heap because it was full. This can be the given parameter (in case it is smaller than the full heap's minimum, and couldn't be added), or another object that was previously the smallest value in the heap and now has been replaced by a larger one, or null if the queue wasn't yet full with maxSize elements.
    • top

      public final T top()
      Returns the least element of the PriorityQueue in constant time.
    • pop

      public final T pop()
      Removes and returns the least element of the PriorityQueue in log(size) time.
    • updateTop

      public final T updateTop()
      Should be called when the Object at top changes values. Still log(n) worst case, but it's at least twice as fast to
       pq.top().change();
       pq.updateTop();
       
      instead of
       o = pq.pop();
       o.change();
       pq.push(o);
       
      Returns:
      the new 'top' element.
    • updateTop

      public final T updateTop(T newTop)
      Replace the top of the pq with newTop and run updateTop().
    • size

      public final long size()
      Returns the number of elements currently stored in the PriorityQueue.
    • clear

      public final void clear()
      Removes all entries from the PriorityQueue.
    • remove

      public final boolean remove(T element)
      Removes an existing element currently stored in the PriorityQueue. Cost is linear with the size of the queue. (A specialization of PriorityQueue which tracks element positions would provide a constant remove time but the trade-off would be extra cost to all additions/insertions)
    • iterator

      public final Iterator<T> iterator()
      Specified by:
      iterator in interface Iterable<T>
    • close

      public final void close()
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in interface Releasable
    • doClose

      protected void doClose()