Class NullableNumericBufferAggregator
- java.lang.Object
-
- org.apache.druid.query.aggregation.NullableNumericBufferAggregator
-
- All Implemented Interfaces:
BufferAggregator
,HotLoopCallee
public final class NullableNumericBufferAggregator extends Object implements BufferAggregator
Null-aware numericBufferAggregator
. The result of this aggregator will be null if all the values to be aggregated are null values or no values are aggregated at all. If any of the values are non-null, the result will be the aggregated value of the delegate aggregator. When wrapped by this class, the underlying aggregator's required storage space is increased by one byte. The extra byte is a boolean that stores whether or not any non-null values have been seen. The extra byte is placed before the underlying aggregator's normal state. (Buffer layout = [nullability byte] [delegate storage bytes]) Used byNullableNumericAggregatorFactory.factorizeBuffered(ColumnSelectorFactory)
to wrap non-null aware aggregators. This class is only used when SQL compatible null handling is enabled.
-
-
Constructor Summary
Constructors Constructor Description NullableNumericBufferAggregator(BufferAggregator delegate, BaseNullableColumnValueSelector nullSelector)
-
Method Summary
All Methods Instance Methods Concrete Methods 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
close()
Release any resources used by the aggregatorObject
get(ByteBuffer buf, int position)
Returns the intermediate object representation of the given aggregate.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 byAggregatorFactory.getMaxIntermediateSizeWithNulls()
in the correspondingAggregatorFactory
void
inspectRuntimeShape(RuntimeShapeInspector inspector)
Implementations of this method should callinspector.visit()
with all fields of this class, which meet two conditions: 1.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 byBufferAggregator.get(ByteBuffer, int)
method.void
relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer)
Relocates any cached objects.
-
-
-
Constructor Detail
-
NullableNumericBufferAggregator
public NullableNumericBufferAggregator(BufferAggregator delegate, BaseNullableColumnValueSelector nullSelector)
-
-
Method Detail
-
init
public void init(ByteBuffer buf, int position)
Description copied from interface:BufferAggregator
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 byAggregatorFactory.getMaxIntermediateSizeWithNulls()
in the correspondingAggregatorFactory
- Specified by:
init
in interfaceBufferAggregator
- Parameters:
buf
- byte buffer to initializeposition
- offset within the byte buffer for initialization
-
aggregate
public void aggregate(ByteBuffer buf, int position)
Description copied from interface:BufferAggregator
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- Specified by:
aggregate
in interfaceBufferAggregator
- Parameters:
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the current aggregate value is stored
-
get
@Nullable public Object get(ByteBuffer buf, int position)
Description copied from interface:BufferAggregator
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 correspondingAggregatorFactory.combine(Object, Object)
method for this aggregator expects its inputs to be mutable, then the object returned by this method must be mutable.- Specified by:
get
in interfaceBufferAggregator
- Parameters:
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is stored- Returns:
- the Object representation of the aggregate
-
getFloat
public float getFloat(ByteBuffer buf, int position)
Description copied from interface:BufferAggregator
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 anAggregatorFactory.getIntermediateType()
()} ofValueType.FLOAT
. If unimplemented, throwing anUnsupportedOperationException
is common and recommended.- Specified by:
getFloat
in interfaceBufferAggregator
- Parameters:
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is stored- Returns:
- the float representation of the aggregate
-
getLong
public long getLong(ByteBuffer buf, int position)
Description copied from interface:BufferAggregator
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 anAggregatorFactory.getIntermediateType()
of ofValueType.LONG
. If unimplemented, throwing anUnsupportedOperationException
is common and recommended.- Specified by:
getLong
in interfaceBufferAggregator
- Parameters:
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is stored- Returns:
- the long representation of the aggregate
-
getDouble
public double getDouble(ByteBuffer buf, int position)
Description copied from interface:BufferAggregator
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 anAggregatorFactory.getIntermediateType()
of ofValueType.DOUBLE
. If unimplemented, throwing anUnsupportedOperationException
is common and recommended. The default implementation castsBufferAggregator.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.- Specified by:
getDouble
in interfaceBufferAggregator
- Parameters:
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is stored- Returns:
- the double representation of the aggregate
-
isNull
public boolean isNull(ByteBuffer buf, int position)
Description copied from interface:BufferAggregator
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 byBufferAggregator.get(ByteBuffer, int)
method. The default implementation always return false to enable smooth backward compatibility, re-implement if your aggregator is nullable.- Specified by:
isNull
in interfaceBufferAggregator
- Parameters:
buf
- byte buffer storing the byte array representation of the aggregateposition
- 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.
-
relocate
public void relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer)
Description copied from interface:BufferAggregator
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 furtherBufferAggregator.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- Specified by:
relocate
in interfaceBufferAggregator
- 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.
-
close
public void close()
Description copied from interface:BufferAggregator
Release any resources used by the aggregator- Specified by:
close
in interfaceBufferAggregator
-
inspectRuntimeShape
public void inspectRuntimeShape(RuntimeShapeInspector inspector)
Description copied from interface:BufferAggregator
Implementations of this method should callinspector.visit()
with all fields of this class, which meet two conditions: 1. They are used in methods of this class, annotated withCalledFromHotLoop
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 typeSet
could beHashSet
orTreeSet
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 ofHotLoopCallee.inspectRuntimeShape(org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector)
.- Specified by:
inspectRuntimeShape
in interfaceBufferAggregator
- Specified by:
inspectRuntimeShape
in interfaceHotLoopCallee
-
-