如何添加参数为 table 名称的 udf
How to add a udf who's parameter is a table name
我想给方解石添加一个udf。 udf 的参数是一个 table 名称,它将 return 一个 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
是我要添加的功能
不知道你想做什么,能解释清楚吗?
没有函数可以接受table
作为参数,参数必须有一定的类型,String, Int 或其他。所以constants
和columns
都可以作为参数。如果你的意思是table名字作为参数,那么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
的class,例如:
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
作为它的第一个参数。
我想给方解石添加一个udf。 udf 的参数是一个 table 名称,它将 return 一个 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
是我要添加的功能
不知道你想做什么,能解释清楚吗?
没有函数可以接受table
作为参数,参数必须有一定的类型,String, Int 或其他。所以constants
和columns
都可以作为参数。如果你的意思是table名字作为参数,那么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
的class,例如:
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
作为它的第一个参数。