方解石函数具有默认参数值

时间:2016-11-25 07:07:19

标签: apache-calcite

我正在使用Apache Calcite添加一些内置函数。现在,我想实现像MySQL一样的GROUP_CONCAT函数,用一个分隔符连接一个列。

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中的默认参数值。有没有办法实现这个功能?

1 个答案:

答案 0 :(得分:2)

CALCITE-941中,我们添加了对参数的支持是可选的并且具有名称。您可以将<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.2.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.6.RELEASE</version> </dependency> 注释添加到用户定义函数的参数中,以指定其名称以及是否为可选项。

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

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

@Parameter

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

这将满足验证者。在稍后阶段,可能在sql-to-rel转换时,你可以截取1参数调用并使它们成为2参数调用。

相关问题