} ,{ "dataType": "double", "column": "DoubleColumn" } ] } 实际上,我们使用了 fmpp 写法可以参考 FMPP doc。 原文链接如下: https://fmpp.sourceforge.net/qtour.html 第三步,数据模型和模版代码组合起来! 为了把数据模型和模版代码组合,在 FreeMarker 中需要编写一个 main 方法,在 fmpp 中需要一个命令行命令。 但是这些我们都不想要,我们想要在 maven 编译的时候自动生成,不需要额外操心任何事情,所以我们借助了 drill 提供的 maven 插件 drill-fmpp-maven-plugin。 -- generate sources from fmpp --> <groupId>org.apache.drill.tools</groupId> <artifactId>drill-fmpp-maven-plugin
configuration> <sourceDirectory>${project.build.directory}/generated-sources/fmpp execution> <configuration> <config>src/main/codegen/config.fmpp </config> <output>${project.build.directory}/generated-sources/fmpp</output> 修改config.fmpp文件 找到 package: "org.apache.calcite.sql.parser.impl", 将下方的class,替换成一个你自己的类名,后面会用到。 测试 在构建测试的时候,注意将自己的解析解析类设置好,即在fmpp里设置的类名 .setParserFactory(JackySqlParserImpl.FACTORY) 完整测试代码如下 package
4.5.3.fmpp 是啥? 5 fmpp 就是一个基于 freemarker 的模板生产器。用户可以统一管理自己的变量,然后用 ftl 模板 + 变量 生成对应的最终文件。 在 calcite 中使用 fmpp 作为变量 + 模板的统一管理器。然后基于 fmpp 来生成对应的 Parser.jj 文件。 3 你没猜错,还是上面那些流程,fmpp(Parser.jj 模板生成) -> javacc(Parser 生成) -> calcite。 </groupId> <artifactId>fmpp-maven-plugin</artifactId> <version>1.0</version> <dependencies goals> <configuration> <cfgFile>${project.build.directory}/codegen/config.fmpp
Apache FreeMaker 模版,该模版包含着变量,这些变量在编译时可以被替换・parserImpl.ftl:提供自定义 SQL 语句、literals、dataType 的实现方法・config.fmpp :该文件是 FMPP 的配置文件,提供了 SQL 语句、literals、dataType 的接口扩展入口Calcite 使用 javacc 作为语法解析器,freemaker 作为模版,把 parserImpls.ftl 、config.fmpp、Parser.jj 模版合成最终的语法词法文件,最终通过 javacc 编译成自定义的解析器源码,整体流程如下图所示:扩展 SQL 实现● 工程目录● 扩展 sql 实现案例支持以下 04parserImpl.ftl 定义扩展的 SqlNode ExtendDollarVariable: 05config.fmpp 定义包以及扩展实现类的 import: 06扩展 SqlNode 实现
为了便于语法扩展,支持基于FMPP(Apache FreeMarker)模板动态生成Parser.jj,主要涉及以下三个文件: config.fmpp:FreeMarker配置文件,描述可扩展的解析配置 Parser.jj:JavaCC模板文件,可结合FreeMarker模板替换生成,最终通过JavaCC编译生成对应的解析器源码 解析流程如下图所示:基于FreeMarker作为模板,整合config.fmpp
模板引擎FreeMarker 语法模板文件 parserImpls.ftl + 配置文件 conf.fmpp -> .jj 模板文件 2. 我们看config.fmpp, 至此,我们大致了解Flink是如何在工程角度与Calcite相遇的,更多细节限于笔者能力和时间有限就不过多展开了。
- 第二步 Main 工程目录下添加对应的 Codegen 文件夹,里面主要由 config.fmpp(Calcite 的配置文件) 和 FTL 语法文件组成。
Calcite JavaCC SQL解析依赖 FMPP配置文件、FreeMarker模板文件,官方建议在配置模板扩展,尽量避免改动Parser.jj文件。
在FMPP中可以看到这个解决方案的一个例子。 它允许你做这样的事情(pp存储FMPP为模板提供的服务): <#assign a = pp.newWritableSequence()> <@ pp.add seq = a value =“red” 作为一种解决方法,在执行上述问题的操作后,要么确保不会修改用作输入的对象,<#assign b = pp.newWritableSequence(a[5..10])>或创建结果的副本与由上述两个点(例如在FMPP