diff --git a/extensions-contrib/materialized-view-selection/src/main/java/io/druid/query/materializedview/MaterializedViewUtils.java b/extensions-contrib/materialized-view-selection/src/main/java/io/druid/query/materializedview/MaterializedViewUtils.java index 3b6cc5517ae..48999be1046 100644 --- a/extensions-contrib/materialized-view-selection/src/main/java/io/druid/query/materializedview/MaterializedViewUtils.java +++ b/extensions-contrib/materialized-view-selection/src/main/java/io/druid/query/materializedview/MaterializedViewUtils.java @@ -20,24 +20,12 @@ package io.druid.query.materializedview; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import io.druid.java.util.common.Intervals; import io.druid.java.util.common.JodaUtils; import io.druid.query.Query; import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.FilteredAggregatorFactory; import io.druid.query.dimension.DimensionSpec; -import io.druid.query.filter.AndDimFilter; -import io.druid.query.filter.BoundDimFilter; -import io.druid.query.filter.DimFilter; -import io.druid.query.filter.InDimFilter; -import io.druid.query.filter.IntervalDimFilter; -import io.druid.query.filter.LikeDimFilter; -import io.druid.query.filter.NotDimFilter; -import io.druid.query.filter.OrDimFilter; -import io.druid.query.filter.RegexDimFilter; -import io.druid.query.filter.SearchQueryDimFilter; -import io.druid.query.filter.SelectorDimFilter; import io.druid.query.groupby.GroupByQuery; import io.druid.query.timeseries.TimeseriesQuery; import io.druid.query.topn.TopNQuery; @@ -60,10 +48,9 @@ public class MaterializedViewUtils public static Set getRequiredFields(Query query) { Set dimensions = new HashSet<>(); - Set dimsInFilter = getDimensionsInFilter(query.getFilter()); - if (dimsInFilter != null) { - dimensions.addAll(dimsInFilter); - } + Set dimsInFilter = null == query.getFilter() ? new HashSet() : query.getFilter().getRequiredColumns(); + dimensions.addAll(dimsInFilter); + if (query instanceof TopNQuery) { TopNQuery q = (TopNQuery) query; dimensions.addAll(extractFieldsFromAggregations(q.getAggregatorSpecs())); @@ -90,58 +77,13 @@ public class MaterializedViewUtils for (AggregatorFactory agg : aggs) { if (agg instanceof FilteredAggregatorFactory) { FilteredAggregatorFactory fagg = (FilteredAggregatorFactory) agg; - ret.addAll(getDimensionsInFilter(fagg.getFilter())); + ret.addAll(fagg.getFilter().getRequiredColumns()); } ret.addAll(agg.requiredFields()); } return ret; } - private static Set getDimensionsInFilter(DimFilter dimFilter) - { - if (dimFilter instanceof AndDimFilter) { - AndDimFilter d = (AndDimFilter) dimFilter; - Set ret = new HashSet<>(); - for (DimFilter filter : d.getFields()) { - ret.addAll(getDimensionsInFilter(filter)); - } - return ret; - } else if (dimFilter instanceof OrDimFilter) { - OrDimFilter d = (OrDimFilter) dimFilter; - Set ret = new HashSet<>(); - for (DimFilter filter : d.getFields()) { - ret.addAll(getDimensionsInFilter(filter)); - } - return ret; - } else if (dimFilter instanceof NotDimFilter) { - NotDimFilter d = (NotDimFilter) dimFilter; - return getDimensionsInFilter(d.getField()); - } else if (dimFilter instanceof BoundDimFilter) { - BoundDimFilter d = (BoundDimFilter) dimFilter; - return Sets.newHashSet(d.getDimension()); - } else if (dimFilter instanceof InDimFilter) { - InDimFilter d = (InDimFilter) dimFilter; - return Sets.newHashSet(d.getDimension()); - } else if (dimFilter instanceof IntervalDimFilter) { - IntervalDimFilter d = (IntervalDimFilter) dimFilter; - return Sets.newHashSet(d.getDimension()); - } else if (dimFilter instanceof LikeDimFilter) { - LikeDimFilter d = (LikeDimFilter) dimFilter; - return Sets.newHashSet(d.getDimension()); - } else if (dimFilter instanceof RegexDimFilter) { - RegexDimFilter d = (RegexDimFilter) dimFilter; - return Sets.newHashSet(d.getDimension()); - } else if (dimFilter instanceof SearchQueryDimFilter) { - SearchQueryDimFilter d = (SearchQueryDimFilter) dimFilter; - return Sets.newHashSet(d.getDimension()); - } else if (dimFilter instanceof SelectorDimFilter) { - SelectorDimFilter d = (SelectorDimFilter) dimFilter; - return Sets.newHashSet(d.getDimension()); - } else { - return null; - } - } - /** * caculate the intervals which are covered by interval2, but not covered by interval1. * result intervals = interval2 - interval1 ∩ interval2 diff --git a/processing/src/main/java/io/druid/query/filter/AndDimFilter.java b/processing/src/main/java/io/druid/query/filter/AndDimFilter.java index 43fd9c02642..b40a72e89a3 100644 --- a/processing/src/main/java/io/druid/query/filter/AndDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/AndDimFilter.java @@ -24,12 +24,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import com.google.common.collect.TreeRangeSet; import io.druid.java.util.common.StringUtils; import io.druid.segment.filter.AndFilter; import io.druid.segment.filter.Filters; import java.util.Arrays; +import java.util.HashSet; import java.util.List; /** @@ -97,6 +99,15 @@ public class AndDimFilter implements DimFilter return retSet; } + @Override + public HashSet getRequiredColumns() + { + HashSet requiredColumns = Sets.newHashSet(); + fields.stream() + .forEach(field -> requiredColumns.addAll(field.getRequiredColumns())); + return requiredColumns; + } + @Override public boolean equals(Object o) { diff --git a/processing/src/main/java/io/druid/query/filter/BoundDimFilter.java b/processing/src/main/java/io/druid/query/filter/BoundDimFilter.java index e4759449866..415a1908012 100644 --- a/processing/src/main/java/io/druid/query/filter/BoundDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/BoundDimFilter.java @@ -26,6 +26,7 @@ import com.google.common.base.Supplier; import com.google.common.collect.BoundType; import com.google.common.collect.Range; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import com.google.common.collect.TreeRangeSet; import com.google.common.primitives.Doubles; import com.google.common.primitives.Floats; @@ -40,6 +41,7 @@ import javax.annotation.Nullable; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.ByteBuffer; +import java.util.HashSet; import java.util.Objects; public class BoundDimFilter implements DimFilter @@ -246,6 +248,12 @@ public class BoundDimFilter implements DimFilter return retSet; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public boolean equals(Object o) { diff --git a/processing/src/main/java/io/druid/query/filter/ColumnComparisonDimFilter.java b/processing/src/main/java/io/druid/query/filter/ColumnComparisonDimFilter.java index 6516b28e421..776bbe64664 100644 --- a/processing/src/main/java/io/druid/query/filter/ColumnComparisonDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/ColumnComparisonDimFilter.java @@ -24,11 +24,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import io.druid.query.cache.CacheKeyBuilder; import io.druid.query.dimension.DimensionSpec; import io.druid.segment.filter.ColumnComparisonFilter; +import java.util.HashSet; import java.util.List; +import java.util.stream.Collectors; /** */ @@ -103,6 +106,15 @@ public class ColumnComparisonDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimensions.stream() + .map(DimensionSpec::getDimension) + .collect(Collectors.toSet()) + ); + } + @Override public int hashCode() { diff --git a/processing/src/main/java/io/druid/query/filter/DimFilter.java b/processing/src/main/java/io/druid/query/filter/DimFilter.java index 28259c13f79..3b9dc17642c 100644 --- a/processing/src/main/java/io/druid/query/filter/DimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/DimFilter.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.google.common.collect.RangeSet; import io.druid.java.util.common.Cacheable; +import java.util.HashSet; + /** */ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") @@ -75,4 +77,9 @@ public interface DimFilter extends Cacheable * determine for this DimFilter. */ RangeSet getDimensionRangeSet(String dimension); + + /** + * @return a HashSet that represents all columns' name which the DimFilter required to do filter. + */ + HashSet getRequiredColumns(); } diff --git a/processing/src/main/java/io/druid/query/filter/ExpressionDimFilter.java b/processing/src/main/java/io/druid/query/filter/ExpressionDimFilter.java index a5e5f256932..8c725c07709 100644 --- a/processing/src/main/java/io/druid/query/filter/ExpressionDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/ExpressionDimFilter.java @@ -23,12 +23,14 @@ import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import io.druid.math.expr.Expr; import io.druid.math.expr.ExprMacroTable; import io.druid.math.expr.Parser; import io.druid.query.cache.CacheKeyBuilder; import io.druid.segment.filter.ExpressionFilter; +import java.util.HashSet; import java.util.Objects; public class ExpressionDimFilter implements DimFilter @@ -70,6 +72,12 @@ public class ExpressionDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(Parser.findRequiredBindings(parsed)); + } + @Override public byte[] getCacheKey() { diff --git a/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java b/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java index c60e6b022bc..16b6fa1dfa6 100644 --- a/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/ExtractionDimFilter.java @@ -23,10 +23,12 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import io.druid.java.util.common.StringUtils; import io.druid.query.extraction.ExtractionFn; import java.nio.ByteBuffer; +import java.util.HashSet; /** * This class is deprecated, use SelectorDimFilter instead: {@link SelectorDimFilter} @@ -110,6 +112,12 @@ public class ExtractionDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public String toString() { diff --git a/processing/src/main/java/io/druid/query/filter/InDimFilter.java b/processing/src/main/java/io/druid/query/filter/InDimFilter.java index d12d0a55274..0eddc923b3d 100644 --- a/processing/src/main/java/io/druid/query/filter/InDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/InDimFilter.java @@ -30,6 +30,7 @@ import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Iterables; import com.google.common.collect.Range; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import com.google.common.collect.TreeRangeSet; import com.google.common.primitives.Doubles; import com.google.common.primitives.Floats; @@ -48,6 +49,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; @@ -215,6 +217,12 @@ public class InDimFilter implements DimFilter return retSet; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public boolean equals(Object o) { diff --git a/processing/src/main/java/io/druid/query/filter/IntervalDimFilter.java b/processing/src/main/java/io/druid/query/filter/IntervalDimFilter.java index 50e80cd1cb1..3e13e5cf735 100644 --- a/processing/src/main/java/io/druid/query/filter/IntervalDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/IntervalDimFilter.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import com.google.common.primitives.Longs; import io.druid.java.util.common.JodaUtils; import io.druid.java.util.common.Pair; @@ -34,6 +35,7 @@ import org.joda.time.Interval; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; public class IntervalDimFilter implements DimFilter @@ -122,6 +124,12 @@ public class IntervalDimFilter implements DimFilter return convertedFilter.getDimensionRangeSet(dimension); } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public boolean equals(Object o) { diff --git a/processing/src/main/java/io/druid/query/filter/JavaScriptDimFilter.java b/processing/src/main/java/io/druid/query/filter/JavaScriptDimFilter.java index 7c6bdab7325..a17566f570d 100644 --- a/processing/src/main/java/io/druid/query/filter/JavaScriptDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/JavaScriptDimFilter.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import io.druid.java.util.common.StringUtils; import io.druid.js.JavaScriptConfig; import io.druid.query.extraction.ExtractionFn; @@ -34,6 +35,7 @@ import org.mozilla.javascript.Function; import org.mozilla.javascript.ScriptableObject; import java.nio.ByteBuffer; +import java.util.HashSet; public class JavaScriptDimFilter implements DimFilter { @@ -134,6 +136,12 @@ public class JavaScriptDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public String toString() { diff --git a/processing/src/main/java/io/druid/query/filter/LikeDimFilter.java b/processing/src/main/java/io/druid/query/filter/LikeDimFilter.java index 5a98bc5d232..31cb3b32af3 100644 --- a/processing/src/main/java/io/druid/query/filter/LikeDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/LikeDimFilter.java @@ -25,6 +25,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Strings; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import com.google.common.io.BaseEncoding; import com.google.common.primitives.Chars; import io.druid.java.util.common.StringUtils; @@ -34,6 +35,7 @@ import io.druid.segment.filter.LikeFilter; import javax.annotation.Nullable; import java.nio.ByteBuffer; +import java.util.HashSet; import java.util.regex.Pattern; public class LikeDimFilter implements DimFilter @@ -306,6 +308,12 @@ public class LikeDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public boolean equals(Object o) { diff --git a/processing/src/main/java/io/druid/query/filter/NoopDimFilter.java b/processing/src/main/java/io/druid/query/filter/NoopDimFilter.java index 61949fb9247..86041a877f1 100644 --- a/processing/src/main/java/io/druid/query/filter/NoopDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/NoopDimFilter.java @@ -22,6 +22,7 @@ package io.druid.query.filter; import com.google.common.collect.RangeSet; import java.nio.ByteBuffer; +import java.util.HashSet; /** */ @@ -50,4 +51,10 @@ public class NoopDimFilter implements DimFilter { return null; } + + @Override + public HashSet getRequiredColumns() + { + return null; + } } diff --git a/processing/src/main/java/io/druid/query/filter/NotDimFilter.java b/processing/src/main/java/io/druid/query/filter/NotDimFilter.java index d2c220f6d99..599f02ec349 100644 --- a/processing/src/main/java/io/druid/query/filter/NotDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/NotDimFilter.java @@ -27,6 +27,7 @@ import com.google.common.collect.RangeSet; import io.druid.segment.filter.NotFilter; import java.nio.ByteBuffer; +import java.util.HashSet; import java.util.List; /** @@ -100,6 +101,12 @@ public class NotDimFilter implements DimFilter return rangeSet == null ? null : rangeSet.complement(); } + @Override + public HashSet getRequiredColumns() + { + return field.getRequiredColumns(); + } + @Override public boolean equals(Object o) { diff --git a/processing/src/main/java/io/druid/query/filter/OrDimFilter.java b/processing/src/main/java/io/druid/query/filter/OrDimFilter.java index 538a80b31aa..651d59ab84d 100644 --- a/processing/src/main/java/io/druid/query/filter/OrDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/OrDimFilter.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import com.google.common.collect.TreeRangeSet; import io.druid.java.util.common.StringUtils; import io.druid.segment.filter.Filters; @@ -31,6 +32,7 @@ import io.druid.segment.filter.OrFilter; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; /** @@ -105,6 +107,15 @@ public class OrDimFilter implements DimFilter return retSet; } + @Override + public HashSet getRequiredColumns() + { + HashSet requiredColumns = Sets.newHashSet(); + fields.stream() + .forEach(field -> requiredColumns.addAll(field.getRequiredColumns())); + return requiredColumns; + } + @Override public boolean equals(Object o) { diff --git a/processing/src/main/java/io/druid/query/filter/RegexDimFilter.java b/processing/src/main/java/io/druid/query/filter/RegexDimFilter.java index d9e43047bee..fc0e5d3bd82 100644 --- a/processing/src/main/java/io/druid/query/filter/RegexDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/RegexDimFilter.java @@ -23,11 +23,13 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import io.druid.java.util.common.StringUtils; import io.druid.query.extraction.ExtractionFn; import io.druid.segment.filter.RegexFilter; import java.nio.ByteBuffer; +import java.util.HashSet; import java.util.regex.Pattern; /** @@ -108,6 +110,12 @@ public class RegexDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public String toString() { diff --git a/processing/src/main/java/io/druid/query/filter/SearchQueryDimFilter.java b/processing/src/main/java/io/druid/query/filter/SearchQueryDimFilter.java index fb955cf49d8..9a2c78f1dbe 100644 --- a/processing/src/main/java/io/druid/query/filter/SearchQueryDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/SearchQueryDimFilter.java @@ -22,12 +22,14 @@ package io.druid.query.filter; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import io.druid.java.util.common.StringUtils; import io.druid.query.extraction.ExtractionFn; import io.druid.query.search.SearchQuerySpec; import io.druid.segment.filter.SearchQueryFilter; import java.nio.ByteBuffer; +import java.util.HashSet; /** */ @@ -104,6 +106,12 @@ public class SearchQueryDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public String toString() { diff --git a/processing/src/main/java/io/druid/query/filter/SelectorDimFilter.java b/processing/src/main/java/io/druid/query/filter/SelectorDimFilter.java index d13971a8ea2..ebb6fa4fe3a 100644 --- a/processing/src/main/java/io/druid/query/filter/SelectorDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/SelectorDimFilter.java @@ -28,6 +28,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.Range; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import com.google.common.collect.TreeRangeSet; import com.google.common.primitives.Doubles; import com.google.common.primitives.Floats; @@ -38,6 +39,7 @@ import io.druid.segment.filter.DimensionPredicateFilter; import io.druid.segment.filter.SelectorFilter; import java.nio.ByteBuffer; +import java.util.HashSet; import java.util.Objects; /** @@ -192,6 +194,12 @@ public class SelectorDimFilter implements DimFilter return retSet; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public int hashCode() { diff --git a/processing/src/main/java/io/druid/query/filter/SpatialDimFilter.java b/processing/src/main/java/io/druid/query/filter/SpatialDimFilter.java index 7555c93e9df..abe5a3a7ca3 100644 --- a/processing/src/main/java/io/druid/query/filter/SpatialDimFilter.java +++ b/processing/src/main/java/io/druid/query/filter/SpatialDimFilter.java @@ -22,11 +22,13 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.RangeSet; +import com.google.common.collect.Sets; import io.druid.collections.spatial.search.Bound; import io.druid.java.util.common.StringUtils; import io.druid.segment.filter.SpatialFilter; import java.nio.ByteBuffer; +import java.util.HashSet; /** */ @@ -92,6 +94,12 @@ public class SpatialDimFilter implements DimFilter return null; } + @Override + public HashSet getRequiredColumns() + { + return Sets.newHashSet(dimension); + } + @Override public boolean equals(Object o) { diff --git a/processing/src/test/java/io/druid/query/filter/AndDimFilterTest.java b/processing/src/test/java/io/druid/query/filter/AndDimFilterTest.java new file mode 100644 index 00000000000..98f88fd75d6 --- /dev/null +++ b/processing/src/test/java/io/druid/query/filter/AndDimFilterTest.java @@ -0,0 +1,40 @@ +/* + * Licensed to Metamarkets Group Inc. (Metamarkets) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Metamarkets 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 io.druid.query.filter; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import org.junit.Assert; +import org.junit.Test; + +public class AndDimFilterTest +{ + @Test + public void testGetRequiredColumns() + { + AndDimFilter andDimFilter = new AndDimFilter( + Lists.newArrayList( + new SelectorDimFilter("a", "d", null), + new SelectorDimFilter("b", "d", null), + new SelectorDimFilter("c", "d", null) + ) + ); + Assert.assertEquals(andDimFilter.getRequiredColumns(), Sets.newHashSet("a", "b", "c")); + } +} diff --git a/processing/src/test/java/io/druid/query/filter/BoundDimFilterTest.java b/processing/src/test/java/io/druid/query/filter/BoundDimFilterTest.java index 11bc006f7af..951d68774a1 100644 --- a/processing/src/test/java/io/druid/query/filter/BoundDimFilterTest.java +++ b/processing/src/test/java/io/druid/query/filter/BoundDimFilterTest.java @@ -42,6 +42,7 @@ package io.druid.query.filter; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; import com.google.inject.Injector; import com.google.inject.Key; import io.druid.guice.GuiceInjectors; @@ -128,4 +129,11 @@ public class BoundDimFilterTest Assert.assertNotEquals(boundDimFilter.hashCode(), boundDimFilterWithExtract.hashCode()); } + + @Test + public void testGetRequiredColumns() + { + BoundDimFilter boundDimFilter = new BoundDimFilter("dimension", "12", "15", null, null, true, null, StringComparators.ALPHANUMERIC); + Assert.assertEquals(boundDimFilter.getRequiredColumns(), Sets.newHashSet("dimension")); + } } diff --git a/processing/src/test/java/io/druid/query/filter/ColumnComparisonDimFilterTest.java b/processing/src/test/java/io/druid/query/filter/ColumnComparisonDimFilterTest.java index 4996d897fbd..e775a2aea5e 100644 --- a/processing/src/test/java/io/druid/query/filter/ColumnComparisonDimFilterTest.java +++ b/processing/src/test/java/io/druid/query/filter/ColumnComparisonDimFilterTest.java @@ -20,6 +20,7 @@ package io.druid.query.filter; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; import io.druid.query.dimension.DefaultDimensionSpec; import org.junit.Assert; import org.junit.Test; @@ -87,4 +88,16 @@ public class ColumnComparisonDimFilterTest columnComparisonDimFilter3.hashCode() ); } + + @Test + public void testGetRequiredColumns() + { + ColumnComparisonDimFilter columnComparisonDimFilter = new ColumnComparisonDimFilter( + ImmutableList.of( + DefaultDimensionSpec.of("abc"), + DefaultDimensionSpec.of("d") + ) + ); + Assert.assertEquals(columnComparisonDimFilter.getRequiredColumns(), Sets.newHashSet("abc", "d")); + } } diff --git a/processing/src/test/java/io/druid/query/filter/IntervalDimFilterTest.java b/processing/src/test/java/io/druid/query/filter/IntervalDimFilterTest.java index 06538e40daa..f7d409c2514 100644 --- a/processing/src/test/java/io/druid/query/filter/IntervalDimFilterTest.java +++ b/processing/src/test/java/io/druid/query/filter/IntervalDimFilterTest.java @@ -20,6 +20,7 @@ package io.druid.query.filter; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; import com.google.inject.Injector; import com.google.inject.Key; import io.druid.guice.GuiceInjectors; @@ -230,4 +231,18 @@ public class IntervalDimFilterTest ); Assert.assertNotEquals(intervalFilter1, intervalFilter5); } + + @Test + public void testGetRequiredColumns() + { + DimFilter intervalFilter = new IntervalDimFilter( + Column.TIME_COLUMN_NAME, + Arrays.asList( + Intervals.of("1970-01-01T00:00:00.001Z/1970-01-01T00:00:00.004Z"), + Intervals.of("1975-01-01T00:00:00.001Z/1980-01-01T00:00:00.004Z") + ), + null + ); + Assert.assertEquals(intervalFilter.getRequiredColumns(), Sets.newHashSet(Column.TIME_COLUMN_NAME)); + } } diff --git a/processing/src/test/java/io/druid/query/filter/JavaScriptDimFilterTest.java b/processing/src/test/java/io/druid/query/filter/JavaScriptDimFilterTest.java index 5c43f239028..68add65451d 100644 --- a/processing/src/test/java/io/druid/query/filter/JavaScriptDimFilterTest.java +++ b/processing/src/test/java/io/druid/query/filter/JavaScriptDimFilterTest.java @@ -19,6 +19,7 @@ package io.druid.query.filter; +import com.google.common.collect.Sets; import io.druid.js.JavaScriptConfig; import io.druid.query.extraction.RegexDimExtractionFn; import io.druid.segment.filter.JavaScriptFilter; @@ -105,4 +106,11 @@ public class JavaScriptDimFilterTest javaScriptDimFilter.toFilter(); Assert.assertTrue(false); } + + @Test + public void testGetRequiredColumns() + { + JavaScriptDimFilter javaScriptDimFilter = new JavaScriptDimFilter("dim", FN1, null, new JavaScriptConfig(false)); + Assert.assertEquals(javaScriptDimFilter.getRequiredColumns(), Sets.newHashSet("dim")); + } } diff --git a/processing/src/test/java/io/druid/query/filter/LikeDimFilterTest.java b/processing/src/test/java/io/druid/query/filter/LikeDimFilterTest.java index 6defa1cb5db..590e583ed64 100644 --- a/processing/src/test/java/io/druid/query/filter/LikeDimFilterTest.java +++ b/processing/src/test/java/io/druid/query/filter/LikeDimFilterTest.java @@ -20,6 +20,7 @@ package io.druid.query.filter; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; import io.druid.jackson.DefaultObjectMapper; import io.druid.query.extraction.SubstringDimExtractionFn; import org.junit.Assert; @@ -60,4 +61,11 @@ public class LikeDimFilterTest Assert.assertEquals(filter.hashCode(), filter2.hashCode()); Assert.assertNotEquals(filter.hashCode(), filter3.hashCode()); } + + @Test + public void testGetRequiredColumns() + { + final DimFilter filter = new LikeDimFilter("foo", "bar%", "@", new SubstringDimExtractionFn(1, 2)); + Assert.assertEquals(filter.getRequiredColumns(), Sets.newHashSet("foo")); + } } diff --git a/processing/src/test/java/io/druid/query/filter/SelectorDimFilterTest.java b/processing/src/test/java/io/druid/query/filter/SelectorDimFilterTest.java index 8da1dd0dd27..016596f4302 100644 --- a/processing/src/test/java/io/druid/query/filter/SelectorDimFilterTest.java +++ b/processing/src/test/java/io/druid/query/filter/SelectorDimFilterTest.java @@ -19,6 +19,7 @@ package io.druid.query.filter; +import com.google.common.collect.Sets; import io.druid.query.extraction.RegexDimExtractionFn; import org.junit.Assert; import org.junit.Test; @@ -75,4 +76,11 @@ public class SelectorDimFilterTest ); Assert.assertEquals(selectorDimFilter, filter.optimize()); } + + @Test + public void testGetRequiredColumns() + { + SelectorDimFilter selectorDimFilter = new SelectorDimFilter("abc", "d", null); + Assert.assertEquals(selectorDimFilter.getRequiredColumns(), Sets.newHashSet("abc")); + } } diff --git a/processing/src/test/java/io/druid/segment/filter/ExpressionFilterTest.java b/processing/src/test/java/io/druid/segment/filter/ExpressionFilterTest.java index 08cc28dd6a7..2e52b4c5097 100644 --- a/processing/src/test/java/io/druid/segment/filter/ExpressionFilterTest.java +++ b/processing/src/test/java/io/druid/segment/filter/ExpressionFilterTest.java @@ -22,6 +22,7 @@ package io.druid.segment.filter; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; import io.druid.data.input.InputRow; import io.druid.data.input.impl.DimensionsSpec; import io.druid.data.input.impl.FloatDimensionSchema; @@ -39,6 +40,7 @@ import io.druid.segment.IndexBuilder; import io.druid.segment.StorageAdapter; import io.druid.segment.incremental.IncrementalIndexSchema; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -200,6 +202,18 @@ public class ExpressionFilterTest extends BaseFilterTest assertFilterMatches(EDF("like(missing, '1%')"), ImmutableList.of()); } + @Test + public void testGetRequiredColumn() + { + Assert.assertEquals(EDF("like(dim1, '1%')").getRequiredColumns(), Sets.newHashSet("dim1")); + Assert.assertEquals(EDF("dim2 == '1'").getRequiredColumns(), Sets.newHashSet("dim2")); + Assert.assertEquals(EDF("dim3 < '2'").getRequiredColumns(), Sets.newHashSet("dim3")); + Assert.assertEquals(EDF("dim4 == ''").getRequiredColumns(), Sets.newHashSet("dim4")); + Assert.assertEquals(EDF("1 + 1").getRequiredColumns(), Sets.newHashSet()); + Assert.assertEquals(EDF("dim0 == dim3").getRequiredColumns(), Sets.newHashSet("dim0", "dim3")); + Assert.assertEquals(EDF("missing == ''").getRequiredColumns(), Sets.newHashSet("missing")); + } + private static ExpressionDimFilter EDF(final String expression) { return new ExpressionDimFilter(expression, TestExprMacroTable.INSTANCE);