如何添加一个udf谁的参数是一个表名

时间:2017-07-05 09:51:41

标签: apache-calcite

我想为方解码添加一个udf。 udf的参数是一个表名,它将返回一个varchar值。这有什么样的样品吗?感谢。

我的测试sql是:

SELECT MYTEST22(a), MYTEST(a), MYTEST1(a), COUNT(*)
FROM alisis.table1 
WHERE a=max_dt(alisis.table1) 
GROUP BY MYTEST22(a),MYTEST(a),MYTEST1(a) 

max_dt是我要添加的功能。

1 个答案:

答案 0 :(得分:1)

我不知道你想做什么,你能说清楚吗?

没有函数可以接受table作为参数,参数必须具有某种类型,String,Int或其他类型。因此constantscolumns可用作参数。如果您的意思是作为参数的表名,则sql应如下所示:

SELECT MYTEST22(a), MYTEST(a), MYTEST1(a), COUNT(*)
FROM alisis.table1 
WHERE a=max_dt('alisis.table1') 
GROUP BY MYTEST22(a),MYTEST(a),MYTEST1(a)

众所周知,支持的所有函数Calcite(版本为1.11)都在SqlStdOperatorTable定义。如果要支持其他函数,可以实现扩展SqlStdOperatorTable的类,例如:

public class TestOperatorTable extends SqlStdOperatorTable {
  private static volatile TestOperatorTable instance;
  public static TestOperatorTable instance() {
    if (instance == null) {
      synchronized(TestOperatorTable.class) {
        if (instance == null) {
          instance = new TestOperatorTable();
          // Use reflection to register the expressions stored in public fields.
          instance.init();
        }
      }
    }
    return instance;
  }

  /** Follow add your functions */
  public static SqlFunction LTRIM = new SqlTrimFunction("LTRIM");
}

SqlTrimFunction如下:

public class SqlTrimFunction extends SqlFunction {
  public SqlTrimFunction(String funcName) {
    super(
      funcName,
      SqlKind.OTHER_FUNCTION,
      ReturnTypes.VARCHAR_2000,  // return type is String
      InferTypes.FIRST_KNOWN,
      OperandTypes.STRING,       // parameter type is String
      SqlFunctionCategory.STRING
    ); 
  }
}

当您创建SqlValidator时,例如SqlValidatorImpl,您应该使用TestOperatorTable作为其第一个参数。