簡體   English   中英

如何將 SqlStdOperatorTable.IN 與 RelBuilder 一起使用?

[英]How to use SqlStdOperatorTable.IN with RelBuilder?

我正在嘗試使用 RelBuilder 構建一個類似於 <SELECT * FROM foo WHERE x IN ("bar1", "bar2")> 的 rexNode。 但我真的找不到任何使用 SqlStdOperatorTable.IN 的示例或任何測試。 請問有人可以分享嗎? 或者解釋一下如何使用SqlStdOperatorTable.IN。

在這里看到了一些東西,但它並沒有太大幫助,也沒有為我工作(

    RelBuilder builder = RelBuilder.create(calciteConfig);
    RelRunner relRunner = calciteConnection.unwrap(RelRunner.class);

    builder.scan("dremio", "test1");
    RexBuilder rexBuilder = new RexBuilder(new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT));
    RexNode rexNode = rexBuilder.makeCall(
            SqlStdOperatorTable.IN,
            builder.field("device_type"),
            rexBuilder.makeLiteral("TABLET"),
            rexBuilder.makeLiteral("MOBILE"));
    RelNode test1 = builder
            .filter(rexNode)
            .limit(10, 100)
            .build();

您必須使用RelBuilder#inRexBuilder#makeIn API。 這是測試用例:

  @Test void testIn() {
    final RelBuilder builder = RelBuilder.create(config().build());
    builder.scan("EMP");

    final RexNode literal1 = builder.literal("foo");
    final RexNode literal2 = builder.literal("bar");

    RexNode inRex = builder.in(builder.field("ENAME"), ImmutableList.of(literal1, literal2));
    RelNode root = builder.filter(inRex)
            .build();

    final String expected = "" +
        "LogicalFilter(condition=[SEARCH($1, Sarg['bar', 'foo']:CHAR(3))])\n" +
        "  LogicalTableScan(table=[[scott, EMP]])\n";
  }

如果您想了解更多上下文,為什么RexCall()的構造函數中存在檢查,即assert operator.kind.= SqlKind.IN請參閱此 CALCITE -4173

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM