Interface BufferAggregator

All Superinterfaces:
HotLoopCallee
All Known Implementing Classes:
CardinalityBufferAggregator, CountBufferAggregator, DelegatingBufferAggregator, DoubleAnyBufferAggregator, DoubleFirstBufferAggregator, DoubleLastBufferAggregator, DoubleMaxBufferAggregator, DoubleMeanBufferAggregator, DoubleMinBufferAggregator, DoubleSumBufferAggregator, ExpressionLambdaBufferAggregator, FilteredBufferAggregator, FloatAnyBufferAggregator, FloatFirstBufferAggregator, FloatLastBufferAggregator, FloatMaxBufferAggregator, FloatMinBufferAggregator, FloatSumBufferAggregator, HistogramBufferAggregator, HyperUniquesBufferAggregator, JavaScriptBufferAggregator, LongAnyBufferAggregator, LongConstantBufferAggregator, LongFirstBufferAggregator, LongLastBufferAggregator, LongMaxBufferAggregator, LongMinBufferAggregator, LongSumBufferAggregator, NoopBufferAggregator, NullableNumericBufferAggregator, NumericAnyBufferAggregator, NumericFirstBufferAggregator, NumericLastBufferAggregator, ObjectColumnDoubleBufferAggregatorWrapper, ObjectColumnFloatBufferAggregatorWrapper, ObjectColumnLongBufferAggregatorWrapper, SimpleDoubleBufferAggregator, SimpleFloatBufferAggregator, SimpleLongBufferAggregator, SingleValueBufferAggregator, StringAnyBufferAggregator, StringFirstBufferAggregator, StringLastBufferAggregator, SuppressedAggregatorFactory.SuppressedBufferAggregator

