Как добавить UDF с параметром переменной number в кальците? - PullRequest
0 голосов
/ 26 марта 2019

Я использую Apache Calcite для проверки SQL. Я добавляю таблицы и UDF динамически. Проблема в том, что когда я добавляю UDF с параметром переменного числа, валидатор не может найти эту функцию.

Версия кальцита 1.18.0

А это мой код.

TestfuncFunction.java

public class TestfuncFunction {
    public String testfunc(String... arg0) {
        return null;
    }
}

Добавить UDF

Function schemafunction = ScalarFunctionImpl.create(TestfuncFunction.class),"testfunc");
SchemaPlus schemaPlus = Frameworks.createRootSchema(true);
schemaPlus.add("testfunc", schemafunction);

SQL

select testfunc(field1, field2) from test_table

testfunc - это ScalarFunction с параметром номера переменной, field1 и field2 - столбцы test_table. Так что это законный SQL. Но я получил это CalciteContextException при проверке:

No match found for function signature testfunc(<CHARACTER>, <CHARACTER>)

Я попытался изменить свой sql на один параметр, подобный этому:

select testfunc(field1) from test_table

и получил это исключение

java.lang.AssertionError: No assign rules for OTHER defined
    at org.apache.calcite.sql.type.SqlTypeAssignmentRules.canCastFrom(SqlTypeAssignmentRules.java:386)
    at org.apache.calcite.sql.type.SqlTypeUtil.canCastFrom(SqlTypeUtil.java:864)
    at org.apache.calcite.sql.SqlUtil.lambda$filterRoutinesByParameterType$4(SqlUtil.java:554)
    ...

Кажется, что кальцит преобразует тип массива Java в SqlTypeName.OTHER. Я попытался переопределить метод "createJavaType" в JavaTypeFactoryImpl, как это:

private static class CustomJavaTypeFactoryImpl extends JavaTypeFactoryImpl {
    @Override
    public RelDataType createJavaType(Class clazz) {
        if (clazz.isArray()) {
            return new ArraySqlType(super.createJavaType(clazz.getComponentType()), true);
        }
        return super.createJavaType(clazz);
    }
}

но это не сработало.

Поддерживает ли Calcite UDF с параметром переменной number, и что мне делать.

...