【问题标题】:Apache Calcite: Convert a SQL parse tree into a tree of relational expressions WITHOUT validationApache Calcite:将 SQL 解析树转换为关系表达式树,无需验证
【发布时间】:2016-11-25 11:44:12
【问题描述】:

我目前正在处理一个项目,我想在其中解析 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,我会收到必须先验证查询的错误。这就是我面临麻烦的地方。我没有有效的架构。我只想将查询转换为关系查询计划。有没有办法跳过验证过程?

【问题讨论】:

    标签: java validation parsing tree apache-calcite


    【解决方案1】:

    无法跳过验证过程。 sql-to-relational 转换器依赖于之前由验证器创建的状态。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-20
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多