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

cwylie 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 fce62b2  fix StringAnyAggregatorFactory to use single value selector 
for non-existent columns (#12194)
fce62b2 is described below

commit fce62b26434cc9ce533857f4f91e1da2816df992
Author: Clint Wylie <[email protected]>
AuthorDate: Tue Jan 25 12:52:30 2022 -0800

    fix StringAnyAggregatorFactory to use single value selector for 
non-existent columns (#12194)
---
 .../query/aggregation/any/StringAnyAggregatorFactory.java  |  3 ++-
 .../java/org/apache/druid/segment/ColumnProcessors.java    | 11 ++++++++---
 .../aggregation/any/StringAnyAggregatorFactoryTest.java    | 14 +++++++++-----
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactory.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactory.java
index 6b90b08..68f6dfc 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactory.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactory.java
@@ -86,7 +86,8 @@ public class StringAnyAggregatorFactory extends 
AggregatorFactory
   {
 
     ColumnCapabilities capabilities = 
selectorFactory.getColumnCapabilities(fieldName);
-    if (capabilities == null || 
capabilities.hasMultipleValues().isMaybeTrue()) {
+    // null capabilities mean the column doesn't exist, so in vector engines 
the selector will never be multi-value
+    if (capabilities != null && 
capabilities.hasMultipleValues().isMaybeTrue()) {
       return new StringAnyVectorAggregator(
           null,
           
selectorFactory.makeMultiValueDimensionSelector(DefaultDimensionSpec.of(fieldName)),
diff --git 
a/processing/src/main/java/org/apache/druid/segment/ColumnProcessors.java 
b/processing/src/main/java/org/apache/druid/segment/ColumnProcessors.java
index 3f8edc7..28eaef4 100644
--- a/processing/src/main/java/org/apache/druid/segment/ColumnProcessors.java
+++ b/processing/src/main/java/org/apache/druid/segment/ColumnProcessors.java
@@ -342,7 +342,7 @@ public class ColumnProcessors
           );
         }
 
-        if (mayBeMultiValue(capabilities)) {
+        if (capabilities.hasMultipleValues().isMaybeTrue()) {
           return processorFactory.makeMultiValueDimensionProcessor(
               capabilities,
               multiValueDimensionSelectorFn.apply(selectorFactory)
@@ -367,8 +367,13 @@ public class ColumnProcessors
   }
 
   /**
-   * Returns true if a given set of capabilities might indicate an underlying 
multi-value column. Errs on the side
-   * of returning true if unknown; i.e. if this returns false, there are 
_definitely not_ mul.
+   * Returns true if a given set of {@link ColumnCapabilities} indicate that a 
processor should handle the column as a
+   * multi-value column. If capabilities are null, or if {@link 
ColumnCapabilities#hasMultipleValues()} is unknown,
+   * this method errs on the side of returning true. If this method returns 
false, the column is _definitely not_
+   * multi-value.
+   *
+   * Note, this method is not suitable for use with vector engines because 
null capabilities are indicative of a column
+   * that does not exist, rather than unknown capabilities.
    */
   private static boolean mayBeMultiValue(@Nullable final ColumnCapabilities 
capabilities)
   {
diff --git 
a/processing/src/test/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactoryTest.java
 
b/processing/src/test/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactoryTest.java
index d666e5e..c480b9b 100644
--- 
a/processing/src/test/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactoryTest.java
+++ 
b/processing/src/test/java/org/apache/druid/query/aggregation/any/StringAnyAggregatorFactoryTest.java
@@ -73,8 +73,9 @@ public class StringAnyAggregatorFactoryTest extends 
InitializedNullHandlingTest
   public void 
factorizeVectorWithoutCapabilitiesShouldReturnAggregatorWithMultiDimensionSelector()
   {
     
Mockito.doReturn(null).when(vectorSelectorFactory).getColumnCapabilities(FIELD_NAME);
-    Mockito.doReturn(multiValueDimensionVectorSelector)
-           .when(vectorSelectorFactory).makeMultiValueDimensionSelector(any());
+    Mockito.doReturn(singleValueDimensionVectorSelector)
+           .when(vectorSelectorFactory)
+           .makeSingleValueDimensionSelector(any());
     StringAnyVectorAggregator aggregator = 
target.factorizeVector(vectorSelectorFactory);
     Assert.assertNotNull(aggregator);
   }
@@ -83,7 +84,8 @@ public class StringAnyAggregatorFactoryTest extends 
InitializedNullHandlingTest
   public void 
factorizeVectorWithUnknownCapabilitiesShouldReturnAggregatorWithMultiDimensionSelector()
   {
     Mockito.doReturn(multiValueDimensionVectorSelector)
-           .when(vectorSelectorFactory).makeMultiValueDimensionSelector(any());
+           .when(vectorSelectorFactory)
+           .makeMultiValueDimensionSelector(any());
     StringAnyVectorAggregator aggregator = 
target.factorizeVector(vectorSelectorFactory);
     Assert.assertNotNull(aggregator);
   }
@@ -93,7 +95,8 @@ public class StringAnyAggregatorFactoryTest extends 
InitializedNullHandlingTest
   {
     
Mockito.doReturn(ColumnCapabilities.Capable.TRUE).when(capabilities).hasMultipleValues();
     Mockito.doReturn(multiValueDimensionVectorSelector)
-           .when(vectorSelectorFactory).makeMultiValueDimensionSelector(any());
+           .when(vectorSelectorFactory)
+           .makeMultiValueDimensionSelector(any());
     StringAnyVectorAggregator aggregator = 
target.factorizeVector(vectorSelectorFactory);
     Assert.assertNotNull(aggregator);
   }
@@ -103,7 +106,8 @@ public class StringAnyAggregatorFactoryTest extends 
InitializedNullHandlingTest
   {
     
Mockito.doReturn(ColumnCapabilities.Capable.FALSE).when(capabilities).hasMultipleValues();
     Mockito.doReturn(singleValueDimensionVectorSelector)
-           
.when(vectorSelectorFactory).makeSingleValueDimensionSelector(any());
+           .when(vectorSelectorFactory)
+           .makeSingleValueDimensionSelector(any());
     StringAnyVectorAggregator aggregator = 
target.factorizeVector(vectorSelectorFactory);
     Assert.assertNotNull(aggregator);
   }

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

Reply via email to