pos機管理系統(tǒng)源碼,Flink源碼閱讀——Calcite 語法拓展

 新聞資訊  |   2023-07-02 12:11  |  投稿人:pos機之家

網(wǎng)上有很多關(guān)于pos機管理系統(tǒng)源碼,Flink源碼閱讀——Calcite 語法拓展的知識,也有很多人為大家解答關(guān)于pos機管理系統(tǒng)源碼的問題,今天pos機之家(m.afbey.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機管理系統(tǒng)源碼

pos機管理系統(tǒng)源碼

Calcite主要是做SQL解析、校驗、優(yōu)化等工作,比如Flink、Hive底層都是使用的calcite。本文內(nèi)容是基于Flink 1.12來講解。

首先從整體上對Calcite使用做個了解,Calcite 使用 javacc作為語法解析器,并且使用freemarker作為模板引擎,在編譯的時候,freemarker會將 配置文件、模板語法文件、附加模板文件 整體生成最終的語法文件,并通過javacc編譯,形成calcite的語法文件。整個過程如下圖所示:

下面我們以一個具體例子來說怎么做SQL語法拓展,比如我們需要支持語法

USE FUNCTION func_name [ WITH (name = '', version = '') ]1. 創(chuàng)建maven項目2. 復(fù)制模板文件

從Flink源碼flink-table/flink-sql-parser/src/main/codegen文件夾copy到自己項目的src/main目錄下

3. 拓展SQL語法

主要分為下面三步3.1 在 codegen/includes/parserImpls.ftl 定義解析use function 的規(guī)則,包含了方法名及對應(yīng)的規(guī)則。

/*** USE FUNCTION func_name [ WITH (name = '', version = '') ]*/SqlCall SqlUseFunction() :{ SqlParserPos pos; SqlIdentifier funcName; SqlNodeList funcProps = null;}{ <USE> { // Token位置 pos = getPos(); } <FUNCTION> funcName = CompoundIdentifier() [ <WITH> funcProps = TableProperties() ] { return new SqlUseFunction(pos, funcName, funcProps); }}

3.2 拓展 SqlCall規(guī)則匹配成功返回一個SqlUseFunction節(jié)點,作為解析樹中的SqlNode。

public class SqlUseFunction extends SqlCall { private static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("USE FUNCTION", SqlKind.OTHER_FUNCTION); private final SqlIdentifier funcName; private final SqlNodeList funcProps; /** * SqlUseFunction constructor. * * @param pos sql define location * @param funcName function name * @param funcProps function property * */ public SqlUseFunction(SqlParserPos pos, SqlIdentifier funcName, SqlNodeList funcProps) { super(pos); this.funcName = funcName; this.funcProps = funcProps; } @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("USE FUNCTION"); funcName.unparse(writer, leftPrec, rightPrec); if (funcProps != null) { writer.keyword("WITH"); SqlWriter.Frame frame = writer.startList("(", ")"); for (SqlNode c : funcProps) { writer.sep(","); c.unparse(writer, 0, 0); } writer.endList(frame); } } @Override public SqlOperator getOperator() { return OPERATOR; } @Override public List<SqlNode> getOperandList() { return ImmutableNullableList.of(funcName, funcProps); }}

3.3 將添加的規(guī)則,加入配置文件 codegen/data/Parser.tdd

imports增加SqlUseFunction類。statementParserMethods增加定義的規(guī)則方法。在Parser中使用新規(guī)則。

imports: [ "org.apache.flink.sql.extended.SqlUseFunction" ] # List of methods for parsing custom SQL statements. # Return type of method implementation should be 'SqlNode'. # Example: SqlShowDatabases(), SqlShowTables(). statementParserMethods: [ "SqlUseFunction()" ]編譯執(zhí)行mvn clean compile生成定義的解析類SqlParserImpl.java。重點看生成的SqlUseFunction(),編譯成功就可以在sql中使用該語法了。

以上就是關(guān)于pos機管理系統(tǒng)源碼,Flink源碼閱讀——Calcite 語法拓展的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機管理系統(tǒng)源碼的知識,希望能夠幫助到大家!

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://m.afbey.com/news/76712.html

你可能會喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。