繁体   English   中英

如何在没有架构信息的情况下从 RelBuild 构建 sql?

[英]how to build sql from RelBuild without schema info?

我想使用方解石生成 sql。 像这样

org.apache.calcite.rel.rel2sql.RelToSqlConverterTest#testAntiJoin

final FrameworkConfig frameworkConfig = Frameworks.newConfigBuilder()
       .parserConfig(SqlParser.Config.DEFAULT)
//       .defaultSchema(schema)
       .build();

final RelBuilder builder = RelBuilder.create(frameworkConfig);

final RelBuilder builder = relBuilder();
final RelNode root = builder
       .scan("DEPT")
        .scan("EMP")
        .join(
            JoinRelType.ANTI, builder.equals(
              builder.field(2, 1, "DEPTNO"),
              builder.field(2, 0, "DEPTNO")))
        .project(builder.field("DEPTNO"))
        .build();

但如果我不设置架构,则会抛出未找到的异常表。 有没有办法在没有架构信息的情况下生成 sql。

目的是生成 sql。 只需生成 sql。

RelBuilder中只有一种方法使用RelOptSchemascan(String...) (及其变体Scan(Iterable<String>) )。 当您认为RelOptSchema的目的是作为目录服务时,这是有道理的,将表名(或表路径,由具有目录和/或模式名限定的表名组成)转换为RelOptTable object。

如果您有未通过命名空间访问的“独立”表对象,则可以直接创建TableScan关系表达式,然后调用RelBuilder.push(RelNode)将它们添加到堆栈中。 由于您从不调用RelBuilder.scan您可以使用 null RelOptSchema RelBuilder

但是在您的情况下,您似乎没有独立的表格对象。 这对 Calcite 来说是个问题,因为它需要知道您的“EMP”表有一个名为“DEPTNO”的字段,并且它的类型为INTEGER

所以我建议您创建一个包含类型信息但不一定由真实表支持的“虚拟”模式。 在 Calcite 的几个测试中使用的MockCatalogReader class 是一个很好的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM