[英]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#in
或RexBuilder#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.