You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2015/08/06 19:55:57 UTC

svn commit: r1694546 - in /lucene/dev/branches/branch_5x: ./ lucene/ lucene/queries/ lucene/queries/src/java/org/apache/lucene/queries/function/ lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/ lucene/queries/src/java/org/apache/lu...

Author: dsmiley
Date: Thu Aug  6 17:55:56 2015
New Revision: 1694546

URL: http://svn.apache.org/r1694546
Log:
LUCENE-6720: new FunctionRangeQuery wrapper around ValueSourceScorer.
And ValueSourceScorer improvements.

Added:
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionRangeQuery.java
      - copied unchanged from r1694543, lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionRangeQuery.java
    lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionRangeQuery.java
      - copied unchanged from r1694543, lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionRangeQuery.java
Removed:
    lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/util/ValueSourceFilter.java
Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/lucene/   (props changed)
    lucene/dev/branches/branch_5x/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/lucene/queries/   (props changed)
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java
    lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java
    lucene/dev/branches/branch_5x/lucene/spatial/   (props changed)
    lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java

Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Thu Aug  6 17:55:56 2015
@@ -6,11 +6,19 @@ http://s.apache.org/luceneversions
 
 ======================= Lucene 5.4.0 =======================
 
+New Features
+
+* LUCENE-6720: New FunctionRangeQuery wrapper around ValueSourceScorer
+  (returned from ValueSource/FunctionValues.getRangeScorer()). (David Smiley)
+
 Optimizations
 
 * LUCENE-6708: TopFieldCollector does not compute the score several times on the
   same document anymore. (Adrien Grand)
 
+* LUCENE-6720: ValueSourceScorer, returned from
+  FunctionValues.getRangeScorer(), now uses TwoPhaseIterator. (David Smiley)
+
 ======================= Lucene 5.3.0 =======================
 
 New Features

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java Thu Aug  6 17:55:56 2015
@@ -29,16 +29,14 @@ import org.apache.lucene.search.IndexSea
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Scorer;
 import org.apache.lucene.search.Weight;
