iverase commented on a change in pull request #658: URL: https://github.com/apache/lucene/pull/658#discussion_r803536317
########## File path: lucene/core/src/java/org/apache/lucene/search/PointRangeQuery.java ########## @@ -369,6 +378,100 @@ public Scorer scorer(LeafReaderContext context) throws IOException { return scorerSupplier.get(Long.MAX_VALUE); } + @Override + public int count(LeafReaderContext context) throws IOException { + LeafReader reader = context.reader(); + + PointValues values = reader.getPointValues(field); + if (checkValidPointValues(values) == false) { + return 0; + } + + if (reader.hasDeletions() == false + && numDims == 1 + && values.getDocCount() == values.size()) { + // if all documents have at-most one point + return (int) pointCount(values.getPointTree(), this::relate, this::matches); + } + return super.count(context); + } + + /** + * Finds the number of points matching the provided range conditions. Using this method is + * faster than calling {@link PointValues#intersect(IntersectVisitor)} to get the count of + * intersecting points. This method does not enforce live documents, therefore it should only + * be used when there are no deleted documents. + * + * @param pointTree start node of the count operation + * @param nodeComparator comparator to be used for checking whether the internal node is + * inside the range + * @param leafComparator comparator to be used for checking whether the leaf node is inside + * the range + * @return count of points that match the range + */ + private long pointCount( + PointValues.PointTree pointTree, + BiFunction<byte[], byte[], Relation> nodeComparator, + Predicate<byte[]> leafComparator) + throws IOException { + final int[] matchingLeafNodeCount = {0}; + // create a custom IntersectVisitor that records the number of leafNodes that matched + final IntersectVisitor visitor = + new IntersectVisitor() { + @Override + public void visit(int docID) { + // this branch should be unreachable + throw new UnsupportedOperationException( + "This IntersectVisitor does not perform any actions on a " + + "docID=" + + docID + + " node being visited"); + } + + @Override + public void visit(int docID, byte[] packedValue) { + if (leafComparator.test(packedValue)) { + matchingLeafNodeCount[0]++; + } + } + + @Override + public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) { + return nodeComparator.apply(minPackedValue, maxPackedValue); + } + }; + Relation r = Review comment: I ythink we should move the recursive part into its own method and reuse the IntersectVisitor? -- 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