Skip to content

Commit 0ff9fcf

Browse files
xuzifu666asolimando
authored andcommitted
[CALCITE-6867] Druid Adapter transforms an SQL NOT IN filter to a Druid IN filter
1 parent 91acb99 commit 0ff9fcf

2 files changed

Lines changed: 26 additions & 1 deletion

File tree

druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ abstract class DruidJsonFilter implements DruidJson {
276276
throw new AssertionError(
277277
DruidQuery.format("Expecting IN or NOT IN but got [%s]", e.getKind()));
278278
}
279+
279280
ImmutableList.Builder<String> listBuilder = ImmutableList.builder();
280281
for (RexNode rexNode : ((RexCall) e).getOperands()) {
281282
if (rexNode.getKind() == SqlKind.LITERAL) {
@@ -294,7 +295,7 @@ abstract class DruidJsonFilter implements DruidJson {
294295
if (columnName == null) {
295296
return null;
296297
}
297-
if (e.getKind() != SqlKind.NOT_IN) {
298+
if (e.getKind() != SqlKind.DRUID_NOT_IN) {
298299
return new DruidJsonFilter.JsonInFilter(columnName, listBuilder.build(), extractionFunction);
299300
} else {
300301
return toNotDruidFilter(

druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,30 @@ class DruidQueryFilterTest {
8787
+ "\"values\":[\"1\",\"5\",\"value1\"]}"));
8888
}
8989

90+
@Test void testNotInFilter() throws IOException {
91+
final Fixture f = new Fixture();
92+
final List<? extends RexNode> listRexNodes =
93+
ImmutableList.of(f.rexBuilder.makeInputRef(f.varcharRowType, 0),
94+
f.rexBuilder.makeExactLiteral(BigDecimal.valueOf(1)),
95+
f.rexBuilder.makeExactLiteral(BigDecimal.valueOf(5)),
96+
f.rexBuilder.makeLiteral("value1"));
97+
98+
RexNode notInRexNode =
99+
f.rexBuilder.makeCall(SqlInternalOperators.DRUID_NOT_IN, listRexNodes);
100+
DruidJsonFilter returnValue = DruidJsonFilter
101+
.toDruidFilters(notInRexNode, f.varcharRowType, druidQuery, f.rexBuilder);
102+
assertThat("Filter is null", returnValue, notNullValue());
103+
JsonFactory jsonFactory = new JsonFactory();
104+
final StringWriter sw = new StringWriter();
105+
JsonGenerator jsonGenerator = jsonFactory.createGenerator(sw);
106+
returnValue.write(jsonGenerator);
107+
jsonGenerator.close();
108+
109+
assertThat(sw,
110+
hasToString("{\"type\":\"not\",\"field\":{\"type\":\"in\",\"dimension\":"
111+
+ "\"dimensionName\",\"values\":[\"1\",\"5\",\"value1\"]}}"));
112+
}
113+
90114
@Test void testBetweenFilterStringCase() throws IOException {
91115
final Fixture f = new Fixture();
92116
final List<RexNode> listRexNodes =

0 commit comments

Comments
 (0)