網(wǎng)上有很多關(guān)于pos機管理系統(tǒng)源碼,Flink源碼閱讀——Calcite 語法拓展的知識,也有很多人為大家解答關(guān)于pos機管理系統(tǒng)源碼的問題,今天pos機之家(m.afbey.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
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)源碼的知識,希望能夠幫助到大家!