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

rohangarg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 022950a0c53 MV_FILTER_ONLY may run into Exceptions in case duplicate 
values were processed (#15012)
022950a0c53 is described below

commit 022950a0c530b7ba82250b01e40505c050218c74
Author: Zoltan Haindrich <[email protected]>
AuthorDate: Wed Sep 27 15:49:42 2023 +0200

    MV_FILTER_ONLY may run into Exceptions in case duplicate values were 
processed (#15012)
---
 .../query/dimension/ListFilteredDimensionSpec.java | 12 +++---
 .../segment/virtual/ListFilteredVirtualColumn.java |  8 +++-
 .../calcite/CalciteMultiValueStringQueryTest.java  | 45 ++++++++++++++++++++++
 3 files changed, 57 insertions(+), 8 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/query/dimension/ListFilteredDimensionSpec.java
 
b/processing/src/main/java/org/apache/druid/query/dimension/ListFilteredDimensionSpec.java
index 2adad9b6628..2aecafc2481 100644
--- 
a/processing/src/main/java/org/apache/druid/query/dimension/ListFilteredDimensionSpec.java
+++ 
b/processing/src/main/java/org/apache/druid/query/dimension/ListFilteredDimensionSpec.java
@@ -79,9 +79,9 @@ public class ListFilteredDimensionSpec extends 
BaseFilteredDimensionSpec
     }
 
     if (isWhitelist) {
-      return filterAllowList(values, selector);
+      return filterAllowList(values, selector, delegate.getExtractionFn() != 
null);
     } else {
-      return filterDenyList(values, selector);
+      return filterDenyList(values, selector, delegate.getExtractionFn() != 
null);
     }
   }
 
@@ -125,9 +125,9 @@ public class ListFilteredDimensionSpec extends 
BaseFilteredDimensionSpec
     return builder.build();
   }
 
