From ebd120465a2481c5a8531bc01690a71e3248f392 Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Wed, 27 Apr 2016 12:01:44 -0400 Subject: [PATCH] LUCENE-7259: speed up MatchingPoints cost estimation --- .../lucene/document/LatLonPointBoxQuery.java | 5 +++++ .../document/LatLonPointDistanceQuery.java | 5 +++++ .../document/LatLonPointInPolygonQuery.java | 5 +++++ .../apache/lucene/document/MatchingPoints.java | 18 +++++++++++++++--- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointBoxQuery.java b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointBoxQuery.java index 423af05f57e..8d369461799 100644 --- a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointBoxQuery.java +++ b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointBoxQuery.java @@ -108,6 +108,11 @@ abstract class LatLonPointBoxQuery extends Query { values.intersect(field, new IntersectVisitor() { + @Override + public void grow(int count) { + result.grow(count); + } + @Override public void visit(int docID) { result.add(docID); diff --git a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointDistanceQuery.java b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointDistanceQuery.java index 0759ce1f0dc..f746deeda13 100644 --- a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointDistanceQuery.java +++ b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointDistanceQuery.java @@ -121,6 +121,11 @@ final class LatLonPointDistanceQuery extends Query { values.intersect(field, new IntersectVisitor() { + @Override + public void grow(int count) { + result.grow(count); + } + @Override public void visit(int docID) { result.add(docID); diff --git a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointInPolygonQuery.java b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointInPolygonQuery.java index 506e6b9d5a7..9c0ac772a84 100644 --- a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointInPolygonQuery.java +++ b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointInPolygonQuery.java @@ -114,6 +114,11 @@ final class LatLonPointInPolygonQuery extends Query { values.intersect(field, new IntersectVisitor() { + @Override + public void grow(int count) { + result.grow(count); + } + @Override public void visit(int docID) { result.add(docID); diff --git a/lucene/sandbox/src/java/org/apache/lucene/document/MatchingPoints.java b/lucene/sandbox/src/java/org/apache/lucene/document/MatchingPoints.java index 2b6c1242de4..4ef8ca96735 100644 --- a/lucene/sandbox/src/java/org/apache/lucene/document/MatchingPoints.java +++ b/lucene/sandbox/src/java/org/apache/lucene/document/MatchingPoints.java @@ -30,6 +30,9 @@ import org.apache.lucene.util.SparseFixedBitSet; * Add matches with ({@link #add(int)}) and call {@link #iterator()} for * an iterator over the results. *

+ * NOTE: it is required that you implement the optional {@code grow()} + * method in your IntersectVisitor, this is used for cost computation. + *

* This implementation currently optimizes bitset structure (sparse vs dense) * and {@link DocIdSetIterator#cost()} (cardinality) based on index statistics. * This API may change as point values evolves. @@ -76,15 +79,24 @@ final class MatchingPoints { */ public void add(int doc) { bits.set(doc); - counter++; + } + + /** + * Grows cardinality counter by the given amount. + */ + public void grow(int amount) { + counter += amount; } /** * Returns an iterator over the recorded matches. */ public DocIdSetIterator iterator() { - // if single-valued (docCount == numPoints), then this is exact - // otherwise its approximate based on field stats + // ensure caller implements the grow() api + assert counter > 0 || bits.cardinality() == 0 : "the IntersectVisitor is missing grow()"; + + // if single-valued (docCount == numPoints), then we know 1 point == 1 doc + // otherwise we approximate based on field stats return new BitSetIterator(bits, (long) (counter * (docCount / (double) numPoints))); } }