2

我正在使用 Apache Calcite 添加一些内置函数。现在,我想实现GROUP_CONCAT类似 MySQL 的功能,将一列与一个分隔符连接起来。

SELECT GROUP_CONCAT(n_name, '|') FROM nation GROUP BY n_lang;

函数类如下:

public class SqlGroupConcatFunction extends SqlAggFunction {
  public SqlGroupConcatFunction() {
    super(
        "GROUP_CONCAT",
        null,
        SqlKind.GROUP_CONCAT,
        ReturnTypes.VARCHAR_2000,
        InferTypes.FIRST_KNOWN,
        OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.STRING),
        SqlFunctionCategory.STRING,
        false,
        false);
  }
}

现在,我希望这个函数可以接受一个参数(不带分隔符)或两个参数。当只接受一个参数时,将第二个参数设置为默认值。

我没有找到在 Calcite 中设置默认参数值的任何方法。有实现此功能的方法吗?

4

1 回答 1

3

CALCITE-941中,我们添加了对参数的支持,这些参数是可选的并且具有名称。您可以将@Parameter注解添加到用户定义函数的参数中,以指定其名称以及是否可选。

但是,您的用例是一个聚合函数,@Parameter注释不适用于这些函数。

因此,您必须为您的构造函数指定一个允许 1 或 2 个参数的SqlOperandTypeChecker参数。尝试更换

OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.STRING),

OperandTypes.or(
  OperandTypes.family(SqlTypeFamily.ANY),
  OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.STRING)),

这将使验证者满意。在稍后的某个阶段,可能在 sql-to-rel 转换时,您可以拦截 1-argument 调用并将它们变成 2-argument 调用。

于 2016-11-26T01:34:46.827 回答