具有默认参数值的方解石函数
Calcite function with default argument value
我正在使用 Apache Calcite 添加一些内置函数。现在,我想实现像 MySQL 这样的 GROUP_CONCAT
函数来用一个分隔符连接一列。
SELECT GROUP_CONCAT(n_name, '|') FROM nation GROUP BY n_lang;
函数class如下:
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 中设置默认参数值的方法。有实现此功能的方法吗?
在 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 参数调用并将它们变成 2 参数调用。
我正在使用 Apache Calcite 添加一些内置函数。现在,我想实现像 MySQL 这样的 GROUP_CONCAT
函数来用一个分隔符连接一列。
SELECT GROUP_CONCAT(n_name, '|') FROM nation GROUP BY n_lang;
函数class如下:
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 中设置默认参数值的方法。有实现此功能的方法吗?
在 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 参数调用并将它们变成 2 参数调用。