我正在使用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中的默认参数值。有没有办法实现这个功能?
答案 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参数调用。