vigyasharma commented on code in PR #12003: URL: https://github.com/apache/lucene/pull/12003#discussion_r1044845293
########## lucene/sandbox/src/java/org/apache/lucene/sandbox/search/IndexSortSortedNumericDocValuesRangeQuery.java: ########## @@ -692,7 +697,7 @@ public int advance(int target) throws IOException { @Override public long cost() { - return lastDoc - firstDoc; + return Math.min(delegate.cost(), lastDoc - firstDoc); Review Comment: For my understanding, why can't we just return `delegate.cost()` here? It seems to me that we're returning `DocIdSetIterator.range()` wherever cost would be equal to `lastDoc - firstDoc`. Is that not the case? ########## lucene/sandbox/src/java/org/apache/lucene/sandbox/search/IndexSortSortedNumericDocValuesRangeQuery.java: ########## @@ -406,117 +406,121 @@ public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) { private boolean matchNone(PointValues points, byte[] queryLowerPoint, byte[] queryUpperPoint) throws IOException { + assert points.getNumDimensions() == 1; final ByteArrayComparator comparator = ArrayUtil.getUnsignedComparator(points.getBytesPerDimension()); - for (int dim = 0; dim < points.getNumDimensions(); dim++) { - int offset = dim * points.getBytesPerDimension(); - if (comparator.compare(points.getMinPackedValue(), offset, queryUpperPoint, offset) > 0 - || comparator.compare(points.getMaxPackedValue(), offset, queryLowerPoint, offset) < 0) { - return true; - } - } - return false; + return comparator.compare(points.getMinPackedValue(), 0, queryUpperPoint, 0) > 0 + || comparator.compare(points.getMaxPackedValue(), 0, queryLowerPoint, 0) < 0; } private boolean matchAll(PointValues points, byte[] queryLowerPoint, byte[] queryUpperPoint) throws IOException { + assert points.getNumDimensions() == 1; final ByteArrayComparator comparator = ArrayUtil.getUnsignedComparator(points.getBytesPerDimension()); - for (int dim = 0; dim < points.getNumDimensions(); dim++) { - int offset = dim * points.getBytesPerDimension(); - if (comparator.compare(points.getMinPackedValue(), offset, queryLowerPoint, offset) >= 0 - && comparator.compare(points.getMaxPackedValue(), offset, queryUpperPoint, offset) <= 0) { - return true; - } - } - return false; + return comparator.compare(points.getMinPackedValue(), 0, queryLowerPoint, 0) >= 0 + && comparator.compare(points.getMaxPackedValue(), 0, queryUpperPoint, 0) <= 0; } - private BoundedDocIdSetIterator getDocIdSetIteratorOrNullFromBkd( + private DocIdSetIterator getDocIdSetIteratorOrNullFromBkd( LeafReaderContext context, DocIdSetIterator delegate) throws IOException { Sort indexSort = context.reader().getMetaData().getSort(); - if (indexSort != null - && indexSort.getSort().length > 0 - && indexSort.getSort()[0].getField().equals(field)) { - final boolean reverse = indexSort.getSort()[0].getReverse(); - PointValues points = context.reader().getPointValues(field); - if (points == null) { - return null; - } + if (indexSort == null + || indexSort.getSort().length == 0 + || indexSort.getSort()[0].getField().equals(field) == false) { + return null; + } - if (points.getNumDimensions() != 1) { - return null; - } + final boolean reverse = indexSort.getSort()[0].getReverse(); - if (points.getBytesPerDimension() != Long.BYTES - && points.getBytesPerDimension() != Integer.BYTES) { - return null; - } + PointValues points = context.reader().getPointValues(field); + if (points == null) { + return null; + } - if (points.size() != points.getDocCount()) { - return null; - } + if (points.getNumDimensions() != 1) { + return null; + } + + if (points.getBytesPerDimension() != Long.BYTES + && points.getBytesPerDimension() != Integer.BYTES) { + return null; + } - byte[] queryLowerPoint; - byte[] queryUpperPoint; - if (points.getBytesPerDimension() == Integer.BYTES) { - queryLowerPoint = IntPoint.pack((int) lowerValue).bytes; - queryUpperPoint = IntPoint.pack((int) upperValue).bytes; + if (points.size() != points.getDocCount()) { + return null; + } + + assert lowerValue <= upperValue; + byte[] queryLowerPoint; + byte[] queryUpperPoint; + if (points.getBytesPerDimension() == Integer.BYTES) { + queryLowerPoint = IntPoint.pack((int) lowerValue).bytes; + queryUpperPoint = IntPoint.pack((int) upperValue).bytes; + } else { + queryLowerPoint = LongPoint.pack(lowerValue).bytes; + queryUpperPoint = LongPoint.pack(upperValue).bytes; + } + if (matchNone(points, queryLowerPoint, queryUpperPoint)) { + return DocIdSetIterator.empty(); + } + if (matchAll(points, queryLowerPoint, queryUpperPoint)) { + int maxDoc = context.reader().maxDoc(); + if (points.getDocCount() == maxDoc) { + return delegate; Review Comment: Curious if we can return `DocIdSetIterator.all(maxDoc)` here. Does it break correctness is some way? -- 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: issues-unsubscr...@lucene.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For additional commands, e-mail: issues-h...@lucene.apache.org