Как добавить параметр udf, который является именем таблицы

Я хочу добавить 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 — это функция, которую я хочу добавить.


person fei.chen    schedule 05.07.2017    source источник
comment
Пожалуйста, отредактируйте свой вопрос, чтобы показать код, который у вас есть на данный момент. Вы должны включить хотя бы схему (но желательно минимально воспроизводимый пример) кода, с которым у вас возникли проблемы , тогда мы можем попытаться помочь с конкретной проблемой. Вы также должны прочитать Как спросить.   -  person Toby Speight    schedule 05.07.2017


Ответы (1)


Я не знаю, что вы хотите сделать, не могли бы вы дать четкое объяснение?

Ни одна функция не может принимать table в качестве параметра, параметры должны иметь определенный тип, String, Int или другие. Таким образом, constants и columns можно использовать в качестве параметров. Если вы имеете в виду имя таблицы в качестве параметра, 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 в качестве его первого параметра.

person inferno    schedule 05.07.2017
comment
Да, функция, которую я хочу поддерживать, имеет имя таблицы в качестве параметра. Мой тестовый sql имеет синтаксическую ошибку. Я постараюсь реализовать класс . Большое спасибо! - person fei.chen; 06.07.2017
comment
@fei.chen stackoverflow.com/a/44962144/1314077 это может быть полезно для добавления UDF, не расширяйте SqlStdOperatorTable. - person inferno; 18.07.2017