public final class NullableNumericBufferAggregator extends Object implements BufferAggregator
BufferAggregator
.
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 by NullableNumericAggregatorFactory.factorizeBuffered(ColumnSelectorFactory)
to wrap non-null aware
aggregators. This class is only used when SQL compatible null handling is enabled.Constructor and Description |
---|
NullableNumericBufferAggregator(BufferAggregator delegate,
BaseNullableColumnValueSelector nullSelector) |
Modifier and Type | Method and 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 aggregator
|
Object |
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 by
AggregatorFactory.getMaxIntermediateSizeWithNulls()
in the corresponding AggregatorFactory |
void |
inspectRuntimeShape(RuntimeShapeInspector inspector)
Implementations of this method should call
inspector.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 by
BufferAggregator.get(ByteBuffer, int)
method. |
void |
relocate(int oldPosition,
int newPosition,
ByteBuffer oldBuffer,
ByteBuffer newBuffer)
Relocates any cached objects.
|
public NullableNumericBufferAggregator(BufferAggregator delegate, BaseNullableColumnValueSelector nullSelector)
public void init(ByteBuffer buf, int position)
BufferAggregator
AggregatorFactory.getMaxIntermediateSizeWithNulls()
in the corresponding AggregatorFactory
init
in interface BufferAggregator
buf
- byte buffer to initializeposition
- offset within the byte buffer for initializationpublic void aggregate(ByteBuffer buf, int position)
BufferAggregator
aggregate
in interface BufferAggregator
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the current aggregate value is stored@Nullable public Object get(ByteBuffer buf, int position)
BufferAggregator
AggregatorFactory.combine(Object, Object)
method for this aggregator
expects its inputs to be mutable, then the object returned by this method must be mutable.get
in interface BufferAggregator
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is storedpublic float getFloat(ByteBuffer buf, int position)
BufferAggregator
AggregatorFactory.getType()
()} of ValueType.FLOAT
.
If unimplemented, throwing an UnsupportedOperationException
is common and recommended.getFloat
in interface BufferAggregator
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is storedpublic long getLong(ByteBuffer buf, int position)
BufferAggregator
AggregatorFactory.getType()
of of ValueType.LONG
.
If unimplemented, throwing an UnsupportedOperationException
is common and recommended.getLong
in interface BufferAggregator
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is storedpublic double getDouble(ByteBuffer buf, int position)
BufferAggregator
AggregatorFactory.getType()
of of ValueType.DOUBLE
.
If unimplemented, throwing an UnsupportedOperationException
is common and recommended.
The default implementation casts BufferAggregator.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.getDouble
in interface BufferAggregator
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is storedpublic boolean isNull(ByteBuffer buf, int position)
BufferAggregator
BufferAggregator.get(ByteBuffer, int)
method.
The default implementation always return false to enable smooth backward compatibility,
re-implement if your aggregator is nullable.isNull
in interface BufferAggregator
buf
- byte buffer storing the byte array representation of the aggregateposition
- offset within the byte buffer at which the aggregate value is storedpublic void relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer)
BufferAggregator
BufferAggregator.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 bufferrelocate
in interface BufferAggregator
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.public void close()
BufferAggregator
close
in interface BufferAggregator
public void inspectRuntimeShape(RuntimeShapeInspector inspector)
BufferAggregator
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)
.
inspectRuntimeShape
in interface BufferAggregator
inspectRuntimeShape
in interface HotLoopCallee
Copyright © 2011–2021 The Apache Software Foundation. All rights reserved.