java - Apache 方解石 : Convert a SQL parse tree into a tree of relational expressions WITHOUT validation

标签 java validation parsing tree apache-calcite

我目前正在开发一个项目,我想在其中解析 SQL 查询并为其创建关系表达式树。 主要目标是识别查询中的加入伙伴。 所以我想将连接表达式推到树的叶子上。 为了实现这一目标,我决定使用 Apache Calcite。 我的代码目前看起来大致如下:

Planner planner = Frameworks.getPlanner(Frameworks.newConfigBuilder().defaultSchema(Frameworks.createRootSchema(false)).build());

SqlNode parsed = planner.parse("SELECT s.dnasamplename, e.Total_expression_level, e.Soluble_expression_level, s.id " +
            "FROM table1 e" +
            "JOIN table2 s on s.constructname = e.Clone_name" +
            "WHERE e.Total_expression_level like '0:%'");

planner.validate(parsed);

RelRoot relRoot = planner.rel(parsed);

如果我尝试执行 Planner 的 rel-Method直接,我收到错误,我必须首先验证查询。这就是我面临麻烦的地方。我没有有效的架构。我只想将查询转换为关系查询计划。有没有办法跳过验证过程?

最佳答案

无法跳过验证过程。 SQL 到关系型转换器依赖于 validator 之前创建的状态。

人们看到如果 SQL 无效, validator 就会抛出异常,并认为这是它的唯一目的;但 build 国家同样重要。该状态包括每个 SqlNode 类型的映射、SELECT 子句中“*”和“tableAlias.*”的扩展以及完全限定标识符。

如果您的架构丢失或不完整,您可以尝试与 Apache Drill 类似的方法。如果 validator 要求表的特定列,并且该表没有该列,则该表的 Calcite 命名空间会说“是的,我有该列!”并添加它。因此,验证过程成功,并且每个命名空间都有查询所需的额外列的列表。

关于java - Apache 方解石 : Convert a SQL parse tree into a tree of relational expressions WITHOUT validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40804289/

相关文章:

java - 使用 getter setter 初始化 List

spring - 哪个工具可以验证 Spring 配置

Vaadin 7 验证(BeanValidator 和 setrequired)

python - 如何使用 Biopython 翻译 FASTA 文件中的一系列 DNA 序列并将蛋白质序列提取到单独的字段中?

ruby - 递归树顶不起作用

java - JSF:空嵌套数据表

java - 我对这种骡子 Jersey 流程做错了什么?

java - Spring Boot应用程序,我想用application.properties配置index.html的位置,但不起作用

java - 如果邮政编码模式动态变化,如何在java中验证邮政编码?

c++ - 即使我必须在自己的源代码上使用 RTTI,我是否可以使用 clang 来解析 C 代码?