第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Apache Calcite - 注冊(cè) UDF 以在 RelBuilder 中使用

Apache Calcite - 注冊(cè) UDF 以在 RelBuilder 中使用

回首憶惘然 2023-09-27 17:20:24
OOTB 示例 udf junits (UdfTest.java) 使用虛擬 jdbc 架構(gòu),并且不顯示 RelBuilder api 的用法。我正在注冊(cè)一個(gè)簡(jiǎn)單的 UDF,它返回輸入字符串的長(zhǎng)度。我已經(jīng)創(chuàng)建了 SqlFunction 并在 SqlStdOperatorTable 中注冊(cè)了相同的內(nèi)容 -SqlFunction length = new SqlFunction("STRLEN",                SqlKind.OTHER_FUNCTION,                ReturnTypes.INTEGER,                null,                OperandTypes.STRING,                SqlFunctionCategory.USER_DEFINED_FUNCTION);SqlStdOperatorTable sqlStdOperatorTable = SqlStdOperatorTable.instance();sqlStdOperatorTable.register(length);并用它來(lái)創(chuàng)建 FrameworkConfig -FrameworkConfig frameworkConfig = Frameworks.newConfigBuilder()                .parserConfig(SqlParser.Config.DEFAULT)                .defaultSchema(connection.getRootSchema().getSubSchema("SYSTEM"))                .programs(Programs.sequence(Programs.ofRules(Programs.RULE_SET), Programs.CALC_PROGRAM))                .operatorTable(sqlStdOperatorTable)                .build();現(xiàn)在我可以使用預(yù)定義的 sql 函數(shù)substr,例如在 SqlStringLengthFunction 類(lèi)中定義的函數(shù),其中包含以下部分:RelNode udfRelNode = builder                .scan("EMP")                .project(builder.call(new SqlStringLengthFunction(),builder.literal("SampleString"), builder.literal(3))                .build();PreparedStatement statement = RelRunners.run(udfRelNode);ResultSet resultSet = statement.executeQuery();但是當(dāng)我在 builder.call 中嘗試使用上述函數(shù)“l(fā)ength”時(shí),它會(huì)拋出異常 -java.lang.RuntimeException: cannot translate call STRLEN($t3)構(gòu)建器從類(lèi)中的私有映射中獲取這些函數(shù)的實(shí)現(xiàn)RexImpTable。此類(lèi)中沒(méi)有公開(kāi)/受保護(hù)的 API 來(lái)向該映射添加值。您能否指導(dǎo)如何使用 Calcite 注冊(cè)任何 UDF 并將其與 RelBuilder 一起使用?
查看完整描述

1 回答

?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊


這是因?yàn)?SqlStdOperatorTable.instance() 為注冊(cè)的函數(shù)做了一些初始化工作。因此,在 #register 之后調(diào)用它不會(huì)按預(yù)期工作。正確的方法是使用 ListSqlOperatorTable 并將其與帶有 ChainedSqlOperatorTable 的 StdSqlOperatorTable 鏈接起來(lái),預(yù)置代碼可能如下所示:

ListSqlOperatorTable listOpTable = new ListSqlOperatorTable();

listOpTable.add(my_udf);

ChainedSqlOperatorTable chainedOpTable = ChainedSqlOperatorTable.of(listOpTable, SqlStdOperatorTable.instance());

// then use this chainedOpTable


// If you want to use a special dialect operators, you can code like this

SqlOperatorTable optable = SqlLibraryOperatorTableFactory.INSTANCE

? .getOperatorTable(SqlLibrary.STANDARD, SqlLibrary.POSTGRESQL);

我用以下方法解決了我的問(wèn)題 -


// methods containing the udf logic?

public static class MyUdf1 {

? ? ? ? public Integer eval(String a) {

? ? ? ? ? ? return a.length();

? ? ? ? }

? ? }



@Test

? ? public void test1() throws SQLException, ClassNotFoundException {


? ? ? ? CalciteConnection connection = MyTests.getCalciteConnection();


? ? ? ? final String functionName = "STR_LEN";

? ? ? ? final ScalarFunction udfLengthFunction = ScalarFunctionImpl.create(Types.lookupMethod(MyUdf1.class, "eval", String.class));

? ? ? ? connection.getRootSchema().getSubSchema("SYSTEM").add(functionName, udfLengthFunction);


? ? ? ? FrameworkConfig frameworkConfig = Frameworks.newConfigBuilder()

? ? ? ? ? ? ? ? .parserConfig(SqlParser.Config.DEFAULT)

? ? ? ? ? ? ? ? .defaultSchema(connection.getRootSchema().getSubSchema("SYSTEM"))

? ? ? ? ? ? ? ? .programs(Programs.sequence(Programs.ofRules(Programs.RULE_SET), Programs.CALC_PROGRAM))

? ? ? ? ? ? ? ? .build();


? ? ? ? SqlIdentifier udfLengthIdentifier = new SqlIdentifier(Collections.singletonList(functionName), null, SqlParserPos.ZERO, null);

? ? ? ? final SqlOperator strLenOperator = new SqlUserDefinedFunction(udfLengthIdentifier, ReturnTypes.INTEGER, null, OperandTypes.STRING, null, udfLengthFunction);


? ? ? ? final RelBuilder builder = RelBuilder.create(frameworkConfig);

? ? ? ? RelNode udfRelNode = builder

? ? ? ? ? ? ? ? .scan("EMP")

? ? ? ? ? ? ? ? .project(builder.call(strLenOperator, builder.literal("SampleString")))

? ? ? ? ? ? ? ? .build();


? ? ? ? ResultSet set = RelRunners.run(udfRelNode).executeQuery();

? ? ? ? set.next();

? ? ? ? System.out.println(set.getString(1));

? ? }


查看完整回答
反對(duì) 回復(fù) 2023-09-27
  • 1 回答
  • 0 關(guān)注
  • 196 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)