基于calcite自定义sql解析器_org.apache.calcite.avatica.util.quoting-爱代码爱编程
public void unparse(SqlWriter sqlWriter, int i, int i1) {
sqlWriter.keyword(“jacky”);
sqlWriter.keyword(“job”);
sqlWriter.print(“\n”);
sqlWriter.keyword(“” + jackyString + “”);
}
@Override
public void validate(SqlValidator sqlValidator, SqlValidatorScope sqlValidatorScope) {
System.out.println(“validate”);
}
@Override
public R accept(SqlVisitor sqlVisitor) {
System.out.println(“accept”);
return null;
}
@Override
public boolean equalsDeep(SqlNode sqlNode, Litmus litmus) {
System.out.println(“equalsDeep”);
return false;
}
}
在这个解析类里面,其实我们并没有做很多工作,只是在构造器里面,将变量保存起来。
需要注意的是这个方法,unparse ,这里用于解析显示用的,我们将关键字输出出来。
修改config.fmpp文件
找到
package: “org.apache.calcite.sql.parser.impl”,
将下方的class,替换成一个你自己的类名,后面会用到。例如
class: “JackySqlParserImpl”,
修改Parser.jj文件
首先需要在import的地方引入上面的解析类
import org.apache.calcite.sql.SqlJacky;
然后再后处理代码中加入解析逻辑
SqlNode SqlJacky() :
{
SqlNode stringNode;
}
{
stringNode = StringLiteral()
{
return new SqlJacky(getPos(), token.image);
}
}
接下来找到声明语句的方法
SqlNode SqlStmt() :
将
|
stmt = SqlJacky()
加入到适当的位置。
最后在
<DEFAULT, DQID, BTID> TOKEN :
的地方将,jacky 和 job 关键字加入
| < JACKY: “JACKY”>
| < JOB: “JOB”>
由于这个文件比较大,这里就不能贴完整的代码了,下面的连接中,有参考案例。
编译
执行maven的编译命令
测试
在构建测试的时候,注意将自己的解析解析类设置好,即在fmpp里设置的类名
.setParserFactory(JackySqlParserImpl.FACTORY)
完整测试代码如下
package cn.flinkhub;
import org.apache.calcite.avatica.util.Casing;
import org.apache.calcite.avatica.util.Quoting;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.sql.parser.impl.JackySqlParserImpl;
public class CustomParser {
public static void main(String[] args) {
SchemaPlus rootSchema = Frameworks.createRootSchema(true);
final FrameworkConfig config = Frameworks.newConfigBuilder()
.parserConfig(SqlParser.configBuilder()
//.setLex(Lex.ORACLE)
.setParserFactory(JackySqlParserImpl.FACTORY)
.setCaseSensitive(false)
.setQuoting(Quoting.BACK_TICK)
.setQuotedCasing(Casing.TO_UPPER)
.setUnquotedCasing(Casing.TO_UPPER)
//.setConformance(SqlConformanceEnum.ORACLE_12)
.build())
.build();
// “jacky ‘select ids, name from test where id < 5’”;
String sql = “jacky job ‘select ids, name from test where id < 5’”;
SqlParser parser = SqlParser.create(sql, config.getParserConfig());
try {
SqlNode sqlNode = parser.parseStmt();
System.out.println(sqlNode.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
[外链图片转存中…(img-YTR2z45z-1711934148046)]
[外链图片转存中…(img-HA1u32QC-1711934148046)]
[外链图片转存中…(img-JaUpdDpE-1711934148047)]
[外链图片转存中…(img-P8mf0N3k-1711934148048)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!