From c73cdd01e9694b241c55e5984699615c57c0fc53 Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Thu, 11 Jun 2020 18:25:19 -1000 Subject: [PATCH 01/10] All aggregators should use vectorization-aware column processor --- .../org/apache/druid/query/QueryContexts.java | 2 +- .../query/aggregation/AggregatorFactory.java | 9 +++++ .../aggregation/CountAggregatorFactory.java | 7 ++++ .../DoubleSumAggregatorFactory.java | 8 ++++ .../FilteredAggregatorFactory.java | 6 +++ .../FloatSumAggregatorFactory.java | 7 ++++ .../aggregation/LongSumAggregatorFactory.java | 11 ++++++ .../SuppressedAggregatorFactory.java | 6 +++ .../HyperUniquesAggregatorFactory.java | 6 +++ .../mean/DoubleMeanAggregatorFactory.java | 8 ++++ .../epinephelinae/GroupByQueryEngineV2.java | 20 +++++++++- .../vector/VectorGroupByEngine.java | 25 ++++++------ .../timeseries/TimeseriesQueryEngine.java | 38 ++++++++++++------- .../segment/column/ColumnCapabilities.java | 1 + .../column/ColumnCapabilitiesImpl.java | 11 ++++++ .../druid/query/SchemaEvolutionTest.java | 2 + 16 files changed, 139 insertions(+), 28 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/query/QueryContexts.java b/processing/src/main/java/org/apache/druid/query/QueryContexts.java index b5a7be0b7dd8..36675935fc82 100644 --- a/processing/src/main/java/org/apache/druid/query/QueryContexts.java +++ b/processing/src/main/java/org/apache/druid/query/QueryContexts.java @@ -59,7 +59,7 @@ public class QueryContexts public static final boolean DEFAULT_USE_CACHE = true; public static final boolean DEFAULT_POPULATE_RESULTLEVEL_CACHE = true; public static final boolean DEFAULT_USE_RESULTLEVEL_CACHE = true; - public static final Vectorize DEFAULT_VECTORIZE = Vectorize.FALSE; + public static final Vectorize DEFAULT_VECTORIZE = Vectorize.TRUE; public static final int DEFAULT_PRIORITY = 0; public static final int DEFAULT_UNCOVERED_INTERVALS_LIMIT = 0; public static final long DEFAULT_TIMEOUT_MILLIS = TimeUnit.MINUTES.toMillis(5); diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java index 93f221771208..21324654c846 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java @@ -26,6 +26,7 @@ import org.apache.druid.query.PerSegmentQueryOptimizationContext; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; +import org.apache.druid.segment.vector.VectorCursor; import javax.annotation.Nullable; import java.util.Arrays; @@ -73,6 +74,14 @@ public boolean canVectorize() return false; } + /** + * Returns whether or not the column in this aggregation supports vectorization. The default implementation returns false. + */ + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + return false; + } + public abstract Comparator getComparator(); /** diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java index 599a2c492020..04a07a4f0fdf 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java @@ -24,6 +24,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import org.apache.druid.segment.ColumnSelectorFactory; +import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import javax.annotation.Nullable; @@ -77,6 +78,12 @@ public boolean canVectorize() return true; } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + return true; + } + @Override public Object combine(Object lhs, Object rhs) { diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java index 00bc89bfc26e..1b4a3af5dbd8 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java @@ -25,6 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseDoubleColumnValueSelector; +import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -84,6 +85,13 @@ public boolean canVectorize() return expression == null; } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); + return originalCapabilities == null || originalCapabilities.canVectorize(); + } + @Override protected VectorAggregator factorizeVector( VectorColumnSelectorFactory columnSelectorFactory, diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java index f76cd3d51516..476950eaaa86 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java @@ -112,6 +112,12 @@ public boolean canVectorize() return delegate.canVectorize() && filter.canVectorizeMatcher(); } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + return delegate.columnCanVectorize(vectorColumnSelectorFactory); + } + @Override public Comparator getComparator() { diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java index d9ed43ab22cf..f3c7a1304c0d 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java @@ -25,6 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseFloatColumnValueSelector; +import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -83,6 +84,12 @@ public boolean canVectorize() return expression == null; } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); + return originalCapabilities == null || originalCapabilities.canVectorize(); + } @Override protected VectorAggregator factorizeVector( diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java index e7945a507cc1..702047eed05d 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java @@ -24,8 +24,12 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; +import org.apache.druid.query.dimension.DefaultDimensionSpec; import org.apache.druid.segment.BaseLongColumnValueSelector; +import org.apache.druid.segment.column.ColumnCapabilities; +import org.apache.druid.segment.column.ValueType; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; +import org.apache.druid.segment.vector.VectorCursor; import org.apache.druid.segment.vector.VectorValueSelector; import javax.annotation.Nullable; @@ -92,6 +96,13 @@ public boolean canVectorize() return expression == null; } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); + return originalCapabilities == null || originalCapabilities.canVectorize(); + } + @Override @Nullable public Object combine(@Nullable Object lhs, @Nullable Object rhs) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java index 35e7938c8b5c..e37ed90ecfea 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java @@ -75,6 +75,12 @@ public boolean canVectorize() return delegate.canVectorize(); } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + return delegate.columnCanVectorize(vectorColumnSelectorFactory); + } + @Override public Comparator getComparator() { diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java index b3ab8c3b4ef8..f7f1160d0654 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java @@ -145,6 +145,12 @@ public boolean canVectorize() return true; } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + return true; + } + @Override public Comparator getComparator() { diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java index d1da4d3189f0..861f4f97b2bb 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java @@ -32,6 +32,7 @@ import org.apache.druid.query.aggregation.VectorAggregator; import org.apache.druid.query.cache.CacheKeyBuilder; import org.apache.druid.segment.ColumnSelectorFactory; +import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import javax.annotation.Nullable; @@ -111,6 +112,13 @@ public boolean canVectorize() return true; } + @Override + public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + { + final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); + return originalCapabilities == null || originalCapabilities.canVectorize(); + } + @Override public Comparator getComparator() { diff --git a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java index f19ae25035ae..20bcfd235040 100644 --- a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java +++ b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java @@ -65,6 +65,7 @@ import org.apache.druid.segment.column.ValueType; import org.apache.druid.segment.data.IndexedInts; import org.apache.druid.segment.filter.Filters; +import org.apache.druid.segment.vector.VectorCursor; import org.joda.time.DateTime; import org.joda.time.Interval; @@ -77,6 +78,8 @@ import java.util.function.Function; import java.util.stream.Stream; +import static org.apache.druid.query.groupby.epinephelinae.vector.VectorGroupByEngine.columnCanVectorize; + /** * Class that knows how to process a groupBy query on a single {@link StorageAdapter}. It returns a {@link Sequence} * of {@link ResultRow} objects that are not guaranteed to be in any particular order, and may not even be fully @@ -143,10 +146,23 @@ public static Sequence process( final Filter filter = Filters.convertToCNFFromQueryContext(query, Filters.toFilter(query.getFilter())); final Interval interval = Iterables.getOnlyElement(query.getIntervals()); - final boolean doVectorize = queryConfig.getVectorize().shouldVectorize( + boolean doVectorize = queryConfig.getVectorize().shouldVectorize( VectorGroupByEngine.canVectorize(query, storageAdapter, filter) ); + VectorCursor cursor = null; + if (doVectorize) { + cursor = storageAdapter.makeVectorCursor( + Filters.toFilter(query.getDimFilter()), + interval, + query.getVirtualColumns(), + false, + queryConfig.getVectorSize(), + null + ); + doVectorize = columnCanVectorize(cursor, query.getAggregatorSpecs()); + } + final Sequence result; if (doVectorize) { @@ -158,7 +174,7 @@ public static Sequence process( filter, interval, querySpecificConfig, - queryConfig + cursor ); } else { result = processNonVectorized( diff --git a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java index 3fa85040cea4..c0c265d8e5fd 100644 --- a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java +++ b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java @@ -89,6 +89,18 @@ public static boolean canVectorize( && adapter.canVectorize(filter, query.getVirtualColumns(), false); } + public static boolean columnCanVectorize(VectorCursor cursor, List aggregatorFactories) + { + if (cursor != null) { + for (AggregatorFactory aggregatorFactory : aggregatorFactories) { + if (!aggregatorFactory.columnCanVectorize(cursor.getColumnSelectorFactory())) { + return false; + } + } + } + return true; + } + public static Sequence process( final GroupByQuery query, final StorageAdapter storageAdapter, @@ -97,10 +109,10 @@ public static Sequence process( @Nullable final Filter filter, final Interval interval, final GroupByQueryConfig config, - final QueryConfig queryConfig + final VectorCursor cursor ) { - if (!canVectorize(query, storageAdapter, filter)) { + if (!canVectorize(query, storageAdapter, filter) || !columnCanVectorize(cursor, query.getAggregatorSpecs())) { throw new ISE("Cannot vectorize"); } @@ -110,15 +122,6 @@ public static Sequence process( @Override public CloseableIterator make() { - final VectorCursor cursor = storageAdapter.makeVectorCursor( - Filters.toFilter(query.getDimFilter()), - interval, - query.getVirtualColumns(), - false, - queryConfig.getVectorSize(), - null - ); - if (cursor == null) { // Return empty iterator. return new CloseableIterator() diff --git a/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java b/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java index 1be36b2f10ef..dab1c51264c4 100644 --- a/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java +++ b/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java @@ -43,6 +43,7 @@ import org.apache.druid.query.vector.VectorCursorGranularizer; import org.apache.druid.segment.SegmentMissingException; import org.apache.druid.segment.StorageAdapter; +import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.filter.Filters; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorCursor; @@ -100,15 +101,35 @@ public Sequence> process(final TimeseriesQuery que final Granularity gran = query.getGranularity(); final boolean descending = query.isDescending(); - final boolean doVectorize = queryConfigToUse.getVectorize().shouldVectorize( + boolean doVectorize = queryConfigToUse.getVectorize().shouldVectorize( adapter.canVectorize(filter, query.getVirtualColumns(), descending) && query.getAggregatorSpecs().stream().allMatch(AggregatorFactory::canVectorize) ); + VectorCursor cursor = null; + if (doVectorize) { + cursor = adapter.makeVectorCursor( + filter, + interval, + query.getVirtualColumns(), + descending, + queryConfigToUse.getVectorSize(), + null + ); + if (cursor != null) { + for (AggregatorFactory aggregatorFactory : query.getAggregatorSpecs()) { + if (!aggregatorFactory.columnCanVectorize(cursor.getColumnSelectorFactory())) { + doVectorize = false; + break; + } + } + } + } + final Sequence> result; if (doVectorize) { - result = processVectorized(query, queryConfigToUse, adapter, filter, interval, gran, descending); + result = processVectorized(query, adapter, interval, gran, cursor); } else { result = processNonVectorized(query, adapter, filter, interval, gran, descending); } @@ -123,26 +144,15 @@ public Sequence> process(final TimeseriesQuery que private Sequence> processVectorized( final TimeseriesQuery query, - final QueryConfig queryConfig, final StorageAdapter adapter, - @Nullable final Filter filter, final Interval queryInterval, final Granularity gran, - final boolean descending + final VectorCursor cursor ) { final boolean skipEmptyBuckets = query.isSkipEmptyBuckets(); final List aggregatorSpecs = query.getAggregatorSpecs(); - final VectorCursor cursor = adapter.makeVectorCursor( - filter, - queryInterval, - query.getVirtualColumns(), - descending, - queryConfig.getVectorSize(), - null - ); - if (cursor == null) { return Sequences.empty(); } diff --git a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java index a9af25b4602c..903a1ab319b4 100644 --- a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java +++ b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java @@ -38,6 +38,7 @@ public interface ColumnCapabilities boolean hasSpatialIndexes(); Capable hasMultipleValues(); boolean isFilterable(); + boolean canVectorize(); enum Capable { diff --git a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java index 9ddbd04a372f..a49c15de3f8b 100644 --- a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java +++ b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java @@ -213,6 +213,17 @@ public boolean isFilterable() filterable; } + @Override + public boolean canVectorize() + { + return !dictionaryEncoded + && (type == ValueType.STRING + || type == ValueType.LONG + || type == ValueType.FLOAT + || type == ValueType.DOUBLE + ); + } + public ColumnCapabilitiesImpl setFilterable(boolean filterable) { this.filterable = filterable; diff --git a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java index 8aeb6f20f8dc..56b8fb63757c 100644 --- a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java +++ b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java @@ -137,6 +137,8 @@ public static > List runQuery( @Before public void setUp() throws IOException { + NullHandling.initializeForTests(); + // Index1: c1 is a string, c2 nonexistent, "uniques" nonexistent index1 = IndexBuilder.create() .tmpDir(temporaryFolder.newFolder()) From 219c89018a0408c5dfa7dfd18488ec11ef8994b2 Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Thu, 11 Jun 2020 18:27:36 -1000 Subject: [PATCH 02/10] All aggregators should use vectorization-aware column processor --- .../org/apache/druid/query/aggregation/AggregatorFactory.java | 1 - .../druid/query/aggregation/CountAggregatorFactory.java | 1 - .../druid/query/aggregation/LongSumAggregatorFactory.java | 3 --- .../query/groupby/epinephelinae/GroupByQueryEngineV2.java | 4 +--- .../groupby/epinephelinae/vector/VectorGroupByEngine.java | 2 -- .../apache/druid/query/timeseries/TimeseriesQueryEngine.java | 1 - 6 files changed, 1 insertion(+), 11 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java index 21324654c846..b7b219e96cc3 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java @@ -26,7 +26,6 @@ import org.apache.druid.query.PerSegmentQueryOptimizationContext; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; -import org.apache.druid.segment.vector.VectorCursor; import javax.annotation.Nullable; import java.util.Arrays; diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java index 04a07a4f0fdf..3c60609f7592 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java @@ -24,7 +24,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import org.apache.druid.segment.ColumnSelectorFactory; -import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import javax.annotation.Nullable; diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java index 702047eed05d..af31dddb6a7c 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java @@ -24,12 +24,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; -import org.apache.druid.query.dimension.DefaultDimensionSpec; import org.apache.druid.segment.BaseLongColumnValueSelector; import org.apache.druid.segment.column.ColumnCapabilities; -import org.apache.druid.segment.column.ValueType; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; -import org.apache.druid.segment.vector.VectorCursor; import org.apache.druid.segment.vector.VectorValueSelector; import javax.annotation.Nullable; diff --git a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java index 20bcfd235040..e762d601c8b7 100644 --- a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java +++ b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java @@ -78,8 +78,6 @@ import java.util.function.Function; import java.util.stream.Stream; -import static org.apache.druid.query.groupby.epinephelinae.vector.VectorGroupByEngine.columnCanVectorize; - /** * Class that knows how to process a groupBy query on a single {@link StorageAdapter}. It returns a {@link Sequence} * of {@link ResultRow} objects that are not guaranteed to be in any particular order, and may not even be fully @@ -160,7 +158,7 @@ public static Sequence process( queryConfig.getVectorSize(), null ); - doVectorize = columnCanVectorize(cursor, query.getAggregatorSpecs()); + doVectorize = VectorGroupByEngine.columnCanVectorize(cursor, query.getAggregatorSpecs()); } final Sequence result; diff --git a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java index c0c265d8e5fd..925cd51c49d1 100644 --- a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java +++ b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java @@ -26,7 +26,6 @@ import org.apache.druid.java.util.common.guava.BaseSequence; import org.apache.druid.java.util.common.guava.Sequence; import org.apache.druid.java.util.common.parsers.CloseableIterator; -import org.apache.druid.query.QueryConfig; import org.apache.druid.query.aggregation.AggregatorAdapters; import org.apache.druid.query.aggregation.AggregatorFactory; import org.apache.druid.query.dimension.DimensionSpec; @@ -43,7 +42,6 @@ import org.apache.druid.query.vector.VectorCursorGranularizer; import org.apache.druid.segment.DimensionHandlerUtils; import org.apache.druid.segment.StorageAdapter; -import org.apache.druid.segment.filter.Filters; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorCursor; import org.joda.time.DateTime; diff --git a/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java b/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java index dab1c51264c4..327c48c9a4c6 100644 --- a/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java +++ b/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java @@ -43,7 +43,6 @@ import org.apache.druid.query.vector.VectorCursorGranularizer; import org.apache.druid.segment.SegmentMissingException; import org.apache.druid.segment.StorageAdapter; -import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.filter.Filters; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorCursor; From f82d92f9607c3580ebb61b110b4f010667e7f8cc Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Mon, 15 Jun 2020 13:51:52 -1000 Subject: [PATCH 03/10] fix canVectorize --- .../query/aggregation/AggregatorFactory.java | 11 +----- .../aggregation/CountAggregatorFactory.java | 9 +---- .../DoubleSumAggregatorFactory.java | 14 +++---- .../FilteredAggregatorFactory.java | 13 ++----- .../FloatSumAggregatorFactory.java | 14 +++---- .../aggregation/LongSumAggregatorFactory.java | 14 +++---- .../NullableNumericAggregatorFactory.java | 7 ++-- .../SuppressedAggregatorFactory.java | 11 ++---- .../HyperUniquesAggregatorFactory.java | 9 +---- .../mean/DoubleMeanAggregatorFactory.java | 14 +++---- .../epinephelinae/GroupByQueryEngineV2.java | 18 +-------- .../vector/VectorGroupByEngine.java | 29 +++++++------- .../timeseries/TimeseriesQueryEngine.java | 39 +++++++------------ .../segment/ColumnCapabilitiesProvider.java | 37 ++++++++++++++++++ .../druid/segment/ColumnSelectorFactory.java | 3 +- .../apache/druid/segment/StorageAdapter.java | 3 +- .../vector/VectorColumnSelectorFactory.java | 4 +- 17 files changed, 115 insertions(+), 134 deletions(-) create mode 100644 processing/src/main/java/org/apache/druid/segment/ColumnCapabilitiesProvider.java diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java index b7b219e96cc3..68f3514ce0b3 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java @@ -24,6 +24,7 @@ import org.apache.druid.java.util.common.UOE; import org.apache.druid.java.util.common.logger.Logger; import org.apache.druid.query.PerSegmentQueryOptimizationContext; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -68,15 +69,7 @@ public VectorAggregator factorizeVector(VectorColumnSelectorFactory selectorFact /** * Returns whether or not this aggregation class supports vectorization. The default implementation returns false. */ - public boolean canVectorize() - { - return false; - } - - /** - * Returns whether or not the column in this aggregation supports vectorization. The default implementation returns false. - */ - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { return false; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java index 3c60609f7592..82bad1bacf0b 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -72,13 +73,7 @@ public Comparator getComparator() } @Override - public boolean canVectorize() - { - return true; - } - - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { return true; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java index 1b4a3af5dbd8..7c5768b7e43b 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java @@ -25,6 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseDoubleColumnValueSelector; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -80,18 +81,15 @@ protected VectorValueSelector vectorSelector(VectorColumnSelectorFactory columnS } @Override - public boolean canVectorize() + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { + if (fieldName != null) { + final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); + } return expression == null; } - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) - { - final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); - return originalCapabilities == null || originalCapabilities.canVectorize(); - } - @Override protected VectorAggregator factorizeVector( VectorColumnSelectorFactory columnSelectorFactory, diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java index 476950eaaa86..689a6cd9e13e 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java @@ -29,6 +29,7 @@ import org.apache.druid.query.filter.IntervalDimFilter; import org.apache.druid.query.filter.ValueMatcher; import org.apache.druid.query.filter.vector.VectorValueMatcher; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.column.ColumnHolder; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -98,7 +99,7 @@ public BufferAggregator factorizeBuffered(ColumnSelectorFactory columnSelectorFa @Override public VectorAggregator factorizeVector(VectorColumnSelectorFactory columnSelectorFactory) { - Preconditions.checkState(canVectorize(), "Cannot vectorize"); + Preconditions.checkState(canVectorize(columnSelectorFactory), "Cannot vectorize"); final VectorValueMatcher valueMatcher = filter.makeVectorMatcher(columnSelectorFactory); return new FilteredVectorAggregator( valueMatcher, @@ -107,15 +108,9 @@ public VectorAggregator factorizeVector(VectorColumnSelectorFactory columnSelect } @Override - public boolean canVectorize() + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { - return delegate.canVectorize() && filter.canVectorizeMatcher(); - } - - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) - { - return delegate.columnCanVectorize(vectorColumnSelectorFactory); + return delegate.canVectorize(columnCapabilitiesProvider) && filter.canVectorizeMatcher(); } @Override diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java index f3c7a1304c0d..514c038c5ed6 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java @@ -25,6 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseFloatColumnValueSelector; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -79,18 +80,15 @@ protected VectorValueSelector vectorSelector(VectorColumnSelectorFactory columnS } @Override - public boolean canVectorize() + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { + if (fieldName != null) { + final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); + } return expression == null; } - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) - { - final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); - return originalCapabilities == null || originalCapabilities.canVectorize(); - } - @Override protected VectorAggregator factorizeVector( VectorColumnSelectorFactory columnSelectorFactory, diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java index af31dddb6a7c..760d7fb1acf1 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java @@ -25,6 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseLongColumnValueSelector; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -88,18 +89,15 @@ protected VectorAggregator factorizeVector( } @Override - public boolean canVectorize() + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { + if (fieldName != null) { + final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); + } return expression == null; } - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) - { - final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); - return originalCapabilities == null || originalCapabilities.canVectorize(); - } - @Override @Nullable public Object combine(@Nullable Object lhs, @Nullable Object rhs) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericAggregatorFactory.java index d9d66e37599a..615f0b57db1a 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericAggregatorFactory.java @@ -65,7 +65,7 @@ public final BufferAggregator factorizeBuffered(ColumnSelectorFactory columnSele @Override public final VectorAggregator factorizeVector(VectorColumnSelectorFactory columnSelectorFactory) { - Preconditions.checkState(canVectorize(), "Cannot vectorize"); + Preconditions.checkState(canVectorize(columnSelectorFactory), "Cannot vectorize"); VectorValueSelector selector = vectorSelector(columnSelectorFactory); VectorAggregator aggregator = factorizeVector(columnSelectorFactory, selector); return NullHandling.replaceWithDefault() ? aggregator : new NullableNumericVectorAggregator(aggregator, selector); @@ -135,12 +135,11 @@ protected abstract BufferAggregator factorizeBuffered( * @see BufferAggregator */ protected VectorAggregator factorizeVector( - // Not used by current aggregators, but here for parity with "factorizeBuffered". - @SuppressWarnings("unused") VectorColumnSelectorFactory columnSelectorFactory, + VectorColumnSelectorFactory columnSelectorFactory, VectorValueSelector selector ) { - if (!canVectorize()) { + if (!canVectorize(columnSelectorFactory)) { throw new UnsupportedOperationException("Cannot vectorize"); } else { throw new UnsupportedOperationException("canVectorize returned true but 'factorizeVector' is not implemented"); diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java index e37ed90ecfea..1a227e6b4de9 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java @@ -22,6 +22,7 @@ import org.apache.druid.query.PerSegmentQueryOptimizationContext; import org.apache.druid.query.cache.CacheKeyBuilder; import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -70,15 +71,9 @@ public VectorAggregator factorizeVector(VectorColumnSelectorFactory columnSelect } @Override - public boolean canVectorize() + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { - return delegate.canVectorize(); - } - - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) - { - return delegate.columnCanVectorize(vectorColumnSelectorFactory); + return delegate.canVectorize(columnCapabilitiesProvider); } @Override diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java index f7f1160d0654..b9465d37b263 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java @@ -38,6 +38,7 @@ import org.apache.druid.query.aggregation.cardinality.HyperLogLogCollectorAggregateCombiner; import org.apache.druid.query.cache.CacheKeyBuilder; import org.apache.druid.segment.BaseObjectColumnValueSelector; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.NilColumnValueSelector; import org.apache.druid.segment.column.ColumnCapabilities; @@ -140,13 +141,7 @@ public VectorAggregator factorizeVector(final VectorColumnSelectorFactory select } @Override - public boolean canVectorize() - { - return true; - } - - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { return true; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java index 861f4f97b2bb..4f4f83d44cb7 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java @@ -31,6 +31,7 @@ import org.apache.druid.query.aggregation.BufferAggregator; import org.apache.druid.query.aggregation.VectorAggregator; import org.apache.druid.query.cache.CacheKeyBuilder; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -107,18 +108,15 @@ public VectorAggregator factorizeVector(final VectorColumnSelectorFactory select } @Override - public boolean canVectorize() + public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { + if (fieldName != null) { + final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + return originalCapabilities == null || originalCapabilities.getType().isNumeric(); + } return true; } - @Override - public boolean columnCanVectorize(VectorColumnSelectorFactory vectorColumnSelectorFactory) - { - final ColumnCapabilities originalCapabilities = vectorColumnSelectorFactory.getColumnCapabilities(fieldName); - return originalCapabilities == null || originalCapabilities.canVectorize(); - } - @Override public Comparator getComparator() { diff --git a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java index e762d601c8b7..f19ae25035ae 100644 --- a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java +++ b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GroupByQueryEngineV2.java @@ -65,7 +65,6 @@ import org.apache.druid.segment.column.ValueType; import org.apache.druid.segment.data.IndexedInts; import org.apache.druid.segment.filter.Filters; -import org.apache.druid.segment.vector.VectorCursor; import org.joda.time.DateTime; import org.joda.time.Interval; @@ -144,23 +143,10 @@ public static Sequence process( final Filter filter = Filters.convertToCNFFromQueryContext(query, Filters.toFilter(query.getFilter())); final Interval interval = Iterables.getOnlyElement(query.getIntervals()); - boolean doVectorize = queryConfig.getVectorize().shouldVectorize( + final boolean doVectorize = queryConfig.getVectorize().shouldVectorize( VectorGroupByEngine.canVectorize(query, storageAdapter, filter) ); - VectorCursor cursor = null; - if (doVectorize) { - cursor = storageAdapter.makeVectorCursor( - Filters.toFilter(query.getDimFilter()), - interval, - query.getVirtualColumns(), - false, - queryConfig.getVectorSize(), - null - ); - doVectorize = VectorGroupByEngine.columnCanVectorize(cursor, query.getAggregatorSpecs()); - } - final Sequence result; if (doVectorize) { @@ -172,7 +158,7 @@ public static Sequence process( filter, interval, querySpecificConfig, - cursor + queryConfig ); } else { result = processNonVectorized( diff --git a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java index 925cd51c49d1..c03f04e72200 100644 --- a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java +++ b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java @@ -26,6 +26,7 @@ import org.apache.druid.java.util.common.guava.BaseSequence; import org.apache.druid.java.util.common.guava.Sequence; import org.apache.druid.java.util.common.parsers.CloseableIterator; +import org.apache.druid.query.QueryConfig; import org.apache.druid.query.aggregation.AggregatorAdapters; import org.apache.druid.query.aggregation.AggregatorFactory; import org.apache.druid.query.dimension.DimensionSpec; @@ -42,6 +43,7 @@ import org.apache.druid.query.vector.VectorCursorGranularizer; import org.apache.druid.segment.DimensionHandlerUtils; import org.apache.druid.segment.StorageAdapter; +import org.apache.druid.segment.filter.Filters; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorCursor; import org.joda.time.DateTime; @@ -83,22 +85,10 @@ public static boolean canVectorize( return GroupByQueryEngineV2.isAllSingleValueDims(adapter::getColumnCapabilities, query.getDimensions(), true) && query.getDimensions().stream().allMatch(DimensionSpec::canVectorize) - && query.getAggregatorSpecs().stream().allMatch(AggregatorFactory::canVectorize) + && query.getAggregatorSpecs().stream().allMatch(aggregatorFactory -> aggregatorFactory.canVectorize(adapter)) && adapter.canVectorize(filter, query.getVirtualColumns(), false); } - public static boolean columnCanVectorize(VectorCursor cursor, List aggregatorFactories) - { - if (cursor != null) { - for (AggregatorFactory aggregatorFactory : aggregatorFactories) { - if (!aggregatorFactory.columnCanVectorize(cursor.getColumnSelectorFactory())) { - return false; - } - } - } - return true; - } - public static Sequence process( final GroupByQuery query, final StorageAdapter storageAdapter, @@ -107,10 +97,10 @@ public static Sequence process( @Nullable final Filter filter, final Interval interval, final GroupByQueryConfig config, - final VectorCursor cursor + final QueryConfig queryConfig ) { - if (!canVectorize(query, storageAdapter, filter) || !columnCanVectorize(cursor, query.getAggregatorSpecs())) { + if (!canVectorize(query, storageAdapter, filter)) { throw new ISE("Cannot vectorize"); } @@ -120,6 +110,15 @@ public static Sequence process( @Override public CloseableIterator make() { + final VectorCursor cursor = storageAdapter.makeVectorCursor( + Filters.toFilter(query.getDimFilter()), + interval, + query.getVirtualColumns(), + false, + queryConfig.getVectorSize(), + null + ); + if (cursor == null) { // Return empty iterator. return new CloseableIterator() diff --git a/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java b/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java index 327c48c9a4c6..f420f782f805 100644 --- a/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java +++ b/processing/src/main/java/org/apache/druid/query/timeseries/TimeseriesQueryEngine.java @@ -100,35 +100,15 @@ public Sequence> process(final TimeseriesQuery que final Granularity gran = query.getGranularity(); final boolean descending = query.isDescending(); - boolean doVectorize = queryConfigToUse.getVectorize().shouldVectorize( + final boolean doVectorize = queryConfigToUse.getVectorize().shouldVectorize( adapter.canVectorize(filter, query.getVirtualColumns(), descending) - && query.getAggregatorSpecs().stream().allMatch(AggregatorFactory::canVectorize) + && query.getAggregatorSpecs().stream().allMatch(aggregatorFactory -> aggregatorFactory.canVectorize(adapter)) ); - VectorCursor cursor = null; - if (doVectorize) { - cursor = adapter.makeVectorCursor( - filter, - interval, - query.getVirtualColumns(), - descending, - queryConfigToUse.getVectorSize(), - null - ); - if (cursor != null) { - for (AggregatorFactory aggregatorFactory : query.getAggregatorSpecs()) { - if (!aggregatorFactory.columnCanVectorize(cursor.getColumnSelectorFactory())) { - doVectorize = false; - break; - } - } - } - } - final Sequence> result; if (doVectorize) { - result = processVectorized(query, adapter, interval, gran, cursor); + result = processVectorized(query, queryConfigToUse, adapter, filter, interval, gran, descending); } else { result = processNonVectorized(query, adapter, filter, interval, gran, descending); } @@ -143,15 +123,26 @@ public Sequence> process(final TimeseriesQuery que private Sequence> processVectorized( final TimeseriesQuery query, + final QueryConfig queryConfig, final StorageAdapter adapter, + @Nullable final Filter filter, final Interval queryInterval, final Granularity gran, - final VectorCursor cursor + final boolean descending ) { final boolean skipEmptyBuckets = query.isSkipEmptyBuckets(); final List aggregatorSpecs = query.getAggregatorSpecs(); + final VectorCursor cursor = adapter.makeVectorCursor( + filter, + queryInterval, + query.getVirtualColumns(), + descending, + queryConfig.getVectorSize(), + null + ); + if (cursor == null) { return Sequences.empty(); } diff --git a/processing/src/main/java/org/apache/druid/segment/ColumnCapabilitiesProvider.java b/processing/src/main/java/org/apache/druid/segment/ColumnCapabilitiesProvider.java new file mode 100644 index 000000000000..6451edd92765 --- /dev/null +++ b/processing/src/main/java/org/apache/druid/segment/ColumnCapabilitiesProvider.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.druid.segment; + +import org.apache.druid.segment.column.ColumnCapabilities; + +import javax.annotation.Nullable; + +public interface ColumnCapabilitiesProvider +{ + /** + * Returns capabilities of a particular column. + * + * @param column column name + * + * @return capabilities, or null + */ + @Nullable + ColumnCapabilities getColumnCapabilities(String column); +} diff --git a/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java b/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java index 07e66a672259..ca21713097da 100644 --- a/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java +++ b/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java @@ -31,7 +31,7 @@ * @see org.apache.druid.segment.vector.VectorColumnSelectorFactory, the vectorized version */ @PublicApi -public interface ColumnSelectorFactory +public interface ColumnSelectorFactory extends ColumnCapabilitiesProvider { DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec); @@ -50,6 +50,7 @@ public interface ColumnSelectorFactory * * @return capabilities, or null */ + @Override @Nullable ColumnCapabilities getColumnCapabilities(String column); } diff --git a/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java b/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java index 6fa16a6bcf26..930828b361ec 100644 --- a/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java +++ b/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java @@ -30,7 +30,7 @@ /** */ @PublicApi -public interface StorageAdapter extends CursorFactory +public interface StorageAdapter extends CursorFactory, ColumnCapabilitiesProvider { Interval getInterval(); Indexed getAvailableDimensions(); @@ -62,6 +62,7 @@ public interface StorageAdapter extends CursorFactory * * @return capabilities, or null */ + @Override @Nullable ColumnCapabilities getColumnCapabilities(String column); diff --git a/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java b/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java index bea845f7f5fb..b9deafe678e5 100644 --- a/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java +++ b/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java @@ -20,6 +20,7 @@ package org.apache.druid.segment.vector; import org.apache.druid.query.dimension.DimensionSpec; +import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.column.ColumnCapabilities; import javax.annotation.Nullable; @@ -29,7 +30,7 @@ * * @see org.apache.druid.segment.ColumnSelectorFactory, the non-vectorized version. */ -public interface VectorColumnSelectorFactory +public interface VectorColumnSelectorFactory extends ColumnCapabilitiesProvider { /** * Returns a {@link VectorSizeInspector} for the {@link VectorCursor} that generated this object. @@ -72,6 +73,7 @@ default int getMaxVectorSize() * * @return capabilities, or null if the column doesn't exist. */ + @Override @Nullable ColumnCapabilities getColumnCapabilities(String column); } From ced7e51d77f32d021c2b844beb79890ba174c610 Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Mon, 15 Jun 2020 13:53:31 -1000 Subject: [PATCH 04/10] fix canVectorize --- .../epinephelinae/vector/VectorGroupByEngine.java | 1 - .../druid/segment/column/ColumnCapabilities.java | 1 - .../druid/segment/column/ColumnCapabilitiesImpl.java | 11 ----------- 3 files changed, 13 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java index c03f04e72200..10408fe2d7a8 100644 --- a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java +++ b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/VectorGroupByEngine.java @@ -28,7 +28,6 @@ import org.apache.druid.java.util.common.parsers.CloseableIterator; import org.apache.druid.query.QueryConfig; import org.apache.druid.query.aggregation.AggregatorAdapters; -import org.apache.druid.query.aggregation.AggregatorFactory; import org.apache.druid.query.dimension.DimensionSpec; import org.apache.druid.query.filter.Filter; import org.apache.druid.query.groupby.GroupByQuery; diff --git a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java index 903a1ab319b4..a9af25b4602c 100644 --- a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java +++ b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilities.java @@ -38,7 +38,6 @@ public interface ColumnCapabilities boolean hasSpatialIndexes(); Capable hasMultipleValues(); boolean isFilterable(); - boolean canVectorize(); enum Capable { diff --git a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java index a49c15de3f8b..9ddbd04a372f 100644 --- a/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java +++ b/processing/src/main/java/org/apache/druid/segment/column/ColumnCapabilitiesImpl.java @@ -213,17 +213,6 @@ public boolean isFilterable() filterable; } - @Override - public boolean canVectorize() - { - return !dictionaryEncoded - && (type == ValueType.STRING - || type == ValueType.LONG - || type == ValueType.FLOAT - || type == ValueType.DOUBLE - ); - } - public ColumnCapabilitiesImpl setFilterable(boolean filterable) { this.filterable = filterable; From de92e3cad6d6f31d7f442537819e74ed49ff5266 Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Mon, 15 Jun 2020 14:38:10 -1000 Subject: [PATCH 05/10] add tests --- .../druid/query/SchemaEvolutionTest.java | 22 +++++++++++++--- .../mean/DoubleMeanAggregationTest.java | 25 ++++++++++++++++--- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java index 56b8fb63757c..a3d7b568a615 100644 --- a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java +++ b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java @@ -21,7 +21,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; import com.google.common.io.Closeables; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; import org.apache.druid.common.config.NullHandling; import org.apache.druid.data.input.InputRow; import org.apache.druid.data.input.impl.DimensionsSpec; @@ -55,6 +58,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; import java.io.IOException; import java.util.HashMap; @@ -64,12 +68,18 @@ /** * Tests designed to exercise changing column types, adding columns, removing columns, etc. */ +@RunWith(JUnitParamsRunner.class) public class SchemaEvolutionTest { private static final String DATA_SOURCE = "foo"; private static final String TIMESTAMP_COLUMN = "t"; private static final double THIRTY_ONE_POINT_ONE = 31.1d; + public Object[] doVectorize() + { + return Lists.newArrayList(true, false).toArray(); + } + public static List> timeseriesResult(final Map map) { return ImmutableList.of(new Result<>(DateTimes.of("2000"), new TimeseriesResultValue((Map) map))); @@ -211,7 +221,8 @@ public void tearDown() throws IOException } @Test - public void testHyperUniqueEvolutionTimeseries() + @Parameters(method = "doVectorize") + public void testHyperUniqueEvolutionTimeseries(boolean doVectorize) { final TimeseriesQueryRunnerFactory factory = QueryRunnerTestHelper.newTimeseriesQueryRunnerFactory(); @@ -224,6 +235,7 @@ public void testHyperUniqueEvolutionTimeseries() new HyperUniquesAggregatorFactory("uniques", "uniques") ) ) + .context(ImmutableMap.of(QueryContexts.VECTORIZE_KEY, doVectorize)) .build(); // index1 has no "uniques" column @@ -240,7 +252,8 @@ public void testHyperUniqueEvolutionTimeseries() } @Test - public void testNumericEvolutionTimeseriesAggregation() + @Parameters(method = "doVectorize") + public void testNumericEvolutionTimeseriesAggregation(boolean doVectorize) { final TimeseriesQueryRunnerFactory factory = QueryRunnerTestHelper.newTimeseriesQueryRunnerFactory(); @@ -258,6 +271,7 @@ public void testNumericEvolutionTimeseriesAggregation() new DoubleSumAggregatorFactory("d", null, "c1 * 1", TestExprMacroTable.INSTANCE) ) ) + .context(ImmutableMap.of(QueryContexts.VECTORIZE_KEY, doVectorize)) .build(); // Only string(1) @@ -315,7 +329,8 @@ public void testNumericEvolutionTimeseriesAggregation() } @Test - public void testNumericEvolutionFiltering() + @Parameters(method = "doVectorize") + public void testNumericEvolutionFiltering(boolean doVectorize) { final TimeseriesQueryRunnerFactory factory = QueryRunnerTestHelper.newTimeseriesQueryRunnerFactory(); @@ -333,6 +348,7 @@ public void testNumericEvolutionFiltering() new CountAggregatorFactory("c") ) ) + .context(ImmutableMap.of(QueryContexts.VECTORIZE_KEY, doVectorize)) .build(); // Only string(1) -- which we can filter but not aggregate diff --git a/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregationTest.java b/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregationTest.java index 2f0709e5bb45..8b0d57b09cdd 100644 --- a/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregationTest.java +++ b/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregationTest.java @@ -21,12 +21,17 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; import org.apache.druid.data.input.Row; import org.apache.druid.java.util.common.granularity.Granularities; import org.apache.druid.java.util.common.guava.Sequence; import org.apache.druid.query.Druids; import org.apache.druid.query.Query; +import org.apache.druid.query.QueryContexts; import org.apache.druid.query.Result; import org.apache.druid.query.aggregation.AggregationTestHelper; import org.apache.druid.query.groupby.GroupByQuery; @@ -42,12 +47,19 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; import java.util.Collections; import java.util.List; +@RunWith(JUnitParamsRunner.class) public class DoubleMeanAggregationTest { + public Object[] doVectorize() + { + return Lists.newArrayList(true, false).toArray(); + } + @Rule public final TemporaryFolder tempFolder = new TemporaryFolder(); @@ -77,7 +89,8 @@ public DoubleMeanAggregationTest() } @Test - public void testBufferAggretatorUsingGroupByQuery() throws Exception + @Parameters(method = "doVectorize") + public void testBufferAggretatorUsingGroupByQuery(boolean doVectorize) throws Exception { GroupByQuery query = new GroupByQuery.Builder() .setDataSource("test") @@ -88,6 +101,7 @@ public void testBufferAggretatorUsingGroupByQuery() throws Exception new DoubleMeanAggregatorFactory("meanOnString", SimpleTestIndex.SINGLE_VALUE_DOUBLE_AS_STRING_DIM), new DoubleMeanAggregatorFactory("meanOnMultiValue", SimpleTestIndex.MULTI_VALUE_DOUBLE_AS_STRING_DIM) ) + .setContext(ImmutableMap.of(QueryContexts.VECTORIZE_KEY, doVectorize)) .build(); // do json serialization and deserialization of query to ensure there are no serde issues @@ -103,7 +117,8 @@ public void testBufferAggretatorUsingGroupByQuery() throws Exception } @Test - public void testVectorAggretatorUsingGroupByQueryOnDoubleColumn() throws Exception + @Parameters(method = "doVectorize") + public void testVectorAggretatorUsingGroupByQueryOnDoubleColumn(boolean doVectorize) throws Exception { GroupByQuery query = new GroupByQuery.Builder() .setDataSource("test") @@ -112,7 +127,7 @@ public void testVectorAggretatorUsingGroupByQueryOnDoubleColumn() throws Excepti .setAggregatorSpecs( new DoubleMeanAggregatorFactory("meanOnDouble", SimpleTestIndex.DOUBLE_COL) ) - .setContext(Collections.singletonMap(GroupByQueryConfig.CTX_KEY_VECTORIZE, true)) + .setContext(Collections.singletonMap(GroupByQueryConfig.CTX_KEY_VECTORIZE, doVectorize)) .build(); // do json serialization and deserialization of query to ensure there are no serde issues @@ -126,7 +141,8 @@ public void testVectorAggretatorUsingGroupByQueryOnDoubleColumn() throws Excepti } @Test - public void testAggretatorUsingTimeseriesQuery() throws Exception + @Parameters(method = "doVectorize") + public void testAggretatorUsingTimeseriesQuery(boolean doVectorize) throws Exception { TimeseriesQuery query = Druids.newTimeseriesQueryBuilder() .dataSource("test") @@ -143,6 +159,7 @@ public void testAggretatorUsingTimeseriesQuery() throws Exception SimpleTestIndex.MULTI_VALUE_DOUBLE_AS_STRING_DIM ) ) + .context(ImmutableMap.of(QueryContexts.VECTORIZE_KEY, doVectorize)) .build(); // do json serialization and deserialization of query to ensure there are no serde issues From 6bae6784f7154abba0e2ce8628dcd87ccc76d49a Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Tue, 16 Jun 2020 10:53:22 -1000 Subject: [PATCH 06/10] revert back default --- .../src/main/java/org/apache/druid/query/QueryContexts.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processing/src/main/java/org/apache/druid/query/QueryContexts.java b/processing/src/main/java/org/apache/druid/query/QueryContexts.java index 36675935fc82..b5a7be0b7dd8 100644 --- a/processing/src/main/java/org/apache/druid/query/QueryContexts.java +++ b/processing/src/main/java/org/apache/druid/query/QueryContexts.java @@ -59,7 +59,7 @@ public class QueryContexts public static final boolean DEFAULT_USE_CACHE = true; public static final boolean DEFAULT_POPULATE_RESULTLEVEL_CACHE = true; public static final boolean DEFAULT_USE_RESULTLEVEL_CACHE = true; - public static final Vectorize DEFAULT_VECTORIZE = Vectorize.TRUE; + public static final Vectorize DEFAULT_VECTORIZE = Vectorize.FALSE; public static final int DEFAULT_PRIORITY = 0; public static final int DEFAULT_UNCOVERED_INTERVALS_LIMIT = 0; public static final long DEFAULT_TIMEOUT_MILLIS = TimeUnit.MINUTES.toMillis(5); From c764b66176796d08d01d0a13d54ec8460ff01e01 Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Tue, 16 Jun 2020 13:54:11 -1000 Subject: [PATCH 07/10] address comment --- .../druid/query/aggregation/DoubleSumAggregatorFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java index 7c5768b7e43b..cf83ffe42e5b 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java @@ -27,6 +27,7 @@ import org.apache.druid.segment.BaseDoubleColumnValueSelector; import org.apache.druid.segment.ColumnCapabilitiesProvider; import org.apache.druid.segment.column.ColumnCapabilities; +import org.apache.druid.segment.column.ValueType; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -85,7 +86,7 @@ public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvide { if (fieldName != null) { final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); - return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); + return expression == null && (originalCapabilities == null || ValueType.isNumeric(originalCapabilities.getType())); } return expression == null; } From e595091948bc525f49e3de1a8c76e2832df6818f Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Tue, 16 Jun 2020 16:45:28 -1000 Subject: [PATCH 08/10] address comments --- .../mean/DoubleMeanAggregatorFactory.java | 7 ++----- .../apache/druid/query/SchemaEvolutionTest.java | 15 ++++++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java index 4f4f83d44cb7..a249bca2b1ec 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java @@ -110,11 +110,8 @@ public VectorAggregator factorizeVector(final VectorColumnSelectorFactory select @Override public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) { - if (fieldName != null) { - final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); - return originalCapabilities == null || originalCapabilities.getType().isNumeric(); - } - return true; + final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + return originalCapabilities == null || originalCapabilities.getType().isNumeric(); } @Override diff --git a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java index a3d7b568a615..7e829e00a89a 100644 --- a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java +++ b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java @@ -38,6 +38,7 @@ import org.apache.druid.java.util.common.guava.Sequence; import org.apache.druid.query.aggregation.CountAggregatorFactory; import org.apache.druid.query.aggregation.DoubleSumAggregatorFactory; +import org.apache.druid.query.aggregation.FloatSumAggregatorFactory; import org.apache.druid.query.aggregation.LongSumAggregatorFactory; import org.apache.druid.query.aggregation.hyperloglog.HyperUniquesAggregatorFactory; import org.apache.druid.query.expression.TestExprMacroTable; @@ -345,6 +346,7 @@ public void testNumericEvolutionFiltering(boolean doVectorize) ImmutableList.of( new LongSumAggregatorFactory("a", "c1"), new DoubleSumAggregatorFactory("b", "c1"), + new FloatSumAggregatorFactory("d", "c1"), new CountAggregatorFactory("c") ) ) @@ -353,19 +355,19 @@ public void testNumericEvolutionFiltering(boolean doVectorize) // Only string(1) -- which we can filter but not aggregate Assert.assertEquals( - timeseriesResult(ImmutableMap.of("a", 19L, "b", 19.1, "c", 2L)), + timeseriesResult(ImmutableMap.of("a", 19L, "b", 19.1, "c", 2L, "d", 19.1f)), runQuery(query, factory, ImmutableList.of(index1)) ); // Only long(2) -- which we can filter and aggregate Assert.assertEquals( - timeseriesResult(ImmutableMap.of("a", 19L, "b", 19.0, "c", 2L)), + timeseriesResult(ImmutableMap.of("a", 19L, "b", 19.0, "c", 2L, "d", 19.0f)), runQuery(query, factory, ImmutableList.of(index2)) ); // Only float(3) -- which we can't filter, but can aggregate Assert.assertEquals( - timeseriesResult(ImmutableMap.of("a", 19L, "b", 19.1, "c", 2L)), + timeseriesResult(ImmutableMap.of("a", 19L, "b", 19.1, "c", 2L, "d", 19.1f)), runQuery(query, factory, ImmutableList.of(index3)) ); @@ -377,7 +379,9 @@ public void testNumericEvolutionFiltering(boolean doVectorize) "b", NullHandling.defaultDoubleValue(), "c", - 0L + 0L, + "d", + NullHandling.defaultFloatValue() )), runQuery(query, factory, ImmutableList.of(index4)) ); @@ -387,7 +391,8 @@ public void testNumericEvolutionFiltering(boolean doVectorize) timeseriesResult(ImmutableMap.of( "a", 57L, "b", 57.2, - "c", 6L + "c", 6L, + "d", 57.20000076293945 )), runQuery(query, factory, ImmutableList.of(index1, index2, index3, index4)) ); From e89084a2c39355bcbe34c7bdd4fc6c2d685dc12c Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Tue, 16 Jun 2020 21:02:24 -1000 Subject: [PATCH 09/10] address comment --- .../apache/druid/query/aggregation/AggregatorFactory.java | 4 ++-- .../druid/query/aggregation/CountAggregatorFactory.java | 4 ++-- .../druid/query/aggregation/DoubleSumAggregatorFactory.java | 6 +++--- .../druid/query/aggregation/FilteredAggregatorFactory.java | 6 +++--- .../druid/query/aggregation/FloatSumAggregatorFactory.java | 6 +++--- .../druid/query/aggregation/LongSumAggregatorFactory.java | 6 +++--- .../query/aggregation/SuppressedAggregatorFactory.java | 6 +++--- .../hyperloglog/HyperUniquesAggregatorFactory.java | 4 ++-- .../query/aggregation/mean/DoubleMeanAggregatorFactory.java | 6 +++--- ...ColumnCapabilitiesProvider.java => ColumnInspector.java} | 2 +- .../org/apache/druid/segment/ColumnSelectorFactory.java | 2 +- .../main/java/org/apache/druid/segment/StorageAdapter.java | 2 +- .../druid/segment/vector/VectorColumnSelectorFactory.java | 4 ++-- 13 files changed, 29 insertions(+), 29 deletions(-) rename processing/src/main/java/org/apache/druid/segment/{ColumnCapabilitiesProvider.java => ColumnInspector.java} (96%) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java index 68f3514ce0b3..41e55a303fa7 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/AggregatorFactory.java @@ -24,7 +24,7 @@ import org.apache.druid.java.util.common.UOE; import org.apache.druid.java.util.common.logger.Logger; import org.apache.druid.query.PerSegmentQueryOptimizationContext; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -69,7 +69,7 @@ public VectorAggregator factorizeVector(VectorColumnSelectorFactory selectorFact /** * Returns whether or not this aggregation class supports vectorization. The default implementation returns false. */ - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { return false; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java index 82bad1bacf0b..b7e9fcb14a77 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/CountAggregatorFactory.java @@ -23,7 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -73,7 +73,7 @@ public Comparator getComparator() } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { return true; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java index cf83ffe42e5b..5e086c02cb52 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java @@ -25,7 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseDoubleColumnValueSelector; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.column.ValueType; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -82,10 +82,10 @@ protected VectorValueSelector vectorSelector(VectorColumnSelectorFactory columnS } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { if (fieldName != null) { - final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); return expression == null && (originalCapabilities == null || ValueType.isNumeric(originalCapabilities.getType())); } return expression == null; diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java index 689a6cd9e13e..f00710bb78ec 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/FilteredAggregatorFactory.java @@ -29,7 +29,7 @@ import org.apache.druid.query.filter.IntervalDimFilter; import org.apache.druid.query.filter.ValueMatcher; import org.apache.druid.query.filter.vector.VectorValueMatcher; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.column.ColumnHolder; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -108,9 +108,9 @@ public VectorAggregator factorizeVector(VectorColumnSelectorFactory columnSelect } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { - return delegate.canVectorize(columnCapabilitiesProvider) && filter.canVectorizeMatcher(); + return delegate.canVectorize(columnInspector) && filter.canVectorizeMatcher(); } @Override diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java index 514c038c5ed6..5f6ca03c5bc7 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java @@ -25,7 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseFloatColumnValueSelector; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -80,10 +80,10 @@ protected VectorValueSelector vectorSelector(VectorColumnSelectorFactory columnS } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { if (fieldName != null) { - final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); } return expression == null; diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java index 760d7fb1acf1..04c0240c807e 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java @@ -25,7 +25,7 @@ import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.segment.BaseLongColumnValueSelector; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; import org.apache.druid.segment.vector.VectorValueSelector; @@ -89,10 +89,10 @@ protected VectorAggregator factorizeVector( } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { if (fieldName != null) { - final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); } return expression == null; diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java index 1a227e6b4de9..6468b6771976 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/SuppressedAggregatorFactory.java @@ -22,7 +22,7 @@ import org.apache.druid.query.PerSegmentQueryOptimizationContext; import org.apache.druid.query.cache.CacheKeyBuilder; import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -71,9 +71,9 @@ public VectorAggregator factorizeVector(VectorColumnSelectorFactory columnSelect } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { - return delegate.canVectorize(columnCapabilitiesProvider); + return delegate.canVectorize(columnInspector); } @Override diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java index b9465d37b263..ceb82d5247e5 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java @@ -38,7 +38,7 @@ import org.apache.druid.query.aggregation.cardinality.HyperLogLogCollectorAggregateCombiner; import org.apache.druid.query.cache.CacheKeyBuilder; import org.apache.druid.segment.BaseObjectColumnValueSelector; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.NilColumnValueSelector; import org.apache.druid.segment.column.ColumnCapabilities; @@ -141,7 +141,7 @@ public VectorAggregator factorizeVector(final VectorColumnSelectorFactory select } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { return true; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java index a249bca2b1ec..be5b2fa9afab 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java @@ -31,7 +31,7 @@ import org.apache.druid.query.aggregation.BufferAggregator; import org.apache.druid.query.aggregation.VectorAggregator; import org.apache.druid.query.cache.CacheKeyBuilder; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.ColumnSelectorFactory; import org.apache.druid.segment.column.ColumnCapabilities; import org.apache.druid.segment.vector.VectorColumnSelectorFactory; @@ -108,9 +108,9 @@ public VectorAggregator factorizeVector(final VectorColumnSelectorFactory select } @Override - public boolean canVectorize(ColumnCapabilitiesProvider columnCapabilitiesProvider) + public boolean canVectorize(ColumnInspector columnInspector) { - final ColumnCapabilities originalCapabilities = columnCapabilitiesProvider.getColumnCapabilities(fieldName); + final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); return originalCapabilities == null || originalCapabilities.getType().isNumeric(); } diff --git a/processing/src/main/java/org/apache/druid/segment/ColumnCapabilitiesProvider.java b/processing/src/main/java/org/apache/druid/segment/ColumnInspector.java similarity index 96% rename from processing/src/main/java/org/apache/druid/segment/ColumnCapabilitiesProvider.java rename to processing/src/main/java/org/apache/druid/segment/ColumnInspector.java index 6451edd92765..3090455833e3 100644 --- a/processing/src/main/java/org/apache/druid/segment/ColumnCapabilitiesProvider.java +++ b/processing/src/main/java/org/apache/druid/segment/ColumnInspector.java @@ -23,7 +23,7 @@ import javax.annotation.Nullable; -public interface ColumnCapabilitiesProvider +public interface ColumnInspector { /** * Returns capabilities of a particular column. diff --git a/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java b/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java index ca21713097da..f99f0eade621 100644 --- a/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java +++ b/processing/src/main/java/org/apache/druid/segment/ColumnSelectorFactory.java @@ -31,7 +31,7 @@ * @see org.apache.druid.segment.vector.VectorColumnSelectorFactory, the vectorized version */ @PublicApi -public interface ColumnSelectorFactory extends ColumnCapabilitiesProvider +public interface ColumnSelectorFactory extends ColumnInspector { DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec); diff --git a/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java b/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java index 930828b361ec..e7905b2902e8 100644 --- a/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java +++ b/processing/src/main/java/org/apache/druid/segment/StorageAdapter.java @@ -30,7 +30,7 @@ /** */ @PublicApi -public interface StorageAdapter extends CursorFactory, ColumnCapabilitiesProvider +public interface StorageAdapter extends CursorFactory, ColumnInspector { Interval getInterval(); Indexed getAvailableDimensions(); diff --git a/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java b/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java index b9deafe678e5..ffa23cec433f 100644 --- a/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java +++ b/processing/src/main/java/org/apache/druid/segment/vector/VectorColumnSelectorFactory.java @@ -20,7 +20,7 @@ package org.apache.druid.segment.vector; import org.apache.druid.query.dimension.DimensionSpec; -import org.apache.druid.segment.ColumnCapabilitiesProvider; +import org.apache.druid.segment.ColumnInspector; import org.apache.druid.segment.column.ColumnCapabilities; import javax.annotation.Nullable; @@ -30,7 +30,7 @@ * * @see org.apache.druid.segment.ColumnSelectorFactory, the non-vectorized version. */ -public interface VectorColumnSelectorFactory extends ColumnCapabilitiesProvider +public interface VectorColumnSelectorFactory extends ColumnInspector { /** * Returns a {@link VectorSizeInspector} for the {@link VectorCursor} that generated this object. From 36d0c54b24cd8c7235ae48b6cc809aee89e510ba Mon Sep 17 00:00:00 2001 From: Maytas Monsereenusorn Date: Tue, 16 Jun 2020 22:41:26 -1000 Subject: [PATCH 10/10] address comment --- .../druid/query/aggregation/DoubleSumAggregatorFactory.java | 4 ++-- .../druid/query/aggregation/FloatSumAggregatorFactory.java | 4 ++-- .../druid/query/aggregation/LongSumAggregatorFactory.java | 4 ++-- .../query/aggregation/mean/DoubleMeanAggregatorFactory.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java index 5e086c02cb52..0e5867cf6f00 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/DoubleSumAggregatorFactory.java @@ -85,8 +85,8 @@ protected VectorValueSelector vectorSelector(VectorColumnSelectorFactory columnS public boolean canVectorize(ColumnInspector columnInspector) { if (fieldName != null) { - final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); - return expression == null && (originalCapabilities == null || ValueType.isNumeric(originalCapabilities.getType())); + final ColumnCapabilities capabilities = columnInspector.getColumnCapabilities(fieldName); + return expression == null && (capabilities == null || ValueType.isNumeric(capabilities.getType())); } return expression == null; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java index 5f6ca03c5bc7..0c61920fc28d 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/FloatSumAggregatorFactory.java @@ -83,8 +83,8 @@ protected VectorValueSelector vectorSelector(VectorColumnSelectorFactory columnS public boolean canVectorize(ColumnInspector columnInspector) { if (fieldName != null) { - final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); - return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); + final ColumnCapabilities capabilities = columnInspector.getColumnCapabilities(fieldName); + return expression == null && (capabilities == null || capabilities.getType().isNumeric()); } return expression == null; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java index 04c0240c807e..337ce1817b63 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/LongSumAggregatorFactory.java @@ -92,8 +92,8 @@ protected VectorAggregator factorizeVector( public boolean canVectorize(ColumnInspector columnInspector) { if (fieldName != null) { - final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); - return expression == null && (originalCapabilities == null || originalCapabilities.getType().isNumeric()); + final ColumnCapabilities capabilities = columnInspector.getColumnCapabilities(fieldName); + return expression == null && (capabilities == null || capabilities.getType().isNumeric()); } return expression == null; } diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java index be5b2fa9afab..782a2aad71a0 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java @@ -110,8 +110,8 @@ public VectorAggregator factorizeVector(final VectorColumnSelectorFactory select @Override public boolean canVectorize(ColumnInspector columnInspector) { - final ColumnCapabilities originalCapabilities = columnInspector.getColumnCapabilities(fieldName); - return originalCapabilities == null || originalCapabilities.getType().isNumeric(); + final ColumnCapabilities capabilities = columnInspector.getColumnCapabilities(fieldName); + return capabilities == null || capabilities.getType().isNumeric(); } @Override