You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2016/04/27 18:02:39 UTC

lucene-solr:master: LUCENE-7259: speed up MatchingPoints cost estimation

Repository: lucene-solr
Updated Branches:
  refs/heads/master 3b4ec7359 -> ebd120465


LUCENE-7259: speed up MatchingPoints cost estimation


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ebd12046
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ebd12046
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ebd12046

Branch: refs/heads/master
Commit: ebd120465a2481c5a8531bc01690a71e3248f392
Parents: 3b4ec73
Author: Robert Muir <rm...@apache.org>
Authored: Wed Apr 27 12:01:44 2016 -0400
Committer: Robert Muir <rm...@apache.org>
Committed: Wed Apr 27 12:02:27 2016 -0400

----------------------------------------------------------------------
 .../lucene/document/LatLonPointBoxQuery.java      |  5 +++++
 .../lucene/document/LatLonPointDistanceQuery.java |  5 +++++
 .../document/LatLonPointInPolygonQuery.java       |  5 +++++
 .../apache/lucene/document/MatchingPoints.java    | 18 +++++++++++++++---
 4 files changed, 30 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ebd12046/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointBoxQuery.java
----------------------------------------------------------------------
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 423af05..8d36946 100644
--- a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointBoxQuery.java
+++ b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointBoxQuery.java
@@ -109,6 +109,11 @@ abstract class LatLonPointBoxQuery extends Query {
             new IntersectVisitor() {
 
               @Override
+              public void grow(int count) {
+                result.grow(count);
+              }
+
+              @Override
               public void visit(int docID) {
                 result.add(docID);
               }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ebd12046/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointDistanceQuery.java
----------------------------------------------------------------------
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 0759ce1..f746dee 100644
--- a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointDistanceQuery.java
+++ b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointDistanceQuery.java
@@ -122,6 +122,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);
                            }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ebd12046/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointInPolygonQuery.java
----------------------------------------------------------------------
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 506e6b9..9c0ac77 100644
--- a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointInPolygonQuery.java
+++ b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPointInPolygonQuery.java
@@ -115,6 +115,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);
                            }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ebd12046/lucene/sandbox/src/java/org/apache/lucene/document/MatchingPoints.java
----------------------------------------------------------------------
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 2b6c124..4ef8ca9 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. 
  * <p>
+ * <b>NOTE:</b> it is required that you implement the optional {@code grow()}
+ * method in your IntersectVisitor, this is used for cost computation.
+ * <p>
  * 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)));
   }
 }