2016-11-25 72 views
0

我正在使用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

CALCITE-941我们增加了对参数的支持是可选的并且有名字。您可以将@Parameter注释添加到用户定义函数的参数以指定其名称以及它是否可选。

但是,您的用例是一个聚合函数,并且@Parameter注释对这些不起作用。

所以,你将不得不为你的构造函数指定一个参数为SqlOperandTypeChecker,它允许1或2个参数。试着用

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

,将满足验证更换

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

。在稍后阶段,可能在sql-to-rel转换时,您可以截取1参数调用并将它们变为2参数调用。

+0

谢谢,这是一个好主意,我会试一试。 – inferno