-import org.apache.lucene.util.Bits;
 
 
 /**
  * Returns a score for each document based on a ValueSource,
  * often some function of the value of a field.
  *
- * <b>Note: This API is experimental and may change in non backward-compatible ways in the future</b>
- *
- *
+ * @see ValueSourceScorer
+ * @lucene.experimental
  */
 public class FunctionQuery extends Query {
   final ValueSource func;

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java Thu Aug  6 17:55:56 2015
@@ -17,8 +17,9 @@ package org.apache.lucene.queries.functi
  * limitations under the License.
  */
 
-import org.apache.lucene.search.*;
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.search.Explanation;
+import org.apache.lucene.search.Scorer;
 import org.apache.lucene.util.BytesRefBuilder;
 import org.apache.lucene.util.mutable.MutableValue;
 import org.apache.lucene.util.mutable.MutableValueFloat;
@@ -136,10 +137,23 @@ public abstract class FunctionValues {
     return Explanation.match(floatVal(doc), toString(doc));
   }
 
+  /**
+   * Yields a {@link Scorer} that matches all documents,
+   * and that which produces scores equal to {@link #floatVal(int)}.
+   */
   public ValueSourceScorer getScorer(IndexReader reader) {
-    return new ValueSourceScorer(reader, this);
+    return new ValueSourceScorer(reader, this) {
+      @Override
+      public boolean matches(int doc) {
+        return true;
+      }
+    };
   }
 
+  /**
+   * Yields a {@link Scorer} that matches documents with values between the specified range,
+   * and that which produces scores equal to {@link #floatVal(int)}.
+   */
   // A RangeValueSource can't easily be a ValueSource that takes another ValueSource
   // because it needs different behavior depending on the type of fields.  There is also
   // a setup cost - parsing and normalizing params, and doing a binary search on the StringIndex.
@@ -165,7 +179,7 @@ public abstract class FunctionValues {
     if (includeLower && includeUpper) {
       return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           float docVal = floatVal(doc);
           return docVal >= l && docVal <= u;
         }
@@ -174,7 +188,7 @@ public abstract class FunctionValues {
     else if (includeLower && !includeUpper) {
        return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           float docVal = floatVal(doc);
           return docVal >= l && docVal < u;
         }
@@ -183,7 +197,7 @@ public abstract class FunctionValues {
     else if (!includeLower && includeUpper) {
        return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           float docVal = floatVal(doc);
           return docVal > l && docVal <= u;
         }
@@ -192,7 +206,7 @@ public abstract class FunctionValues {
     else {
        return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           float docVal = floatVal(doc);
           return docVal > l && docVal < u;
         }

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java Thu Aug  6 17:55:56 2015
@@ -20,71 +20,74 @@ package org.apache.lucene.queries.functi
 import java.io.IOException;
 
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.MultiFields;
+import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Scorer;
-import org.apache.lucene.util.Bits;
+import org.apache.lucene.search.TwoPhaseIterator;
 
 /**
  * {@link Scorer} which returns the result of {@link FunctionValues#floatVal(int)} as
- * the score for a document.
+ * the score for a document, and which filters out documents that don't match {@link #matches(int)}.
+ * This Scorer has a {@link TwoPhaseIterator}.  This is similar to {@link FunctionQuery},
+ * but this one has no {@link org.apache.lucene.search.Weight} normalization factors/multipliers
+ * and that one doesn't filter either.
+ * <p>
+ * Note: If the scores are needed, then the underlying value will probably be
+ * fetched/computed twice -- once to filter and next to return the score.  If that's non-trivial then
+ * consider wrapping it in an implementation that will cache the current value.
+ * </p>
+ *
+ * @see FunctionQuery
+ * @lucene.experimental
  */
-public class ValueSourceScorer extends Scorer {
-  protected final IndexReader reader;
-  private int doc = -1;
-  protected final int maxDoc;
+public abstract class ValueSourceScorer extends Scorer {
   protected final FunctionValues values;
-  protected boolean checkDeletes;
-  private final Bits liveDocs;
+  private final TwoPhaseIterator twoPhaseIterator;
+  private final DocIdSetIterator disi;
 
+  //TODO use LeafReaderContext not IndexReader?
   protected ValueSourceScorer(IndexReader reader, FunctionValues values) {
-    super(null);
-    this.reader = reader;
-    this.maxDoc = reader.maxDoc();
+    super(null);//no weight
     this.values = values;
-    setCheckDeletes(true);
-    this.liveDocs = MultiFields.getLiveDocs(reader);
+    this.twoPhaseIterator = new TwoPhaseIterator(DocIdSetIterator.all(reader.maxDoc())) { // no approximation!
+      @Override
+      public boolean matches() throws IOException {
+        return ValueSourceScorer.this.matches(docID());
+      }
+    };
+    this.disi = TwoPhaseIterator.asDocIdSetIterator(twoPhaseIterator);
   }
 
-  public IndexReader getReader() {
-    return reader;
-  }
-
-  public void setCheckDeletes(boolean checkDeletes) {
-    this.checkDeletes = checkDeletes && reader.hasDeletions();
-  }
+  /** Override to decide if this document matches. It's called by {@link TwoPhaseIterator#matches()}. */
+  public abstract boolean matches(int doc);
 
-  public boolean matches(int doc) {
-    return (!checkDeletes || liveDocs.get(doc)) && matchesValue(doc);
-  }
-
-  public boolean matchesValue(int doc) {
-    return true;
+  @Override
+  public TwoPhaseIterator asTwoPhaseIterator() {
+    return twoPhaseIterator;
   }
 
   @Override
   public int docID() {
-    return doc;
+    return disi.docID();
   }
 
   @Override
   public int nextDoc() throws IOException {
-    for (; ;) {
-      doc++;
-      if (doc >= maxDoc) return doc = NO_MORE_DOCS;
-      if (matches(doc)) return doc;
-    }
+    return disi.nextDoc();
   }
 
   @Override
   public int advance(int target) throws IOException {
-    // also works fine when target==NO_MORE_DOCS
-    doc = target - 1;
-    return nextDoc();
+    return disi.advance(target);
   }
 
   @Override
   public float score() throws IOException {
-    return values.floatVal(doc);
+    // (same as FunctionQuery, but no qWeight)  TODO consider adding configurable qWeight
+    float score = values.floatVal(disi.docID());
+    // Current Lucene priority queues can't handle NaN and -Infinity, so
+    // map to -Float.MAX_VALUE. This conditional handles both -infinity
+    // and NaN since comparisons with NaN are always false.
+    return score > Float.NEGATIVE_INFINITY ? score : -Float.MAX_VALUE;
   }
 
   @Override
@@ -94,6 +97,6 @@ public class ValueSourceScorer extends S
 
   @Override
   public long cost() {
-    return maxDoc;
+    return disi.cost();
   }
 }

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java Thu Aug  6 17:55:56 2015
@@ -19,9 +19,9 @@ package org.apache.lucene.queries.functi
 
 import java.io.IOException;
 
-import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.DocValues;
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.SortedDocValues;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
@@ -124,7 +124,7 @@ public abstract class DocTermsIndexDocVa
 
     return new ValueSourceScorer(reader, this) {
       @Override
-      public boolean matchesValue(int doc) {
+      public boolean matches(int doc) {
         int ord = termsIndex.getOrd(doc);
         return ord >= ll && ord <= uu;
       }

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java Thu Aug  6 17:55:56 2015
@@ -106,7 +106,7 @@ public abstract class DoubleDocValues ex
     if (includeLower && includeUpper) {
       return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           double docVal = doubleVal(doc);
           return docVal >= l && docVal <= u;
         }
@@ -115,7 +115,7 @@ public abstract class DoubleDocValues ex
     else if (includeLower && !includeUpper) {
       return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           double docVal = doubleVal(doc);
           return docVal >= l && docVal < u;
         }
@@ -124,7 +124,7 @@ public abstract class DoubleDocValues ex
     else if (!includeLower && includeUpper) {
       return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           double docVal = doubleVal(doc);
           return docVal > l && docVal <= u;
         }
@@ -133,7 +133,7 @@ public abstract class DoubleDocValues ex
     else {
       return new ValueSourceScorer(reader, this) {
         @Override
-        public boolean matchesValue(int doc) {
+        public boolean matches(int doc) {
           double docVal = doubleVal(doc);
           return docVal > l && docVal < u;
         }

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java Thu Aug  6 17:55:56 2015
@@ -103,7 +103,7 @@ public abstract class IntDocValues exten
 
     return new ValueSourceScorer(reader, this) {
       @Override
-      public boolean matchesValue(int doc) {
+      public boolean matches(int doc) {
         int val = intVal(doc);
         // only check for deleted if it's the default value
         // if (val==0 && reader.isDeleted(doc)) return false;

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java Thu Aug  6 17:55:56 2015
@@ -112,7 +112,7 @@ public abstract class LongDocValues exte
 
     return new ValueSourceScorer(reader, this) {
       @Override
-      public boolean matchesValue(int doc) {
+      public boolean matches(int doc) {
         long val = longVal(doc);
         // only check for deleted if it's the default value
         // if (val==0 && reader.isDeleted(doc)) return false;

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java Thu Aug  6 17:55:56 2015
@@ -20,9 +20,9 @@ package org.apache.lucene.queries.functi
 import java.io.IOException;
 import java.util.Map;
 
-import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.DocValues;
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.NumericDocValues;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSourceScorer;
@@ -143,7 +143,7 @@ public class EnumFieldSource extends Fie
 
         return new ValueSourceScorer(reader, this) {
           @Override
-          public boolean matchesValue(int doc) {
+          public boolean matches(int doc) {
             int val = intVal(doc);
             // only check for deleted if it's the default value
             // if (val==0 && reader.isDeleted(doc)) return false;

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java Thu Aug  6 17:55:56 2015
@@ -20,6 +20,7 @@ package org.apache.lucene.queries.functi
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
 import org.apache.lucene.search.QueryUtils;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TopDocs;
@@ -59,7 +60,7 @@ public class TestFieldScoreQuery extends
 
   // Test that FieldScoreQuery returns docs in expected order.
   private void doTestRank (ValueSource valueSource) throws Exception {
-    FunctionQuery functionQuery = new FunctionQuery(valueSource);
+    Query functionQuery = getFunctionQuery(valueSource);
     IndexReader r = DirectoryReader.open(dir);
     IndexSearcher s = newSearcher(r);
     log("test: "+ functionQuery);
@@ -92,7 +93,7 @@ public class TestFieldScoreQuery extends
 
   // Test that FieldScoreQuery returns docs with expected score.
   private void doTestExactScore (ValueSource valueSource) throws Exception {
-    FunctionQuery functionQuery = new FunctionQuery(valueSource);
+    Query functionQuery = getFunctionQuery(valueSource);
     IndexReader r = DirectoryReader.open(dir);
     IndexSearcher s = newSearcher(r);
     TopDocs td = s.search(functionQuery,1000);
@@ -108,4 +109,14 @@ public class TestFieldScoreQuery extends
     r.close();
   }
 
+  protected Query getFunctionQuery(ValueSource valueSource) {
+    if (random().nextBoolean()) {
+      return new FunctionQuery(valueSource);
+    } else {
+      Integer lower = (random().nextBoolean() ? null : 1);//1 is the lowest value
+      Integer upper = (random().nextBoolean() ? null : N_DOCS); // N_DOCS is the highest value
+      return new FunctionRangeQuery(valueSource, lower, upper, true, true);//will match all docs based on the indexed data
+    }
+  }
+
 }

Modified: lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java (original)
+++ lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java Thu Aug  6 17:55:56 2015
@@ -25,7 +25,7 @@ import com.spatial4j.core.shape.Shape;
 import org.apache.lucene.document.DoubleField;
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.FieldType;
-import org.apache.lucene.queries.function.FunctionQuery;
+import org.apache.lucene.queries.function.FunctionRangeQuery;
 import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
@@ -40,8 +40,6 @@ import org.apache.lucene.spatial.Spatial
 import org.apache.lucene.spatial.query.SpatialArgs;
 import org.apache.lucene.spatial.query.SpatialOperation;
 import org.apache.lucene.spatial.query.UnsupportedSpatialOperation;
-import org.apache.lucene.spatial.util.CachingDoubleValueSource;
-import org.apache.lucene.spatial.util.ValueSourceFilter;
 
 /**
  * Simple {@link SpatialStrategy} which represents Points in two numeric {@link
@@ -152,80 +150,19 @@ public class PointVectorStrategy extends
     } else if (shape instanceof Circle) {
       Circle circle = (Circle)shape;
       Rectangle bbox = circle.getBoundingBox();
-      ValueSourceFilter vsf = new ValueSourceFilter(
-          new QueryWrapperFilter(makeWithin(bbox)),
-          makeDistanceValueSource(circle.getCenter()),
-          0,
-          circle.getRadius() );
-      return new ConstantScoreQuery(vsf);
+      Query approxQuery = makeWithin(bbox);
+      BooleanQuery.Builder bqBuilder = new BooleanQuery.Builder();
+      FunctionRangeQuery vsRangeQuery =
+          new FunctionRangeQuery(makeDistanceValueSource(circle.getCenter()), 0.0, circle.getRadius(), true, true);
+      bqBuilder.add(approxQuery, BooleanClause.Occur.FILTER);//should have lowest "cost" value; will drive iteration
+      bqBuilder.add(vsRangeQuery, BooleanClause.Occur.FILTER);
+      return new ConstantScoreQuery(bqBuilder.build());
     } else {
       throw new UnsupportedOperationException("Only Rectangles and Circles are currently supported, " +
           "found [" + shape.getClass() + "]");//TODO
     }
   }
 
-  //TODO this is basically old code that hasn't been verified well and should probably be removed
-  public Query makeQueryDistanceScore(SpatialArgs args) {
-    // For starters, just limit the bbox
-    Shape shape = args.getShape();
-    if (!(shape instanceof Rectangle || shape instanceof Circle)) {
-      throw new UnsupportedOperationException("Only Rectangles and Circles are currently supported, " +
-          "found [" + shape.getClass() + "]");//TODO
-    }
-
-    Rectangle bbox = shape.getBoundingBox();
-
-    if (bbox.getCrossesDateLine()) {
-      throw new UnsupportedOperationException( "Crossing dateline not yet supported" );
-    }
-
-    ValueSource valueSource = null;
-
-    Query spatial = null;
-    SpatialOperation op = args.getOperation();
-
-    if( SpatialOperation.is( op,
-        SpatialOperation.BBoxWithin,
-        SpatialOperation.BBoxIntersects ) ) {
-        spatial = makeWithin(bbox);
-    }
-    else if( SpatialOperation.is( op,
-      SpatialOperation.Intersects,
-      SpatialOperation.IsWithin ) ) {
-      spatial = makeWithin(bbox);
-      if( args.getShape() instanceof Circle) {
-        Circle circle = (Circle)args.getShape();
-
-        // Make the ValueSource
-        valueSource = makeDistanceValueSource(shape.getCenter());
-
-        ValueSourceFilter vsf = new ValueSourceFilter(
-            new QueryWrapperFilter( spatial ), valueSource, 0, circle.getRadius() );
-
-        spatial = new FilteredQuery( new MatchAllDocsQuery(), vsf );
-      }
-    }
-    else if( op == SpatialOperation.IsDisjointTo ) {
-      spatial =  makeDisjoint(bbox);
-    }
-
-    if( spatial == null ) {
-      throw new UnsupportedSpatialOperation(args.getOperation());
-    }
-
-    if( valueSource != null ) {
-      valueSource = new CachingDoubleValueSource(valueSource);
-    }
-    else {
-      valueSource = makeDistanceValueSource(shape.getCenter());
-    }
-    Query spatialRankingQuery = new FunctionQuery(valueSource);
-    BooleanQuery.Builder bq = new BooleanQuery.Builder();
-    bq.add(spatial,BooleanClause.Occur.MUST);
-    bq.add(spatialRankingQuery,BooleanClause.Occur.MUST);
-    return bq.build();
-  }
-
   /**
    * Constructs a query to retrieve documents that fully contain the input envelope.
    */
@@ -254,21 +191,6 @@ public class PointVectorStrategy extends
         true);//inclusive
   }
 
-  /**
-   * Constructs a query to retrieve documents that fully contain the input envelope.
-   */
-  private Query makeDisjoint(Rectangle bbox) {
-    if (bbox.getCrossesDateLine())
-      throw new UnsupportedOperationException("makeDisjoint doesn't handle dateline cross");
-    Query qX = rangeQuery(fieldNameX, bbox.getMinX(), bbox.getMaxX());
-    Query qY = rangeQuery(fieldNameY, bbox.getMinY(), bbox.getMaxY());
-
-    BooleanQuery.Builder bq = new BooleanQuery.Builder();
-    bq.add(qX,BooleanClause.Occur.MUST_NOT);
-    bq.add(qY,BooleanClause.Occur.MUST_NOT);
-    return bq.build();
-  }
-
 }
 
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java Thu Aug  6 17:55:56 2015
@@ -17,6 +17,9 @@
 
 package org.apache.solr.search;
 
+import java.io.IOException;
+import java.util.Map;
+
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
@@ -24,9 +27,6 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.solr.search.function.ValueSourceRangeFilter;
 
-import java.io.IOException;
-import java.util.Map;
-
 // This class works as either a normal constant score query, or as a PostFilter using a collector
 public class FunctionRangeQuery extends SolrConstantScoreQuery implements PostFilter {
   final ValueSourceRangeFilter rangeFilt;
@@ -53,7 +53,8 @@ public class FunctionRangeQuery extends
 
     @Override
     public void collect(int doc) throws IOException {
-      if (doc<maxdoc && scorer.matches(doc)) {
+      assert doc < maxdoc;
+      if (scorer.matches(doc)) {
         leafDelegate.collect(doc);
       }
     }