Apache Calcite-添加聚合函数(MODE Aggregation Function)

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

由于在Apache Calcite社区贡献了聚合函数的PR且被合入,这篇博客主要记录一下聚合函数的实现过程以及注意事项。

添加聚合函数步骤

  • 在Parser.jj添加关键字(这个可以根据实际情况添加,由于当前MODE函数只在PostGresql中实现,因此在合入时候没有将MODE添加为关键字)

新增函数解析

  1. 在SqlKind新增Aggregation Function函数MODE
  2. 在SqlStdOperatorTable(中保存了SqlOperator和SqlFunction)中新增MODE函数定义

新增函数执行

  1. RexImpTable主要包含了MODE函数的实现过程
  2. 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)

函数添加过程

  1. 新增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);
  1. 在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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NobiGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值