@Override public boolean supportsSelectivityEstimation(ColumnSelector columnSelector, BitmapIndexSelector indexSelector) { return Filters.supportsSelectivityEstimation(this, boundDimFilter.getDimension(), columnSelector, indexSelector); }
@Override public boolean supportsBitmapIndex(BitmapIndexSelector selector) { return selector.getBitmapIndex(boundDimFilter.getDimension()) != null; }
@Override public ValueMatcher makeMatcher(ColumnSelectorFactory factory) { return Filters.makeValueMatcher(factory, boundDimFilter.getDimension(), getPredicateFactory()); }
public static BoundRefKey from(BoundDimFilter filter) { return new BoundRefKey( filter.getDimension(), filter.getExtractionFn(), filter.getOrdering() ); }
@Override public int hashCode() { int result = getDimension().hashCode(); result = 31 * result + (getUpper() != null ? getUpper().hashCode() : 0); result = 31 * result + (getLower() != null ? getLower().hashCode() : 0); result = 31 * result + (isLowerStrict() ? 1 : 0); result = 31 * result + (isUpperStrict() ? 1 : 0); result = 31 * result + (getExtractionFn() != null ? getExtractionFn().hashCode() : 0); result = 31 * result + getOrdering().hashCode(); return result; }
@Override public byte[] getCacheKey() byte[] dimensionBytes = StringUtils.toUtf8(this.getDimension()); byte[] lowerBytes = this.getLower() == null ? new byte[0] : StringUtils.toUtf8(this.getLower()); byte[] upperBytes = this.getUpper() == null ? new byte[0] : StringUtils.toUtf8(this.getUpper());
@Override public double estimateSelectivity(BitmapIndexSelector indexSelector) { if (supportShortCircuit()) { final BitmapIndex bitmapIndex = indexSelector.getBitmapIndex(boundDimFilter.getDimension()); if (bitmapIndex == null || bitmapIndex.getCardinality() == 0) { return doesMatch(null) ? 1. : 0.; } return Filters.estimateSelectivity( bitmapIndex, getBitmapIndexList(boundDimFilter, bitmapIndex), indexSelector.getNumRows() ); } else { return Filters.estimateSelectivity( boundDimFilter.getDimension(), indexSelector, getPredicateFactory().makeStringPredicate() ); } }
return false; if (!getDimension().equals(that.getDimension())) { return false;
@Override public DimFilter process(DimFilter filter) { if (filter instanceof BoundDimFilter) { final BoundDimFilter bound = (BoundDimFilter) filter; final StringComparator naturalStringComparator = sourceRowSignature.naturalStringComparator( SimpleExtraction.of(bound.getDimension(), bound.getExtractionFn()) ); if (bound.hasUpperBound() && bound.hasLowerBound() && bound.getUpper().equals(bound.getLower()) && !bound.isUpperStrict() && !bound.isLowerStrict() && bound.getOrdering().equals(naturalStringComparator)) { return new SelectorDimFilter( bound.getDimension(), bound.getUpper(), bound.getExtractionFn() ); } else { return filter; } } else { return filter; } } }
@Override public <T> T getBitmapResult(BitmapIndexSelector selector, BitmapResultFactory<T> bitmapResultFactory) { if (supportShortCircuit()) { final BitmapIndex bitmapIndex = selector.getBitmapIndex(boundDimFilter.getDimension()); if (bitmapIndex == null || bitmapIndex.getCardinality() == 0) { if (doesMatch(null)) { return bitmapResultFactory.wrapAllTrue(Filters.allTrue(selector)); } else { return bitmapResultFactory.wrapAllFalse(Filters.allFalse(selector)); } } return bitmapResultFactory.unionDimensionValueBitmaps(getBitmapIterator(boundDimFilter, bitmapIndex)); } else { return Filters.matchPredicate( boundDimFilter.getDimension(), selector, bitmapResultFactory, getPredicateFactory().makeStringPredicate() ); } }
} else if (bound.getUpper() != null) { return new BoundDimFilter( bound.getDimension(), bound.getUpper(), null, bound.getDimension(), null, bound.getLower(),
@Override public RangeSet<String> getDimensionRangeSet(String dimension) { if (!(Objects.equals(getDimension(), dimension) && getExtractionFn() == null && ordering.equals(StringComparators.LEXICOGRAPHIC))) { return null; } RangeSet<String> retSet = TreeRangeSet.create(); Range<String> range; if (getLower() == null) { range = isUpperStrict() ? Range.lessThan(getUpper()) : Range.atMost(getUpper()); } else if (getUpper() == null) { range = isLowerStrict() ? Range.greaterThan(getLower()) : Range.atLeast(getLower()); } else { range = Range.range(getLower(), isLowerStrict() ? BoundType.OPEN : BoundType.CLOSED, getUpper(), isUpperStrict() ? BoundType.OPEN : BoundType.CLOSED ); } retSet.add(range); return retSet; }
@Override public boolean supportsSelectivityEstimation( ColumnSelector columnSelector, BitmapIndexSelector indexSelector ) { return Filters.supportsSelectivityEstimation(this, boundDimFilter.getDimension(), columnSelector, indexSelector); }
@Override public boolean supportsBitmapIndex(BitmapIndexSelector selector) { return selector.getBitmapIndex(boundDimFilter.getDimension()) != null; }
@Override public ValueMatcher makeMatcher(ColumnSelectorFactory factory) { return Filters.makeValueMatcher(factory, boundDimFilter.getDimension(), getPredicateFactory()); }
public static BoundRefKey from(BoundDimFilter filter) { return new BoundRefKey( filter.getDimension(), filter.getExtractionFn(), filter.getOrdering() ); }
@Override public int hashCode() { int result = getDimension().hashCode(); result = 31 * result + (getUpper() != null ? getUpper().hashCode() : 0); result = 31 * result + (getLower() != null ? getLower().hashCode() : 0); result = 31 * result + (isLowerStrict() ? 1 : 0); result = 31 * result + (isUpperStrict() ? 1 : 0); result = 31 * result + (getExtractionFn() != null ? getExtractionFn().hashCode() : 0); result = 31 * result + getOrdering().hashCode(); return result; }
@Override public double estimateSelectivity(BitmapIndexSelector indexSelector) { if (supportShortCircuit()) { final BitmapIndex bitmapIndex = indexSelector.getBitmapIndex(boundDimFilter.getDimension()); if (bitmapIndex == null || bitmapIndex.getCardinality() == 0) { return doesMatch(null) ? 1. : 0.; } return Filters.estimateSelectivity( bitmapIndex, getBitmapIndexList(boundDimFilter, bitmapIndex), indexSelector.getNumRows() ); } else { return Filters.estimateSelectivity( boundDimFilter.getDimension(), indexSelector, getPredicateFactory().makeStringPredicate() ); } }
@Override public <T> T getBitmapResult(BitmapIndexSelector selector, BitmapResultFactory<T> bitmapResultFactory) { if (supportShortCircuit()) { final BitmapIndex bitmapIndex = selector.getBitmapIndex(boundDimFilter.getDimension()); if (bitmapIndex == null || bitmapIndex.getCardinality() == 0) { if (doesMatch(null)) { return bitmapResultFactory.wrapAllTrue(Filters.allTrue(selector)); } else { return bitmapResultFactory.wrapAllFalse(Filters.allFalse(selector)); } } return bitmapResultFactory.unionDimensionValueBitmaps(getBitmapIterator(boundDimFilter, bitmapIndex)); } else { return Filters.matchPredicate( boundDimFilter.getDimension(), selector, bitmapResultFactory, getPredicateFactory().makeStringPredicate() ); } }
@Override public RangeSet<String> getDimensionRangeSet(String dimension) { if (!(Objects.equals(getDimension(), dimension) && getExtractionFn() == null && ordering.equals(StringComparators.LEXICOGRAPHIC))) { return null; } RangeSet<String> retSet = TreeRangeSet.create(); Range<String> range; if (getLower() == null) { range = isUpperStrict() ? Range.lessThan(getUpper()) : Range.atMost(getUpper()); } else if (getUpper() == null) { range = isLowerStrict() ? Range.greaterThan(getLower()) : Range.atLeast(getLower()); } else { range = Range.range(getLower(), isLowerStrict() ? BoundType.OPEN : BoundType.CLOSED, getUpper(), isUpperStrict() ? BoundType.OPEN : BoundType.CLOSED ); } retSet.add(range); return retSet; }