This is an automated email from the ASF dual-hosted git repository. jackie pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push: new ead75229af Separate BitmapBasedFilterOperator into two filter operators. (#11137) ead75229af is described below commit ead75229af648e260c68ad991fb80a6f81af5712 Author: Shen Yu <s...@startree.ai> AuthorDate: Thu Jul 20 10:48:29 2023 -0700 Separate BitmapBasedFilterOperator into two filter operators. (#11137) --- .../operator/filter/BitmapBasedFilterOperator.java | 122 ++------------------- .../core/operator/filter/FilterOperatorUtils.java | 4 +- ...rator.java => InvertedIndexFilterOperator.java} | 101 ++++++----------- 3 files changed, 45 insertions(+), 182 deletions(-) diff --git a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapBasedFilterOperator.java b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapBasedFilterOperator.java index bd8fb41ce1..91cb33879b 100644 --- a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapBasedFilterOperator.java +++ b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapBasedFilterOperator.java @@ -20,43 +20,20 @@ package org.apache.pinot.core.operator.filter; import java.util.Collections; import java.util.List; -import org.apache.pinot.common.request.context.predicate.Predicate; import org.apache.pinot.core.common.Operator; -import org.apache.pinot.core.operator.blocks.EmptyFilterBlock; import org.apache.pinot.core.operator.blocks.FilterBlock; import org.apache.pinot.core.operator.docidsets.BitmapDocIdSet; -import org.apache.pinot.core.operator.filter.predicate.PredicateEvaluator; -import org.apache.pinot.segment.spi.datasource.DataSource; -import org.apache.pinot.segment.spi.index.reader.InvertedIndexReader; -import org.apache.pinot.spi.trace.FilterType; -import org.apache.pinot.spi.trace.InvocationRecording; -import org.apache.pinot.spi.trace.Tracing; import org.roaringbitmap.buffer.ImmutableRoaringBitmap; -import org.roaringbitmap.buffer.MutableRoaringBitmap; -@SuppressWarnings("rawtypes") public class BitmapBasedFilterOperator extends BaseFilterOperator { - private static final String EXPLAIN_NAME = "FILTER_INVERTED_INDEX"; + private static final String EXPLAIN_NAME = "FILTER_BITMAP"; - private final PredicateEvaluator _predicateEvaluator; - private final InvertedIndexReader<ImmutableRoaringBitmap> _invertedIndexReader; private final ImmutableRoaringBitmap _docIds; private final boolean _exclusive; private final int _numDocs; - @SuppressWarnings("unchecked") - BitmapBasedFilterOperator(PredicateEvaluator predicateEvaluator, DataSource dataSource, int numDocs) { - _predicateEvaluator = predicateEvaluator; - _invertedIndexReader = (InvertedIndexReader<ImmutableRoaringBitmap>) dataSource.getInvertedIndex(); - _docIds = null; - _exclusive = predicateEvaluator.isExclusive(); - _numDocs = numDocs; - } - public BitmapBasedFilterOperator(ImmutableRoaringBitmap docIds, boolean exclusive, int numDocs) { - _predicateEvaluator = null; - _invertedIndexReader = null; _docIds = docIds; _exclusive = exclusive; _numDocs = numDocs; @@ -64,48 +41,10 @@ public class BitmapBasedFilterOperator extends BaseFilterOperator { @Override protected FilterBlock getNextBlock() { - if (_docIds != null) { - if (_exclusive) { - return new FilterBlock(new BitmapDocIdSet(ImmutableRoaringBitmap.flip(_docIds, 0L, _numDocs), _numDocs)); - } else { - return new FilterBlock(new BitmapDocIdSet(_docIds, _numDocs)); - } - } - - int[] dictIds = _exclusive ? _predicateEvaluator.getNonMatchingDictIds() : _predicateEvaluator.getMatchingDictIds(); - int numDictIds = dictIds.length; - if (numDictIds == 0) { - return EmptyFilterBlock.getInstance(); - } - if (numDictIds == 1) { - ImmutableRoaringBitmap docIds = _invertedIndexReader.getDocIds(dictIds[0]); - if (_exclusive) { - if (docIds instanceof MutableRoaringBitmap) { - MutableRoaringBitmap mutableRoaringBitmap = (MutableRoaringBitmap) docIds; - mutableRoaringBitmap.flip(0L, _numDocs); - return new FilterBlock(new BitmapDocIdSet(mutableRoaringBitmap, _numDocs)); - } else { - return new FilterBlock(new BitmapDocIdSet(ImmutableRoaringBitmap.flip(docIds, 0L, _numDocs), _numDocs)); - } - } else { - return new FilterBlock(new BitmapDocIdSet(docIds, _numDocs)); - } + if (_exclusive) { + return new FilterBlock(new BitmapDocIdSet(ImmutableRoaringBitmap.flip(_docIds, 0L, _numDocs), _numDocs)); } else { - ImmutableRoaringBitmap[] bitmaps = new ImmutableRoaringBitmap[numDictIds]; - for (int i = 0; i < numDictIds; i++) { - bitmaps[i] = _invertedIndexReader.getDocIds(dictIds[i]); - } - MutableRoaringBitmap docIds = ImmutableRoaringBitmap.or(bitmaps); - if (_exclusive) { - docIds.flip(0L, _numDocs); - } - InvocationRecording recording = Tracing.activeRecording(); - if (recording.isEnabled()) { - recording.setColumnName(_predicateEvaluator.getPredicate().getLhs().getIdentifier()); - recording.setNumDocsMatchingAfterFilter(docIds.getCardinality()); - recording.setFilter(FilterType.INDEX, String.valueOf(_predicateEvaluator.getPredicateType())); - } - return new FilterBlock(new BitmapDocIdSet(docIds, _numDocs)); + return new FilterBlock(new BitmapDocIdSet(_docIds, _numDocs)); } } @@ -116,36 +55,7 @@ public class BitmapBasedFilterOperator extends BaseFilterOperator { @Override public int getNumMatchingDocs() { - int count = 0; - if (_docIds == null) { - int[] dictIds = _exclusive - ? _predicateEvaluator.getNonMatchingDictIds() - : _predicateEvaluator.getMatchingDictIds(); - switch (dictIds.length) { - case 0: - break; - case 1: { - count = _invertedIndexReader.getDocIds(dictIds[0]).getCardinality(); - break; - } - case 2: { - count = ImmutableRoaringBitmap.orCardinality(_invertedIndexReader.getDocIds(dictIds[0]), - _invertedIndexReader.getDocIds(dictIds[1])); - break; - } - default: { - // this could be optimised if the bitmaps are known to be disjoint (as in a single value bitmap index) - MutableRoaringBitmap bitmap = new MutableRoaringBitmap(); - for (int dictId : dictIds) { - bitmap.or(_invertedIndexReader.getDocIds(dictId)); - } - count = bitmap.getCardinality(); - break; - } - } - } else { - count = _docIds.getCardinality(); - } + int count = _docIds.getCardinality(); return _exclusive ? _numDocs - count : count; } @@ -156,34 +66,18 @@ public class BitmapBasedFilterOperator extends BaseFilterOperator { @Override public BitmapCollection getBitmaps() { - if (_docIds == null) { - int[] dictIds = _exclusive - ? _predicateEvaluator.getNonMatchingDictIds() - : _predicateEvaluator.getMatchingDictIds(); - ImmutableRoaringBitmap[] bitmaps = new ImmutableRoaringBitmap[dictIds.length]; - for (int i = 0; i < dictIds.length; i++) { - bitmaps[i] = _invertedIndexReader.getDocIds(dictIds[i]); - } - return new BitmapCollection(_numDocs, _exclusive, bitmaps); - } else { - return new BitmapCollection(_numDocs, _exclusive, _docIds); - } + return new BitmapCollection(_numDocs, _exclusive, _docIds); } @Override + @SuppressWarnings("rawtypes") public List<Operator> getChildOperators() { return Collections.emptyList(); } @Override public String toExplainString() { - StringBuilder stringBuilder = new StringBuilder(EXPLAIN_NAME).append("(indexLookUp:inverted_index"); - Predicate predicate = _predicateEvaluator != null ? _predicateEvaluator.getPredicate() : null; - if (predicate != null) { - stringBuilder.append(",operator:").append(predicate.getType()); - stringBuilder.append(",predicate:").append(predicate.toString()); - } - return stringBuilder.append(')').toString(); + return EXPLAIN_NAME; } } diff --git a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java index f81cc9bc80..7e00400eee 100644 --- a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java +++ b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java @@ -96,7 +96,7 @@ public class FilterOperatorUtils { return new SortedIndexBasedFilterOperator(predicateEvaluator, dataSource, numDocs); } if (dataSource.getFSTIndex() != null && dataSource.getInvertedIndex() != null) { - return new BitmapBasedFilterOperator(predicateEvaluator, dataSource, numDocs); + return new InvertedIndexFilterOperator(predicateEvaluator, dataSource, numDocs); } return new ScanBasedFilterOperator(predicateEvaluator, dataSource, numDocs, nullHandlingEnabled); } else { @@ -104,7 +104,7 @@ public class FilterOperatorUtils { return new SortedIndexBasedFilterOperator(predicateEvaluator, dataSource, numDocs); } if (dataSource.getInvertedIndex() != null) { - return new BitmapBasedFilterOperator(predicateEvaluator, dataSource, numDocs); + return new InvertedIndexFilterOperator(predicateEvaluator, dataSource, numDocs); } if (RangeIndexBasedFilterOperator.canEvaluate(predicateEvaluator, dataSource)) { return new RangeIndexBasedFilterOperator(predicateEvaluator, dataSource, numDocs); diff --git a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapBasedFilterOperator.java b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/InvertedIndexFilterOperator.java similarity index 62% copy from pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapBasedFilterOperator.java copy to pinot-core/src/main/java/org/apache/pinot/core/operator/filter/InvertedIndexFilterOperator.java index bd8fb41ce1..8f617417a3 100644 --- a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapBasedFilterOperator.java +++ b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/InvertedIndexFilterOperator.java @@ -35,43 +35,26 @@ import org.roaringbitmap.buffer.ImmutableRoaringBitmap; import org.roaringbitmap.buffer.MutableRoaringBitmap; -@SuppressWarnings("rawtypes") -public class BitmapBasedFilterOperator extends BaseFilterOperator { +public class InvertedIndexFilterOperator extends BaseFilterOperator { private static final String EXPLAIN_NAME = "FILTER_INVERTED_INDEX"; private final PredicateEvaluator _predicateEvaluator; private final InvertedIndexReader<ImmutableRoaringBitmap> _invertedIndexReader; - private final ImmutableRoaringBitmap _docIds; private final boolean _exclusive; private final int _numDocs; - @SuppressWarnings("unchecked") - BitmapBasedFilterOperator(PredicateEvaluator predicateEvaluator, DataSource dataSource, int numDocs) { + InvertedIndexFilterOperator(PredicateEvaluator predicateEvaluator, DataSource dataSource, int numDocs) { _predicateEvaluator = predicateEvaluator; - _invertedIndexReader = (InvertedIndexReader<ImmutableRoaringBitmap>) dataSource.getInvertedIndex(); - _docIds = null; + @SuppressWarnings("unchecked") + InvertedIndexReader<ImmutableRoaringBitmap> invertedIndexReader = + (InvertedIndexReader<ImmutableRoaringBitmap>) dataSource.getInvertedIndex(); + _invertedIndexReader = invertedIndexReader; _exclusive = predicateEvaluator.isExclusive(); _numDocs = numDocs; } - public BitmapBasedFilterOperator(ImmutableRoaringBitmap docIds, boolean exclusive, int numDocs) { - _predicateEvaluator = null; - _invertedIndexReader = null; - _docIds = docIds; - _exclusive = exclusive; - _numDocs = numDocs; - } - @Override protected FilterBlock getNextBlock() { - if (_docIds != null) { - if (_exclusive) { - return new FilterBlock(new BitmapDocIdSet(ImmutableRoaringBitmap.flip(_docIds, 0L, _numDocs), _numDocs)); - } else { - return new FilterBlock(new BitmapDocIdSet(_docIds, _numDocs)); - } - } - int[] dictIds = _exclusive ? _predicateEvaluator.getNonMatchingDictIds() : _predicateEvaluator.getMatchingDictIds(); int numDictIds = dictIds.length; if (numDictIds == 0) { @@ -117,34 +100,28 @@ public class BitmapBasedFilterOperator extends BaseFilterOperator { @Override public int getNumMatchingDocs() { int count = 0; - if (_docIds == null) { - int[] dictIds = _exclusive - ? _predicateEvaluator.getNonMatchingDictIds() - : _predicateEvaluator.getMatchingDictIds(); - switch (dictIds.length) { - case 0: - break; - case 1: { - count = _invertedIndexReader.getDocIds(dictIds[0]).getCardinality(); - break; - } - case 2: { - count = ImmutableRoaringBitmap.orCardinality(_invertedIndexReader.getDocIds(dictIds[0]), - _invertedIndexReader.getDocIds(dictIds[1])); - break; - } - default: { - // this could be optimised if the bitmaps are known to be disjoint (as in a single value bitmap index) - MutableRoaringBitmap bitmap = new MutableRoaringBitmap(); - for (int dictId : dictIds) { - bitmap.or(_invertedIndexReader.getDocIds(dictId)); - } - count = bitmap.getCardinality(); - break; + int[] dictIds = _exclusive ? _predicateEvaluator.getNonMatchingDictIds() : _predicateEvaluator.getMatchingDictIds(); + switch (dictIds.length) { + case 0: + break; + case 1: { + count = _invertedIndexReader.getDocIds(dictIds[0]).getCardinality(); + break; + } + case 2: { + count = ImmutableRoaringBitmap.orCardinality(_invertedIndexReader.getDocIds(dictIds[0]), + _invertedIndexReader.getDocIds(dictIds[1])); + break; + } + default: { + // this could be optimised if the bitmaps are known to be disjoint (as in a single value bitmap index) + MutableRoaringBitmap bitmap = new MutableRoaringBitmap(); + for (int dictId : dictIds) { + bitmap.or(_invertedIndexReader.getDocIds(dictId)); } + count = bitmap.getCardinality(); + break; } - } else { - count = _docIds.getCardinality(); } return _exclusive ? _numDocs - count : count; } @@ -156,22 +133,16 @@ public class BitmapBasedFilterOperator extends BaseFilterOperator { @Override public BitmapCollection getBitmaps() { - if (_docIds == null) { - int[] dictIds = _exclusive - ? _predicateEvaluator.getNonMatchingDictIds() - : _predicateEvaluator.getMatchingDictIds(); - ImmutableRoaringBitmap[] bitmaps = new ImmutableRoaringBitmap[dictIds.length]; - for (int i = 0; i < dictIds.length; i++) { - bitmaps[i] = _invertedIndexReader.getDocIds(dictIds[i]); - } - return new BitmapCollection(_numDocs, _exclusive, bitmaps); - } else { - return new BitmapCollection(_numDocs, _exclusive, _docIds); + int[] dictIds = _exclusive ? _predicateEvaluator.getNonMatchingDictIds() : _predicateEvaluator.getMatchingDictIds(); + ImmutableRoaringBitmap[] bitmaps = new ImmutableRoaringBitmap[dictIds.length]; + for (int i = 0; i < dictIds.length; i++) { + bitmaps[i] = _invertedIndexReader.getDocIds(dictIds[i]); } + return new BitmapCollection(_numDocs, _exclusive, bitmaps); } - @Override + @SuppressWarnings("rawtypes") public List<Operator> getChildOperators() { return Collections.emptyList(); } @@ -179,11 +150,9 @@ public class BitmapBasedFilterOperator extends BaseFilterOperator { @Override public String toExplainString() { StringBuilder stringBuilder = new StringBuilder(EXPLAIN_NAME).append("(indexLookUp:inverted_index"); - Predicate predicate = _predicateEvaluator != null ? _predicateEvaluator.getPredicate() : null; - if (predicate != null) { - stringBuilder.append(",operator:").append(predicate.getType()); - stringBuilder.append(",predicate:").append(predicate.toString()); - } + Predicate predicate = _predicateEvaluator.getPredicate(); + stringBuilder.append(",operator:").append(predicate.getType()); + stringBuilder.append(",predicate:").append(predicate.toString()); return stringBuilder.append(')').toString(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org