-  public static DimensionSelector filterAllowList(Set<String> values, 
DimensionSelector selector)
+  public static DimensionSelector filterAllowList(Set<String> values, 
DimensionSelector selector, boolean forcePredicateFilter)
   {
-    if (selector.getValueCardinality() < 0 || 
!selector.nameLookupPossibleInAdvance()) {
+    if (forcePredicateFilter || selector.getValueCardinality() < 0 || 
!selector.nameLookupPossibleInAdvance()) {
       return new PredicateFilteredDimensionSelector(selector, 
Predicates.in(values));
     }
     final IdMapping idMapping = buildAllowListIdMapping(
@@ -139,9 +139,9 @@ public class ListFilteredDimensionSpec extends 
BaseFilteredDimensionSpec
     return new ForwardingFilteredDimensionSelector(selector, idMapping);
   }
 
-  public static DimensionSelector filterDenyList(Set<String> values, 
DimensionSelector selector)
+  public static DimensionSelector filterDenyList(Set<String> values, 
DimensionSelector selector, boolean forcePredicateFilter)
   {
-    if (selector.getValueCardinality() < 0 || 
!selector.nameLookupPossibleInAdvance()) {
+    if (forcePredicateFilter || selector.getValueCardinality() < 0 || 
!selector.nameLookupPossibleInAdvance()) {
       return new PredicateFilteredDimensionSelector(
           selector,
           input -> !values.contains(input)
diff --git 
a/processing/src/main/java/org/apache/druid/segment/virtual/ListFilteredVirtualColumn.java
 
b/processing/src/main/java/org/apache/druid/segment/virtual/ListFilteredVirtualColumn.java
index 366b323bdef..0ffabc8cc34 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/virtual/ListFilteredVirtualColumn.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/virtual/ListFilteredVirtualColumn.java
@@ -55,6 +55,7 @@ import 
org.apache.druid.segment.index.semantic.DruidPredicateIndexes;
 import org.apache.druid.segment.index.semantic.LexicographicalRangeIndexes;
 import org.apache.druid.segment.index.semantic.NullValueIndex;
 import org.apache.druid.segment.index.semantic.StringValueSetIndexes;
+import org.apache.druid.segment.serde.NoIndexesColumnIndexSupplier;
 
 import javax.annotation.Nullable;
 import java.util.Collections;
@@ -136,9 +137,9 @@ public class ListFilteredVirtualColumn implements 
VirtualColumn
   )
   {
     if (allowList) {
-      return ListFilteredDimensionSpec.filterAllowList(values, 
factory.makeDimensionSelector(delegate));
+      return ListFilteredDimensionSpec.filterAllowList(values, 
factory.makeDimensionSelector(delegate), delegate.getExtractionFn() != null);
     } else {
-      return ListFilteredDimensionSpec.filterDenyList(values, 
factory.makeDimensionSelector(delegate));
+      return ListFilteredDimensionSpec.filterDenyList(values, 
factory.makeDimensionSelector(delegate), delegate.getExtractionFn() != null);
     }
   }
 
@@ -182,6 +183,9 @@ public class ListFilteredVirtualColumn implements 
VirtualColumn
   @Override
   public ColumnIndexSupplier getIndexSupplier(String columnName, 
ColumnSelector columnSelector)
   {
+    if (delegate.getExtractionFn() != null) {
+      return NoIndexesColumnIndexSupplier.getInstance();
+    }
     return new ColumnIndexSupplier()
     {
       @Nullable
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
index d4f25101545..8ad3a1ffc67 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
@@ -21,6 +21,7 @@ package org.apache.druid.sql.calcite;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.java.util.common.StringUtils;
@@ -32,6 +33,7 @@ import 
org.apache.druid.query.aggregation.ExpressionLambdaAggregatorFactory;
 import org.apache.druid.query.aggregation.FilteredAggregatorFactory;
 import org.apache.druid.query.aggregation.LongSumAggregatorFactory;
 import org.apache.druid.query.dimension.DefaultDimensionSpec;
+import org.apache.druid.query.dimension.ExtractionDimensionSpec;
 import org.apache.druid.query.expression.TestExprMacroTable;
 import org.apache.druid.query.filter.ExpressionDimFilter;
 import org.apache.druid.query.filter.InDimFilter;
@@ -41,6 +43,7 @@ import org.apache.druid.query.groupby.GroupByQuery;
 import org.apache.druid.query.groupby.GroupByQueryConfig;
 import org.apache.druid.query.groupby.orderby.DefaultLimitSpec;
 import org.apache.druid.query.groupby.orderby.OrderByColumnSpec;
+import org.apache.druid.query.lookup.RegisteredLookupExtractionFn;
 import org.apache.druid.query.ordering.StringComparators;
 import org.apache.druid.query.scan.ScanQuery;
 import org.apache.druid.segment.column.ColumnType;
@@ -2189,4 +2192,46 @@ public class CalciteMultiValueStringQueryTest extends 
BaseCalciteQueryTest
 
     );
   }
+
+  @Test
+  public void testMultiValuedFilterOnlyWhenLookupPullsInDuplicates()
+  {
+    cannotVectorize();
+    testBuilder()
+        .sql("SELECT \n"
+            + "  MV_FILTER_ONLY(LOOKUP(dim3,'lookyloo'),ARRAY[null]),count(1) 
\n"
+            + "FROM druid.foo AS t group by 1\n")
+        .expectedQuery(
+            GroupByQuery.builder()
+                .setDataSource(CalciteTests.DATASOURCE1)
+                .setInterval(querySegmentSpec(Filtration.eternity()))
+                .setGranularity(Granularities.ALL)
+                .setVirtualColumns(
+                    new ListFilteredVirtualColumn(
+                        "v0",
+                        new ExtractionDimensionSpec(
+                            "dim3",
+                            "dim3",
+                            ColumnType.STRING,
+                            new RegisteredLookupExtractionFn(
+                                null,
+                                "lookyloo",
+                                false,
+                                null,
+                                null,
+                                true)),
+                        Sets.newHashSet((String) null),
+                        true))
+                .setDimensions(
+                    dimensions(
+                        new DefaultDimensionSpec("v0", "d0", 
ColumnType.STRING)))
+                .setAggregatorSpecs(aggregators(new 
CountAggregatorFactory("a0")))
+                .setContext(QUERY_CONTEXT_DEFAULT)
+                .build())
+        .expectedResults(
+            ImmutableList.of(new Object[] {NullHandling.defaultStringValue(), 
7L}))
+        .run();
+
+  }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to