Class DeclarativeAggregateFunction

java.lang.Object
org.apache.flink.table.functions.UserDefinedFunction
org.apache.flink.table.functions.DeclarativeAggregateFunction
All Implemented Interfaces:
Serializable, org.apache.flink.table.functions.FunctionDefinition

@PublicEvolving public abstract class DeclarativeAggregateFunction extends org.apache.flink.table.functions.UserDefinedFunction
API for aggregation functions that are expressed in terms of expressions.

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.

See Also:
  • Constructor Details

    • DeclarativeAggregateFunction

      public DeclarativeAggregateFunction()
  • Method Details

    • operandCount

      public abstract int operandCount()
      How many operands your function will deal with.
    • aggBufferAttributes

      public abstract UnresolvedReferenceExpression[] aggBufferAttributes()
      All fields of the aggregate buffer.
    • getAggBufferTypes

      public abstract org.apache.flink.table.types.DataType[] getAggBufferTypes()
      All types of the aggregate buffer.
    • getResultType

      public abstract org.apache.flink.table.types.DataType getResultType()
      The result type of the function.
    • initialValuesExpressions

      public abstract org.apache.flink.table.expressions.Expression[] initialValuesExpressions()
      Expressions for initializing empty aggregation buffers.
    • accumulateExpressions

      public abstract org.apache.flink.table.expressions.Expression[] accumulateExpressions()
      Expressions for accumulating the mutable aggregation buffer based on an input row.
    • retractExpressions

      public abstract org.apache.flink.table.expressions.Expression[] retractExpressions()
      Expressions for retracting the mutable aggregation buffer based on an input row.
    • mergeExpressions

      public abstract org.apache.flink.table.expressions.Expression[] mergeExpressions()
      A sequence of expressions for merging two aggregation buffers together. When defining these expressions, you can use the syntax attributeName and mergeOperand(attributeName) to refer to the attributes corresponding to each of the buffers being merged.
    • getValueExpression

      public abstract org.apache.flink.table.expressions.Expression getValueExpression()
      An expression which returns the final value for this aggregate function.
    • operands

      public final UnresolvedReferenceExpression[] operands()
      Args of accumulate and retract, the input value (usually obtained from a new arrived data).
    • operand

      public final UnresolvedReferenceExpression operand(int i)
      Arg of accumulate and retract, the input value (usually obtained from a new arrived data).
    • mergeOperand

      public final UnresolvedReferenceExpression mergeOperand(UnresolvedReferenceExpression aggBuffer)
      Merge input of mergeExpressions(), the input are AGG buffer generated by user definition.
    • mergeOperands

      public final UnresolvedReferenceExpression[] mergeOperands()
      Merge inputs of mergeExpressions(), these inputs are agg buffer generated by user definition.
    • getKind

      public org.apache.flink.table.functions.FunctionKind getKind()
    • getTypeInference

      public org.apache.flink.table.types.inference.TypeInference getTypeInference(org.apache.flink.table.catalog.DataTypeFactory factory)
      Specified by:
      getTypeInference in interface org.apache.flink.table.functions.FunctionDefinition
      Specified by:
      getTypeInference in class org.apache.flink.table.functions.UserDefinedFunction