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 =