2016-11-25 73 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