This is an automated email from the ASF dual-hosted git repository.

asolimando pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 0ff9fcf1e7 [CALCITE-6867] Druid Adapter transforms an SQL NOT IN 
filter to a Druid IN filter
0ff9fcf1e7 is described below

commit 0ff9fcf1e7763434b49aa215c071adcfe28ea097
Author: xuyu <[email protected]>
AuthorDate: Thu Feb 27 20:57:38 2025 +0800

    [CALCITE-6867] Druid Adapter transforms an SQL NOT IN filter to a Druid IN 
filter
---
 .../calcite/adapter/druid/DruidJsonFilter.java     |  3 ++-
 .../adapter/druid/DruidQueryFilterTest.java        | 24 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git 
a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java 
b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java
index c797c0357e..6d2dc814dd 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java
@@ -276,6 +276,7 @@ abstract class DruidJsonFilter implements DruidJson {
       throw new AssertionError(
           DruidQuery.format("Expecting IN or NOT IN but got [%s]", 
e.getKind()));
     }
+
     ImmutableList.Builder<String> listBuilder = ImmutableList.builder();
     for (RexNode rexNode : ((RexCall) e).getOperands()) {
       if (rexNode.getKind() == SqlKind.LITERAL) {
@@ -294,7 +295,7 @@ abstract class DruidJsonFilter implements DruidJson {
     if (columnName == null) {
       return null;
     }
-    if (e.getKind() != SqlKind.NOT_IN) {
+    if (e.getKind() != SqlKind.DRUID_NOT_IN) {
       return new DruidJsonFilter.JsonInFilter(columnName, listBuilder.build(), 
extractionFunction);
     } else {
       return toNotDruidFilter(
diff --git 
a/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
 
b/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
index 583e7ce03e..11dfaf1c55 100644
--- 
a/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
+++ 
b/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
@@ -87,6 +87,30 @@ class DruidQueryFilterTest {
             + "\"values\":[\"1\",\"5\",\"value1\"]}"));
   }
 
+  @Test void testNotInFilter() throws IOException {
+    final Fixture f = new Fixture();
+    final List<? extends RexNode> listRexNodes =
+        ImmutableList.of(f.rexBuilder.makeInputRef(f.varcharRowType, 0),
+            f.rexBuilder.makeExactLiteral(BigDecimal.valueOf(1)),
+            f.rexBuilder.makeExactLiteral(BigDecimal.valueOf(5)),
+            f.rexBuilder.makeLiteral("value1"));
+
+    RexNode notInRexNode =
+        f.rexBuilder.makeCall(SqlInternalOperators.DRUID_NOT_IN, listRexNodes);
+    DruidJsonFilter returnValue = DruidJsonFilter
+        .toDruidFilters(notInRexNode, f.varcharRowType, druidQuery, 
f.rexBuilder);
+    assertThat("Filter is null", returnValue, notNullValue());
+    JsonFactory jsonFactory = new JsonFactory();
+    final StringWriter sw = new StringWriter();
+    JsonGenerator jsonGenerator = jsonFactory.createGenerator(sw);
+    returnValue.write(jsonGenerator);
+    jsonGenerator.close();
+
+    assertThat(sw,
+        
hasToString("{\"type\":\"not\",\"field\":{\"type\":\"in\",\"dimension\":"
+            + "\"dimensionName\",\"values\":[\"1\",\"5\",\"value1\"]}}"));
+  }
+
   @Test void testBetweenFilterStringCase() throws IOException {
     final Fixture f = new Fixture();
     final List<RexNode> listRexNodes =

Reply via email to