@PublicEvolving public abstract class DeclarativeAggregateFunction extends UserDefinedFunction
When implementing a new expression-based aggregate function, you should first decide how many
operands your function will have by implementing operandCount()
method. And then you can
use operand(int)
fields to represent your operand, like `operand(0)`, `operand(2)`.
Then you should declare all your buffer attributes by implementing aggBufferAttributes()
. You should declare all buffer attributes as UnresolvedReferenceExpression
, and make sure the name of your attributes are unique within the
function and it should not conflict with operandIndex. You can then use these attributes when
defining initialValuesExpressions()
, accumulateExpressions()
, mergeExpressions()
and getValueExpression()
.
Note: Developer of DeclarativeAggregateFunction should guarantee that the inferred type of
getValueExpression()
is the same as getResultType()
See an full example: AvgAggFunction
.
Constructor and Description |
---|
DeclarativeAggregateFunction() |
Modifier and Type | Method and Description |
---|---|
abstract Expression[] |
accumulateExpressions()
Expressions for accumulating the mutable aggregation buffer based on an input row.
|
abstract UnresolvedReferenceExpression[] |
aggBufferAttributes()
All fields of the aggregate buffer.
|
abstract DataType[] |
getAggBufferTypes()
All types of the aggregate buffer.
|
FunctionKind |
getKind()
Returns the kind of function this definition describes.
|
abstract DataType |
getResultType()
The result type of the function.
|
TypeInference |
getTypeInference(DataTypeFactory factory)
Returns the logic for performing type inference of a call to this function definition.
|
abstract Expression |
getValueExpression()
An expression which returns the final value for this aggregate function.
|
abstract Expression[] |
initialValuesExpressions()
Expressions for initializing empty aggregation buffers.
|
abstract Expression[] |
mergeExpressions()
A sequence of expressions for merging two aggregation buffers together.
|
UnresolvedReferenceExpression |
mergeOperand(UnresolvedReferenceExpression aggBuffer)
Merge input of
mergeExpressions() , the input are AGG buffer generated by user
definition. |
UnresolvedReferenceExpression[] |
mergeOperands()
Merge inputs of
mergeExpressions() , these inputs are agg buffer generated by user
definition. |
UnresolvedReferenceExpression |
operand(int i)
Arg of accumulate and retract, the input value (usually obtained from a new arrived data).
|
abstract int |
operandCount()
How many operands your function will deal with.
|
UnresolvedReferenceExpression[] |
operands()
Args of accumulate and retract, the input value (usually obtained from a new arrived data).
|
abstract Expression[] |
retractExpressions()
Expressions for retracting the mutable aggregation buffer based on an input row.
|
close, functionIdentifier, open, toString
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
getRequirements, isDeterministic, supportsConstantFolding
public abstract int operandCount()
public abstract UnresolvedReferenceExpression[] aggBufferAttributes()
public abstract DataType[] getAggBufferTypes()
public abstract DataType getResultType()
public abstract Expression[] initialValuesExpressions()
public abstract Expression[] accumulateExpressions()
public abstract Expression[] retractExpressions()
public abstract Expression[] mergeExpressions()
attributeName
and mergeOperand(attributeName)
to refer to the attributes corresponding to each of the buffers
being merged.public abstract Expression getValueExpression()
public final UnresolvedReferenceExpression[] operands()
public final UnresolvedReferenceExpression operand(int i)
public final UnresolvedReferenceExpression mergeOperand(UnresolvedReferenceExpression aggBuffer)
mergeExpressions()
, the input are AGG buffer generated by user
definition.public final UnresolvedReferenceExpression[] mergeOperands()
mergeExpressions()
, these inputs are agg buffer generated by user
definition.public FunctionKind getKind()
FunctionDefinition
public TypeInference getTypeInference(DataTypeFactory factory)
UserDefinedFunction
The type inference process is responsible for inferring unknown types of input arguments, validating input arguments, and producing result types. The type inference process happens independent of a function body. The output of the type inference is used to search for a corresponding runtime implementation.
Instances of type inference can be created by using TypeInference.newBuilder()
.
See BuiltInFunctionDefinitions
for concrete usage examples.
The type inference for user-defined functions is automatically extracted using reflection.
It does this by analyzing implementation methods such as eval() or accumulate()
and
the generic parameters of a function class if present. If the reflective information is not
sufficient, it can be supported and enriched with DataTypeHint
and FunctionHint
annotations.
Note: Overriding this method is only recommended for advanced users. If a custom type inference is specified, it is the responsibility of the implementer to make sure that the output of the type inference process matches with the implementation method:
The implementation method must comply with each DataType.getConversionClass()
returned by the type inference. For example, if DataTypes.TIMESTAMP(3).bridgedTo(java.sql.Timestamp.class)
is an expected argument type, the
method must accept a call eval(java.sql.Timestamp)
.
Regular Java calling semantics (including type widening and autoboxing) are applied when
calling an implementation method which means that the signature can be eval(java.lang.Object)
.
The runtime will take care of converting the data to the data format specified by the
DataType.getConversionClass()
coming from the type inference logic.
getTypeInference
in interface FunctionDefinition
getTypeInference
in class UserDefinedFunction
Copyright © 2014–2024 The Apache Software Foundation. All rights reserved.