簡體   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