由于在Apache Calcite社区贡献了聚合函数的PR且被合入,这篇博客主要记录一下聚合函数的实现过程以及注意事项。
添加聚合函数步骤
- 在Parser.jj添加关键字(这个可以根据实际情况添加,由于当前MODE函数只在PostGresql中实现,因此在合入时候没有将MODE添加为关键字)
新增函数解析
- 在SqlKind新增Aggregation Function函数MODE
- 在SqlStdOperatorTable(中保存了SqlOperator和SqlFunction)中新增MODE函数定义
新增函数执行
- RexImpTable主要包含了MODE函数的实现过程
- SqlOperatorBaseTest包含了这个函数的测试(纯函数测试)
- 在SqlToRelConverterTest中添加相应的测试用例测试MODE函数可以被正常解析,这个测试用例的结果保存在SqlToRelConverterTest.xml中
- 在agg.iq 和 winagg.iq 添加函数测试用例主要是为了说明这个函数的结果保证在和PostGresql中的结果保持一致。
- 在reference.md的Aggregate functions目录添加聚合函数说明(这里不做说明,新增函数时,按照已有的Aggregate function添加相应的函数说明即可)。
函数说明
Add MODE functions in the operator table which returns the most frequent input value (arbitrarily choosing the first one if there are multiple equally-frequent results)
函数添加过程
- 新增SqlKind
/** The {@code MODE} aggregate function. */
MODE,
// 将MODE添加到内置的Aggregation函数列表中
/**
1. Category consisting of all built-in aggregate functions.
*/
public static final EnumSet<SqlKind> AGGREGATE =
EnumSet.of(COUNT, SUM, SUM0, MIN, MAX, LEAD, LAG, FIRST_VALUE,
LAST_VALUE, COVAR_POP, COVAR_SAMP, REGR_COUNT, REGR_SXX, REGR_SYY,
AVG, STDDEV_POP, STDDEV_SAMP, VAR_POP, VAR_SAMP, NTILE, COLLECT,
MODE, FUSION, SINGLE_VALUE, ROW_NUMBER, RANK, PERCENT_RANK, DENSE_RANK,
CUME_DIST, JSON_ARRAYAGG, JSON_OBJECTAGG, BIT_AND, BIT_OR, BIT_XOR,
LISTAGG, STRING_AGG, ARRAY_AGG, ARRAY_CONCAT_AGG, GROUP_CONCAT, COUNTIF,
PERCENTILE_CONT, PERCENTILE_DISC,
INTERSECTION, ANY_VALUE);
- 在SqlStdOperatorTable中新增函数定义
/**
- <code>MODE</code> aggregate function.
*/
public static final SqlAggFunction MODE =
SqlBasicAggFunction
.create("MODE", SqlKind.MODE, ReturnTypes.ARG0_NULLABLE_IF_EMPTY,
OperandTypes.ANY)
.withGroupOrder(Optionality.FORBIDDEN)
.withFunctionType(SqlFunctionCategory.SYSTEM<

这篇博客详细记录了在Apache Calcite中添加MODE聚合函数的过程,包括在Parser.jj添加关键字,SqlStdOperatorTable中定义函数,RexImpTable实现函数执行,以及测试用例的创建,确保与PostgreSQL兼容。
最低0.47元/天 解锁文章
1625

被折叠的 条评论
为什么被折叠?



