walterddr commented on code in PR #8513: URL: https://github.com/apache/pinot/pull/8513#discussion_r850830798
########## pinot-core/src/main/java/org/apache/pinot/core/operator/filter/RangeIndexBasedFilterOperator.java: ########## @@ -145,10 +127,178 @@ public List<Operator> getChildOperators() { @Override public String toExplainString() { - StringBuilder stringBuilder = new StringBuilder(EXPLAIN_NAME).append("(indexLookUp:range_index"); - stringBuilder.append(",operator:").append(_rangePredicateEvaluator.getPredicateType()); - stringBuilder.append(",predicate:").append(_rangePredicateEvaluator.getPredicate().toString()); - return stringBuilder.append(')').toString(); + return EXPLAIN_NAME + "(indexLookUp:range_index" + + ",operator:" + _rangePredicateEvaluator.getPredicateType() + + ",predicate:" + _rangePredicateEvaluator.getPredicate().toString() + + ')'; + } + + interface RangeEvaluator { + static RangeEvaluator of(RangeIndexReader<ImmutableRoaringBitmap> rangeIndexReader, + PredicateEvaluator predicateEvaluator) { + if (predicateEvaluator.isDictionaryBased()) { + return new IntRangeEvaluator(rangeIndexReader, predicateEvaluator); + } else { + switch (predicateEvaluator.getDataType()) { + case INT: + return new IntRangeEvaluator(rangeIndexReader, predicateEvaluator); + case LONG: + return new LongRangeEvaluator(rangeIndexReader, predicateEvaluator); + case FLOAT: + return new FloatRangeEvaluator(rangeIndexReader, predicateEvaluator); + case DOUBLE: + return new DoubleRangeEvaluator(rangeIndexReader, predicateEvaluator); + default: + throw new IllegalStateException("String and Bytes data type not supported for Range Indexing"); + } + } + } + + ImmutableRoaringBitmap getMatchingDocIds(); + + ImmutableRoaringBitmap getPartiallyMatchingDocIds(); + + int getMatchingDocCount(); + + boolean isExact(); + } + + private static final class IntRangeEvaluator implements RangeEvaluator { + final RangeIndexReader<ImmutableRoaringBitmap> _rangeIndexReader; + final int _min; + final int _max; + + IntRangeEvaluator( + RangeIndexReader<ImmutableRoaringBitmap> rangeIndexReader, PredicateEvaluator predicateEvaluator) { + _rangeIndexReader = rangeIndexReader; + if (predicateEvaluator instanceof SortedDictionaryBasedRangePredicateEvaluator) { + // NOTE: End dictionary id is exclusive in OfflineDictionaryBasedRangePredicateEvaluator. + _min = ((SortedDictionaryBasedRangePredicateEvaluator) predicateEvaluator).getStartDictId(); + _max = ((SortedDictionaryBasedRangePredicateEvaluator) predicateEvaluator).getEndDictId() - 1; Review Comment: why is the DictionaryBasedRangePredicateEvaluator branch only exist in the IntRangeEvaluate? ########## pinot-segment-spi/src/main/java/org/apache/pinot/segment/spi/index/reader/RangeIndexReader.java: ########## @@ -26,6 +26,51 @@ * @param <T> */ public interface RangeIndexReader<T> extends Closeable { + + /** + * @return true if the results are exact and don't need refinement by scanning. + * This means {@see getPartiallyMatchingDocIds} will return null. + */ + default boolean isExact() { + return true; Review Comment: I would not make this a default. shouldn't the implementer decide? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org