Java ApacheCalcite:无需验证即可将SQL解析树转换为关系表达式树

Java ApacheCalcite:无需验证即可将SQL解析树转换为关系表达式树,java,validation,parsing,tree,apache-calcite,Java,Validation,Parsing,Tree,Apache Calcite,我目前正在从事一个项目,我想解析一个SQL查询并为其创建关系表达式树。 主要目标是识别查询中的连接伙伴。 所以我想把连接表达式推到树的叶子上。 为了实现这一点,我决定使用Apache方解石。 我的代码目前大致如下所示: Planner planner = Frameworks.getPlanner(Frameworks.newConfigBuilder().defaultSchema(Frameworks.createRootSchema(false)).build()); SqlNode p

我目前正在从事一个项目,我想解析一个SQL查询并为其创建关系表达式树。 主要目标是识别查询中的连接伙伴。 所以我想把连接表达式推到树的叶子上。 为了实现这一点,我决定使用Apache方解石。 我的代码目前大致如下所示:

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);

如果我试图直接执行的rel方法,我会得到一个错误,我必须首先验证查询。这就是我面临麻烦的地方。我没有有效的架构。我只想将查询转换为关系查询计划。有什么方法可以跳过验证过程吗?

不可能跳过验证过程。sql到关系转换器依赖于以前由验证器创建的状态

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

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