diff --git a/benchmarks/src/main/java/io/druid/benchmark/query/TimeseriesBenchmark.java b/benchmarks/src/main/java/io/druid/benchmark/query/TimeseriesBenchmark.java index 27cc33a9eba3..26df306638e6 100644 --- a/benchmarks/src/main/java/io/druid/benchmark/query/TimeseriesBenchmark.java +++ b/benchmarks/src/main/java/io/druid/benchmark/query/TimeseriesBenchmark.java @@ -109,7 +109,7 @@ public class TimeseriesBenchmark @Param({"750000"}) private int rowsPerSegment; - @Param({"basic.A", "basic.timeFilter", "basic.timeFilterAlphanumeric", "basic.timeFilterByInterval"}) + @Param({"basic.A", "basic.timeFilterNumeric", "basic.timeFilterAlphanumeric", "basic.timeFilterByInterval"}) private String schemaAndQuery; private static final Logger log = new Logger(TimeseriesBenchmark.class); @@ -190,7 +190,7 @@ private void setupQueries() .descending(false) .build(); - basicQueries.put("timeFilter", timeFilterQuery); + basicQueries.put("timeFilterNumeric", timeFilterQuery); } { QuerySegmentSpec intervalSpec = new MultipleIntervalSegmentSpec(Arrays.asList(basicSchema.getDataInterval())); diff --git a/processing/src/main/java/io/druid/segment/filter/BoundFilter.java b/processing/src/main/java/io/druid/segment/filter/BoundFilter.java index dbf336094ca9..683dea00d8a5 100644 --- a/processing/src/main/java/io/druid/segment/filter/BoundFilter.java +++ b/processing/src/main/java/io/druid/segment/filter/BoundFilter.java @@ -20,9 +20,7 @@ package io.druid.segment.filter; import com.google.common.base.Predicate; -import com.google.common.base.Strings; import com.google.common.base.Supplier; -import com.google.common.primitives.Longs; import com.metamx.collections.bitmap.ImmutableBitmap; import io.druid.query.extraction.ExtractionFn; import io.druid.query.filter.BitmapIndexSelector; @@ -57,13 +55,9 @@ public BoundFilter(final BoundDimFilter boundDimFilter) @Override public ImmutableBitmap getBitmapIndex(final BitmapIndexSelector selector) { - if (!boundDimFilter.getOrdering().equals(StringComparators.LEXICOGRAPHIC_NAME) || extractionFn != null) { - return Filters.matchPredicate( - boundDimFilter.getDimension(), - selector, - getPredicateFactory().makeStringPredicate() - ); - } else { + if (boundDimFilter.getOrdering().equals(StringComparators.LEXICOGRAPHIC) && extractionFn == null) { + // Optimization for lexicographic bounds with no extractionFn => binary search through the index + final BitmapIndex bitmapIndex = selector.getBitmapIndex(boundDimFilter.getDimension()); if (bitmapIndex == null || bitmapIndex.getCardinality() == 0) { @@ -133,6 +127,12 @@ public void remove() } } ); + } else { + return Filters.matchPredicate( + boundDimFilter.getDimension(), + selector, + getPredicateFactory().makeStringPredicate() + ); } } @@ -188,7 +188,7 @@ public boolean applyLong(long input) return doesMatch(extractionFn.apply(input)); } }; - } else if (boundDimFilter.getOrdering().equals(StringComparators.NUMERIC_NAME)){ + } else if (boundDimFilter.getOrdering().equals(StringComparators.NUMERIC)) { return longPredicateSupplier.get(); } else { return new DruidLongPredicate()