public interface BufferAggregator extends HotLoopCallee
A BufferAggregator is an object that can aggregate metrics into a ByteBuffer. Its aggregation-related methods (namely, aggregate(...) and get(...)) only take the ByteBuffer and position because it is assumed that the Aggregator was given something (one or more MetricSelector(s)) in its constructor that it can use to get at the next bit of data. Thus, an Aggregator can be thought of as a closure over some other thing that is stateful and changes between calls to aggregate(...). Unlike Aggregator, BufferAggregators are never used by multiple threads at once. Implementations are not required to be thread safe.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    aggregate(ByteBuffer buf, int position)
    Aggregates metric values into the given aggregate byte representation Implementations of this method must read in the aggregate value from the buffer at the given position, aggregate the next element of data and write the updated aggregate value back into the buffer.
    void
    Release any resources used by the aggregator.
    get(ByteBuffer buf, int position)
    Returns the intermediate object representation of the given aggregate.
    default double
    getDouble(ByteBuffer buf, int position)
    Returns the double representation of the given aggregate byte array Converts the given byte buffer representation into the intermediate aggregate value.
    float
    getFloat(ByteBuffer buf, int position)
    Returns the float representation of the given aggregate byte array Converts the given byte buffer representation into the intermediate aggregate value.
    long
    getLong(ByteBuffer buf, int position)
    Returns the long representation of the given aggregate byte array Converts the given byte buffer representation into the intermediate aggregate value.
    void
    init(ByteBuffer buf, int position)
    Initializes the buffer location Implementations of this method must initialize the byte buffer at the given position Implementations must not change the position, limit or mark of the given buffer This method must not exceed the number of bytes returned by AggregatorFactory.getMaxIntermediateSizeWithNulls() in the corresponding AggregatorFactory
    default void
    Implementations of this method should call inspector.visit() with all fields of this class, which meet two conditions: 1.
    default boolean
    isNull(ByteBuffer buf, int position)
    returns true if aggregator's output type is primitive long/double/float and aggregated value is null, but when aggregated output type is Object, this method always returns false, and users are advised to check nullability for the object returned by get(ByteBuffer, int) method.
    default void
    relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer)
    Relocates any cached objects.
  • Method Details

    • init

      @CalledFromHotLoop void init(ByteBuffer buf, int position)
      Initializes the buffer location Implementations of this method must initialize the byte buffer at the given position Implementations must not change the position, limit or mark of the given buffer This method must not exceed the number of bytes returned by AggregatorFactory.getMaxIntermediateSizeWithNulls() in the corresponding AggregatorFactory
      Parameters:
      buf - byte buffer to initialize
      position - offset within the byte buffer for initialization
    • aggregate

      @CalledFromHotLoop void aggregate(ByteBuffer buf, int position)
      Aggregates metric values into the given aggregate byte representation Implementations of this method must read in the aggregate value from the buffer at the given position, aggregate the next element of data and write the updated aggregate value back into the buffer. Implementations must not change the position, limit or mark of the given buffer
      Parameters:
      buf - byte buffer storing the byte array representation of the aggregate
      position - offset within the byte buffer at which the current aggregate value is stored
    • get

      @Nullable Object get(ByteBuffer buf, int position)
      Returns the intermediate object representation of the given aggregate. Converts the given byte buffer representation into an intermediate aggregate Object Implementations must not change the position, limit or mark of the given buffer. The object returned must not have any references to the given buffer (i.e., make a copy), since the underlying buffer is a shared resource and may be given to another processing thread while the objects returned by this aggregator are still in use. If the corresponding AggregatorFactory.combine(Object, Object) method for this aggregator expects its inputs to be mutable, then the object returned by this method must be mutable.
      Parameters:
      buf - byte buffer storing the byte array representation of the aggregate
      position - offset within the byte buffer at which the aggregate value is stored
      Returns:
      the Object representation of the aggregate
    • getFloat

      float getFloat(ByteBuffer buf, int position)
      Returns the float representation of the given aggregate byte array Converts the given byte buffer representation into the intermediate aggregate value. Implementations must not change the position, limit or mark of the given buffer Implementations are only required to support this method if they are aggregations which have an AggregatorFactory.getIntermediateType() ()} of ValueType.FLOAT. If unimplemented, throwing an UnsupportedOperationException is common and recommended.
      Parameters:
      buf - byte buffer storing the byte array representation of the aggregate
      position - offset within the byte buffer at which the aggregate value is stored
      Returns:
      the float representation of the aggregate
    • getLong

      long getLong(ByteBuffer buf, int position)
      Returns the long representation of the given aggregate byte array Converts the given byte buffer representation into the intermediate aggregate value. Implementations must not change the position, limit or mark of the given buffer Implementations are only required to support this method if they are aggregations which have an AggregatorFactory.getIntermediateType() of of ValueType.LONG. If unimplemented, throwing an UnsupportedOperationException is common and recommended.
      Parameters:
      buf - byte buffer storing the byte array representation of the aggregate
      position - offset within the byte buffer at which the aggregate value is stored
      Returns:
      the long representation of the aggregate
    • getDouble

      default double getDouble(ByteBuffer buf, int position)
      Returns the double representation of the given aggregate byte array Converts the given byte buffer representation into the intermediate aggregate value. Implementations must not change the position, limit or mark of the given buffer Implementations are only required to support this method if they are aggregations which have an AggregatorFactory.getIntermediateType() of of ValueType.DOUBLE. If unimplemented, throwing an UnsupportedOperationException is common and recommended. The default implementation casts getFloat(ByteBuffer, int) to double. This default method is added to enable smooth backward compatibility, please re-implement it if your aggregators work with numeric double columns.
      Parameters:
      buf - byte buffer storing the byte array representation of the aggregate
      position - offset within the byte buffer at which the aggregate value is stored
      Returns:
      the double representation of the aggregate
    • close

      void close()
      Release any resources used by the aggregator. The aggregator may be reused after this call, by calling init(ByteBuffer, int) followed by other methods as normal. This call would be more properly named "reset", but we use the name "close" to improve compatibility with existing aggregator implementations in extensions.
    • inspectRuntimeShape

      default void inspectRuntimeShape(RuntimeShapeInspector inspector)
      Implementations of this method should call inspector.visit() with all fields of this class, which meet two conditions: 1. They are used in methods of this class, annotated with CalledFromHotLoop 2. They are either: a. Nullable objects b. Instances of HotLoopCallee c. Objects, which don't always have a specific class in runtime. For example, a field of type Set could be HashSet or TreeSet in runtime, depending on how this instance (the instance on which inspectRuntimeShape() is called) is configured. d. ByteBuffer or similar objects, where byte order matters e. boolean flags, affecting branch taking f. Arrays of objects, meeting any of conditions a-e.

      The default implementation inspects nothing. Classes that implement BufferAggregator are encouraged to override this method, following the specification of HotLoopCallee.inspectRuntimeShape(org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector).

      Specified by:
      inspectRuntimeShape in interface HotLoopCallee
    • relocate

      default void relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer)
      Relocates any cached objects. If underlying ByteBuffer used for aggregation buffer relocates to a new ByteBuffer, positional caches(if any) built on top of old ByteBuffer can not be used for further aggregate(ByteBuffer, int) calls. This method tells the BufferAggregator that the cached objects at a certain location has been relocated to a different location. Only used if there is any positional caches/objects in the BufferAggregator implementation. If relocate happens to be across multiple new ByteBuffers (say n ByteBuffers), this method should be called multiple times(n times) given all the new positions/old positions should exist in newBuffer/OldBuffer. Implementations must not change the position, limit or mark of the given buffer
      Parameters:
      oldPosition - old position of a cached object before aggregation buffer relocates to a new ByteBuffer.
      newPosition - new position of a cached object after aggregation buffer relocates to a new ByteBuffer.
      oldBuffer - old aggregation buffer.
      newBuffer - new aggregation buffer.
    • isNull

      default boolean isNull(ByteBuffer buf, int position)
      returns true if aggregator's output type is primitive long/double/float and aggregated value is null, but when aggregated output type is Object, this method always returns false, and users are advised to check nullability for the object returned by get(ByteBuffer, int) method. The default implementation always return false to enable smooth backward compatibility, re-implement if your aggregator is nullable.
      Parameters:
      buf - byte buffer storing the byte array representation of the aggregate
      position - offset within the byte buffer at which the aggregate value is stored
      Returns:
      true if the aggregated value is primitive long/double/float and aggregated value is null otherwise false.