@Override public ValueMatcher makeMatcher( BitmapIndexSelector selector, ColumnSelectorFactory columnSelectorFactory, RowOffsetMatcherFactory rowOffsetMatcherFactory ) { final List<ValueMatcher> matchers = new ArrayList<>(); final List<ImmutableBitmap> bitmaps = new ArrayList<>(); for (Filter filter : filters) { if (filter.supportsBitmapIndex(selector)) { bitmaps.add(filter.getBitmapIndex(selector)); } else { ValueMatcher matcher = filter.makeMatcher(columnSelectorFactory); matchers.add(matcher); } } if (bitmaps.size() > 0) { ImmutableBitmap combinedBitmap = selector.getBitmapFactory().intersection(bitmaps); ValueMatcher offsetMatcher = rowOffsetMatcherFactory.makeRowOffsetMatcher(combinedBitmap); matchers.add(0, offsetMatcher); } return makeMatcher(matchers.toArray(EMPTY_VALUE_MATCHER_ARRAY)); }
@Override public double estimateSelectivity(BitmapIndexSelector indexSelector) { return 1. - baseFilter.estimateSelectivity(indexSelector); }
private static <T> T getBitmapResult( BitmapIndexSelector selector, BitmapResultFactory<T> bitmapResultFactory, List<Filter> filters ) { if (filters.size() == 1) { return filters.get(0).getBitmapResult(selector, bitmapResultFactory); } final List<T> bitmapResults = Lists.newArrayListWithCapacity(filters.size()); for (final Filter filter : filters) { Preconditions.checkArgument(filter.supportsBitmapIndex(selector), "Filter[%s] does not support bitmap index", filter ); final T bitmapResult = filter.getBitmapResult(selector, bitmapResultFactory); if (bitmapResultFactory.isEmpty(bitmapResult)) { // Short-circuit. return bitmapResultFactory.wrapAllFalse(Filters.allFalse(selector)); } bitmapResults.add(bitmapResult); } return bitmapResultFactory.intersection(bitmapResults); }
@Benchmark @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) public void matchSelectorEquals(Blackhole blackhole) { final ImmutableBitmap bitmapIndex = SELECTOR_EQUALS.getBitmapIndex(selector); blackhole.consume(bitmapIndex); }
@Override public ValueMatcher makeMatcher(ColumnSelectorFactory factory) { final ValueMatcher baseMatcher = baseFilter.makeMatcher(factory); return new ValueMatcher() { @Override public boolean matches() { return !baseMatcher.matches(); } @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { inspector.visit("baseMatcher", baseMatcher); } }; }
index ); Preconditions.checkArgument(filter.supportsBitmapIndex(selector), "filter[%s] should support bitmap", filter); baseFilter = filter.getBitmapIndex(selector);
@Override public boolean supportsBitmapIndex(BitmapIndexSelector selector) { for (Filter filter : filters) { if (!filter.supportsBitmapIndex(selector)) { return false; } } return true; }
if (filter == null || filter.supportsSelectivityEstimation(index, selector)) { final List<DimensionSpec> dimsToSearch = getDimsToSearch( index.getAvailableDimensions(), final double cursorOnlyStrategyCost = (filter == null ? 1. : filter.estimateSelectivity(selector))
@Override public boolean supportsSelectivityEstimation(ColumnSelector columnSelector, BitmapIndexSelector indexSelector) { for (Filter filter : filters) { if (!filter.supportsSelectivityEstimation(columnSelector, indexSelector)) { return false; } } return true; }
@Override public <T> T getBitmapResult(BitmapIndexSelector selector, BitmapResultFactory<T> bitmapResultFactory) { if (filters.size() == 1) { return filters.get(0).getBitmapResult(selector, bitmapResultFactory); } List<T> bitmapResults = new ArrayList<>(); for (Filter filter : filters) { bitmapResults.add(filter.getBitmapResult(selector, bitmapResultFactory)); } return bitmapResultFactory.union(bitmapResults); }
@Benchmark @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) public void matchRegexPrefix(Blackhole blackhole) { final ImmutableBitmap bitmapIndex = REGEX_PREFIX.getBitmapIndex(selector); blackhole.consume(bitmapIndex); }
@Override public ValueMatcher makeMatcher(ColumnSelectorFactory factory) { final ValueMatcher[] matchers = new ValueMatcher[filters.size()]; for (int i = 0; i < filters.size(); i++) { matchers[i] = filters.get(i).makeMatcher(factory); } return makeMatcher(matchers); }
index ); Preconditions.checkArgument(filter.supportsBitmapIndex(selector), "filter[%s] should support bitmap", filter); baseFilter = filter.getBitmapIndex(selector);
@Override public boolean supportsBitmapIndex(BitmapIndexSelector selector) { return baseFilter.supportsBitmapIndex(selector); }
if (filter == null || filter.supportsSelectivityEstimation(index, selector)) { final List<DimensionSpec> dimsToSearch = getDimsToSearch( index.getAvailableDimensions(), final double cursorOnlyStrategyCost = (filter == null ? 1. : filter.estimateSelectivity(selector))
@Override public boolean supportsSelectivityEstimation(ColumnSelector columnSelector, BitmapIndexSelector indexSelector) { return baseFilter.supportsSelectivityEstimation(columnSelector, indexSelector); }
@Override public <T> T getBitmapResult(BitmapIndexSelector selector, BitmapResultFactory<T> bitmapResultFactory) { return bitmapResultFactory.complement( baseFilter.getBitmapResult(selector, bitmapResultFactory), selector.getNumRows() ); }
@Override public ValueMatcher makeMatcher( BitmapIndexSelector selector, ColumnSelectorFactory columnSelectorFactory, RowOffsetMatcherFactory rowOffsetMatcherFactory ) { final List<ValueMatcher> matchers = new ArrayList<>(); final List<ImmutableBitmap> bitmaps = new ArrayList<>(); for (Filter filter : filters) { if (filter.supportsBitmapIndex(selector)) { bitmaps.add(filter.getBitmapIndex(selector)); } else { ValueMatcher matcher = filter.makeMatcher(columnSelectorFactory); matchers.add(matcher); } } if (bitmaps.size() > 0) { ImmutableBitmap combinedBitmap = selector.getBitmapFactory().union(bitmaps); ValueMatcher offsetMatcher = rowOffsetMatcherFactory.makeRowOffsetMatcher(combinedBitmap); matchers.add(0, offsetMatcher); } return makeMatcher(matchers.toArray(AndFilter.EMPTY_VALUE_MATCHER_ARRAY)); }
@Benchmark @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) public void matchBoundPrefix(Blackhole blackhole) { final ImmutableBitmap bitmapIndex = BOUND_PREFIX.getBitmapIndex(selector); blackhole.consume(bitmapIndex); }
@Override public ValueMatcher makeMatcher(ColumnSelectorFactory factory) { return theFilter.makeMatcher(factory); }