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/10/01 05:26:01 UTC
svn commit: r1706181 [1/2] - in /lucene/dev/trunk: lucene/
lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/
lucene/spatial/src/java/org/apache/lucene/spatial/
lucene/spatial/src/java/org/apache/lucene/spatial/bbox/ lucene/spatial/src...
Author: dsmiley
Date: Thu Oct 1 03:26:00 2015
New Revision: 1706181
URL: http://svn.apache.org/viewvc?rev=1706181&view=rev
Log:
LUCENE-6650: Spatial module no longer uses Filter.
Added:
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeQuery.java
- copied, changed from r1706180, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeQuery.java
- copied, changed from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeQuery.java
- copied, changed from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeQuery.java
- copied, changed from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeQuery.java
- copied, changed from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeFilter.java
Removed:
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeFilter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeFilter.java
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/SpatialFileQueryMaker.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/SpatialStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/CompositeSpatialStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/IntersectsRPTVerifyQuery.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/HeatmapFacetCounter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/NumberRangePrefixTreeStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeFacetCounter.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/TermQueryPrefixTreeStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java
lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java
lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/PortedSolr3Test.java
lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/QueryEqualsHashCodeTest.java
lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/SpatialExample.java
lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/HeatmapFacetCounterTest.java
lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/NumberRangeFacetsTest.java
lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java
lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/serialized/SerializedStrategyTest.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SpatialHeatmapFacets.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Thu Oct 1 03:26:00 2015
@@ -93,6 +93,10 @@ API Changes
* LUCENE-6489: The various span payload queries have been moved to the queries
submodule, and PayloadSpanUtil is now in sandbox. (Alan Woodward)
+* LUCENE-6650: The spatial module no longer uses Filter in any way. All
+ spatial Filters are now subclass Query. The spatial heatmap/facet API
+ now accepts a Bits parameter to filter counts. (David Smiley, Adrien Grand)
+
Optimizations
* LUCENE-6708: TopFieldCollector does not compute the score several times on the
Modified: lucene/dev/trunk/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/SpatialFileQueryMaker.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/SpatialFileQueryMaker.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/SpatialFileQueryMaker.java (original)
+++ lucene/dev/trunk/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/SpatialFileQueryMaker.java Thu Oct 1 03:26:00 2015
@@ -17,23 +17,21 @@ package org.apache.lucene.benchmark.byTa
* limitations under the License.
*/
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
import com.spatial4j.core.shape.Shape;
import org.apache.lucene.benchmark.byTask.utils.Config;
-import org.apache.lucene.queries.CustomScoreQuery;
import org.apache.lucene.queries.function.FunctionQuery;
import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.ConstantScoreQuery;
-import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.spatial.SpatialStrategy;
import org.apache.lucene.spatial.query.SpatialArgs;
import org.apache.lucene.spatial.query.SpatialOperation;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
/**
* Reads spatial data from the body field docs from an internally created {@link LineDocSource}.
* It's parsed by {@link com.spatial4j.core.context.SpatialContext#readShapeFromWkt(String)} (String)} and then
@@ -101,19 +99,16 @@ public class SpatialFileQueryMaker exten
if (!Double.isNaN(distErrPct))
args.setDistErrPct(distErrPct);
+ Query filterQuery = strategy.makeQuery(args);
if (score) {
+ //wrap with distance computing query
ValueSource valueSource = strategy.makeDistanceValueSource(shape.getCenter());
- return new CustomScoreQuery(strategy.makeQuery(args), new FunctionQuery(valueSource));
+ return new BooleanQuery.Builder()
+ .add(new FunctionQuery(valueSource), BooleanClause.Occur.MUST)//matches everything and provides score
+ .add(filterQuery, BooleanClause.Occur.FILTER)//filters (score isn't used)
+ .build();
} else {
- //strategy.makeQuery() could potentially score (isn't well defined) so instead we call
- // makeFilter() and wrap
-
- Filter filter = strategy.makeFilter(args);
- if (filter instanceof QueryWrapperFilter) {
- return ((QueryWrapperFilter)filter).getQuery();
- } else {
- return new ConstantScoreQuery(filter);
- }
+ return filterQuery; // assume constant scoring
}
}
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/SpatialStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/SpatialStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/SpatialStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/SpatialStrategy.java Thu Oct 1 03:26:00 2015
@@ -24,8 +24,6 @@ import com.spatial4j.core.shape.Shape;
import org.apache.lucene.document.Field;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.queries.function.valuesource.ReciprocalFloatFunction;
-import org.apache.lucene.search.ConstantScoreQuery;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query;
import org.apache.lucene.spatial.query.SpatialArgs;
@@ -51,6 +49,8 @@ import org.apache.lucene.spatial.query.S
* values of shapes, which is immaterial to indexing and search.
* <p>
* Thread-safe.
+ * <p>
+ * This API is marked as experimental, however it is quite stable.
*
* @lucene.experimental
*/
@@ -118,32 +118,13 @@ public abstract class SpatialStrategy {
/**
* Make a Query based principally on {@link org.apache.lucene.spatial.query.SpatialOperation}
- * and {@link Shape} from the supplied {@code args}.
- * The default implementation is
- * <pre>return new ConstantScoreQuery(makeFilter(args));</pre>
- *
- * @throws UnsupportedOperationException If the strategy does not support the shape in {@code args}
- * @throws org.apache.lucene.spatial.query.UnsupportedSpatialOperation If the strategy does not support the {@link
- * org.apache.lucene.spatial.query.SpatialOperation} in {@code args}.
- */
- public Query makeQuery(SpatialArgs args) {
- return new ConstantScoreQuery(makeFilter(args));
- }
-
- /**
- * Make a Filter based principally on {@link org.apache.lucene.spatial.query.SpatialOperation}
- * and {@link Shape} from the supplied {@code args}.
- * <p>
- * If a subclasses implements
- * {@link #makeQuery(org.apache.lucene.spatial.query.SpatialArgs)}
- * then this method could be simply:
- * <pre>return new QueryWrapperFilter(makeQuery(args).getQuery());</pre>
+ * and {@link Shape} from the supplied {@code args}. It should be constant scoring of 1.
*
* @throws UnsupportedOperationException If the strategy does not support the shape in {@code args}
* @throws org.apache.lucene.spatial.query.UnsupportedSpatialOperation If the strategy does not support the {@link
* org.apache.lucene.spatial.query.SpatialOperation} in {@code args}.
*/
- public abstract Filter makeFilter(SpatialArgs args);
+ public abstract Query makeQuery(SpatialArgs args);
/**
* Returns a ValueSource with values ranging from 1 to 0, depending inversely
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxStrategy.java Thu Oct 1 03:26:00 2015
@@ -17,21 +17,22 @@ package org.apache.lucene.spatial.bbox;
* limitations under the License.
*/
+import com.spatial4j.core.context.SpatialContext;
+import com.spatial4j.core.shape.Point;
+import com.spatial4j.core.shape.Rectangle;
+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.document.StringField;
import org.apache.lucene.index.DocValuesType;
-import org.apache.lucene.index.FieldInfo;
import org.apache.lucene.index.Term;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.ConstantScoreQuery;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.spatial.SpatialStrategy;
import org.apache.lucene.spatial.query.SpatialArgs;
@@ -40,10 +41,6 @@ import org.apache.lucene.spatial.query.U
import org.apache.lucene.spatial.util.DistanceToShapeValueSource;
import org.apache.lucene.util.BytesRefBuilder;
import org.apache.lucene.util.NumericUtils;
-import com.spatial4j.core.context.SpatialContext;
-import com.spatial4j.core.shape.Point;
-import com.spatial4j.core.shape.Rectangle;
-import com.spatial4j.core.shape.Shape;
/**
@@ -206,25 +203,21 @@ public class BBoxStrategy extends Spatia
}
//---------------------------------
- // Query / Filter Building
+ // Query Building
//---------------------------------
- @Override
- public Filter makeFilter(SpatialArgs args) {
- return new QueryWrapperFilter(makeSpatialQuery(args));
- }
-
- @Override
- public ConstantScoreQuery makeQuery(SpatialArgs args) {
- return new ConstantScoreQuery(makeSpatialQuery(args));
- }
-
-// Utility on SpatialStrategy?
+ // Utility on SpatialStrategy?
// public Query makeQueryWithValueSource(SpatialArgs args, ValueSource valueSource) {
-// return new FilteredQuery(new FunctionQuery(valueSource), makeFilter(args));
+// return new CustomScoreQuery(makeQuery(args), new FunctionQuery(valueSource));
+ //or...
+// return new BooleanQuery.Builder()
+// .add(new FunctionQuery(valueSource), BooleanClause.Occur.MUST)//matches everything and provides score
+// .add(filterQuery, BooleanClause.Occur.FILTER)//filters (score isn't used)
+// .build();
// }
- private Query makeSpatialQuery(SpatialArgs args) {
+ @Override
+ public Query makeQuery(SpatialArgs args) {
Shape shape = args.getShape();
if (!(shape instanceof Rectangle))
throw new UnsupportedOperationException("Can only query by Rectangle, not " + shape);
@@ -245,7 +238,7 @@ public class BBoxStrategy extends Spatia
else { //no Overlaps support yet
throw new UnsupportedSpatialOperation(op);
}
- return spatial;
+ return new ConstantScoreQuery(spatial);
}
/**
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/CompositeSpatialStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/CompositeSpatialStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/CompositeSpatialStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/CompositeSpatialStrategy.java Thu Oct 1 03:26:00 2015
@@ -25,9 +25,7 @@ import com.spatial4j.core.shape.Point;
import com.spatial4j.core.shape.Shape;
import org.apache.lucene.document.Field;
import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.spatial.SpatialStrategy;
import org.apache.lucene.spatial.prefix.RecursivePrefixTreeStrategy;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
@@ -144,10 +142,4 @@ public class CompositeSpatialStrategy ex
}
}
- @Override
- public Filter makeFilter(SpatialArgs args) {
- //note: Filters are being deprecated in LUCENE-6301
- return new QueryWrapperFilter(makeQuery(args));
- }
-
}
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/IntersectsRPTVerifyQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/IntersectsRPTVerifyQuery.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/IntersectsRPTVerifyQuery.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/composite/IntersectsRPTVerifyQuery.java Thu Oct 1 03:26:00 2015
@@ -35,10 +35,9 @@ import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.TwoPhaseIterator;
import org.apache.lucene.search.Weight;
-import org.apache.lucene.spatial.prefix.AbstractVisitingPrefixTreeFilter;
+import org.apache.lucene.spatial.prefix.AbstractVisitingPrefixTreeQuery;
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
-import org.apache.lucene.util.Bits;
import org.apache.lucene.util.DocIdSetBuilder;
/**
@@ -50,13 +49,13 @@ import org.apache.lucene.util.DocIdSetBu
*/
public class IntersectsRPTVerifyQuery extends Query {
- private final IntersectsDifferentiatingFilter intersectsDiffFilter;
+ private final IntersectsDifferentiatingQuery intersectsDiffQuery;
private final ValueSource predicateValueSource; // we call FunctionValues.boolVal(doc)
public IntersectsRPTVerifyQuery(Shape queryShape, String fieldName, SpatialPrefixTree grid, int detailLevel,
int prefixGridScanLevel, ValueSource predicateValueSource) {
this.predicateValueSource = predicateValueSource;
- this.intersectsDiffFilter = new IntersectsDifferentiatingFilter(queryShape, fieldName, grid, detailLevel,
+ this.intersectsDiffQuery = new IntersectsDifferentiatingQuery(queryShape, fieldName, grid, detailLevel,
prefixGridScanLevel);
}
@@ -72,7 +71,7 @@ public class IntersectsRPTVerifyQuery ex
IntersectsRPTVerifyQuery that = (IntersectsRPTVerifyQuery) o;
- if (!intersectsDiffFilter.equals(that.intersectsDiffFilter)) return false;
+ if (!intersectsDiffQuery.equals(that.intersectsDiffQuery)) return false;
return predicateValueSource.equals(that.predicateValueSource);
}
@@ -80,7 +79,7 @@ public class IntersectsRPTVerifyQuery ex
@Override
public int hashCode() {
int result = super.hashCode();
- result = 31 * result + intersectsDiffFilter.hashCode();
+ result = 31 * result + intersectsDiffQuery.hashCode();
result = 31 * result + predicateValueSource.hashCode();
return result;
}
@@ -93,8 +92,8 @@ public class IntersectsRPTVerifyQuery ex
@Override
public Scorer scorer(LeafReaderContext context) throws IOException {
// Compute approx & exact
- final IntersectsDifferentiatingFilter.IntersectsDifferentiatingVisitor result =
- intersectsDiffFilter.compute(context, null);
+ final IntersectsDifferentiatingQuery.IntersectsDifferentiatingVisitor result =
+ intersectsDiffQuery.compute(context);
if (result.approxDocIdSet == null) {
return null;
}
@@ -138,24 +137,26 @@ public class IntersectsRPTVerifyQuery ex
};
}
- //This is a "Filter" but we don't use it as-such; the caller calls the constructor and then compute() and examines
+ //This may be a "Query" but we don't use it as-such; the caller calls the constructor and then compute() and examines
// the results which consists of two parts -- the approximated results, and a subset of exact matches. The
// difference needs to be verified.
- // TODO refactor AVPTF to not be a Query/Filter?
- private static class IntersectsDifferentiatingFilter extends AbstractVisitingPrefixTreeFilter {
+ // TODO refactor AVPTQ to not be a Query?
+ private static class IntersectsDifferentiatingQuery extends AbstractVisitingPrefixTreeQuery {
- public IntersectsDifferentiatingFilter(Shape queryShape, String fieldName, SpatialPrefixTree grid,
- int detailLevel, int prefixGridScanLevel) {
+ public IntersectsDifferentiatingQuery(Shape queryShape, String fieldName, SpatialPrefixTree grid,
+ int detailLevel, int prefixGridScanLevel) {
super(queryShape, fieldName, grid, detailLevel, prefixGridScanLevel);
}
- IntersectsDifferentiatingFilter.IntersectsDifferentiatingVisitor compute(LeafReaderContext context, Bits acceptDocs) throws IOException {
- final IntersectsDifferentiatingFilter.IntersectsDifferentiatingVisitor result = new IntersectsDifferentiatingFilter.IntersectsDifferentiatingVisitor(context, acceptDocs);
+ IntersectsDifferentiatingQuery.IntersectsDifferentiatingVisitor compute(LeafReaderContext context)
+ throws IOException {
+ final IntersectsDifferentiatingQuery.IntersectsDifferentiatingVisitor result =
+ new IntersectsDifferentiatingQuery.IntersectsDifferentiatingVisitor(context);
result.getDocIdSet();//computes
return result;
}
- // TODO consider if IntersectsPrefixTreeFilter should simply do this and provide both sets
+ // TODO consider if IntersectsPrefixTreeQuery should simply do this and provide both sets
class IntersectsDifferentiatingVisitor extends VisitorTemplate {
DocIdSetBuilder approxBuilder = new DocIdSetBuilder(maxDoc);
@@ -165,8 +166,8 @@ public class IntersectsRPTVerifyQuery ex
DocIdSet exactDocIdSet;
DocIdSet approxDocIdSet;
- public IntersectsDifferentiatingVisitor(LeafReaderContext context, Bits acceptDocs) throws IOException {
- super(context, acceptDocs);
+ public IntersectsDifferentiatingVisitor(LeafReaderContext context) throws IOException {
+ super(context);
}
@Override
@@ -188,7 +189,7 @@ public class IntersectsRPTVerifyQuery ex
}
approxDocIdSet = approxBuilder.build();
}
- return null;//unused in this weird re-use of AVPTF
+ return null;//unused in this weird re-use of AVPTQ
}
@Override
@@ -218,7 +219,7 @@ public class IntersectsRPTVerifyQuery ex
}
@Override
- public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ public DocIdSet getDocIdSet(LeafReaderContext context) throws IOException {
throw new IllegalStateException();
}
Copied: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeQuery.java (from r1706180, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeFilter.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeQuery.java?p2=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeQuery.java&p1=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeFilter.java&r1=1706180&r2=1706181&rev=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeFilter.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractPrefixTreeQuery.java Thu Oct 1 03:26:00 2015
@@ -20,31 +20,35 @@ package org.apache.lucene.spatial.prefix
import java.io.IOException;
import com.spatial4j.core.shape.Shape;
-
-import org.apache.lucene.index.FilterLeafReader.FilterPostingsEnum;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
-import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.ConstantScoreScorer;
+import org.apache.lucene.search.ConstantScoreWeight;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.Weight;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
import org.apache.lucene.util.BitSet;
-import org.apache.lucene.util.Bits;
import org.apache.lucene.util.DocIdSetBuilder;
/**
- * Base class for Lucene Filters on SpatialPrefixTree fields.
- * @lucene.experimental
+ * Base class for Lucene Queries on SpatialPrefixTree fields.
+ * @lucene.internal
*/
-public abstract class AbstractPrefixTreeFilter extends Filter {
+public abstract class AbstractPrefixTreeQuery extends Query {
protected final Shape queryShape;
protected final String fieldName;
protected final SpatialPrefixTree grid;//not in equals/hashCode since it's implied for a specific field
protected final int detailLevel;
- public AbstractPrefixTreeFilter(Shape queryShape, String fieldName, SpatialPrefixTree grid, int detailLevel) {
+ public AbstractPrefixTreeQuery(Shape queryShape, String fieldName, SpatialPrefixTree grid, int detailLevel) {
this.queryShape = queryShape;
this.fieldName = fieldName;
this.grid = grid;
@@ -56,7 +60,7 @@ public abstract class AbstractPrefixTree
if (this == o) return true;
if (super.equals(o) == false) return false;
- AbstractPrefixTreeFilter that = (AbstractPrefixTreeFilter) o;
+ AbstractPrefixTreeQuery that = (AbstractPrefixTreeQuery) o;
if (detailLevel != that.detailLevel) return false;
if (!fieldName.equals(that.fieldName)) return false;
@@ -74,22 +78,40 @@ public abstract class AbstractPrefixTree
return result;
}
+ @Override
+ public Weight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
+ return new ConstantScoreWeight(this) {
+ @Override
+ public Scorer scorer(LeafReaderContext context) throws IOException {
+ DocIdSet docSet = getDocIdSet(context);
+ if (docSet == null) {
+ return null;
+ }
+ DocIdSetIterator disi = docSet.iterator();
+ if (disi == null) {
+ return null;
+ }
+ return new ConstantScoreScorer(this, score(), disi);
+ }
+ };
+ }
+
+ protected abstract DocIdSet getDocIdSet(LeafReaderContext context) throws IOException;
+
/** Holds transient state and docid collecting utility methods as part of
* traversing a {@link TermsEnum} for a {@link org.apache.lucene.index.LeafReaderContext}. */
public abstract class BaseTermsEnumTraverser {//TODO rename to LeafTermsEnumTraverser ?
//note: only 'fieldName' (accessed in constructor) keeps this from being a static inner class
protected final LeafReaderContext context;
- protected Bits acceptDocs;
protected final int maxDoc;
protected TermsEnum termsEnum;//remember to check for null!
protected PostingsEnum postingsEnum;
- public BaseTermsEnumTraverser(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ public BaseTermsEnumTraverser(LeafReaderContext context) throws IOException {
this.context = context;
LeafReader reader = context.reader();
- this.acceptDocs = acceptDocs;
this.maxDoc = reader.maxDoc();
Terms terms = reader.terms(fieldName);
if (terms != null)
@@ -99,50 +121,14 @@ public abstract class AbstractPrefixTree
protected void collectDocs(BitSet bitSet) throws IOException {
assert termsEnum != null;
postingsEnum = termsEnum.postings(postingsEnum, PostingsEnum.NONE);
- bitSet.or(wrap(postingsEnum, acceptDocs));
+ bitSet.or(postingsEnum);
}
protected void collectDocs(DocIdSetBuilder docSetBuilder) throws IOException {
assert termsEnum != null;
postingsEnum = termsEnum.postings(postingsEnum, PostingsEnum.NONE);
- docSetBuilder.add(wrap(postingsEnum, acceptDocs));
+ docSetBuilder.add(postingsEnum);
}
}
- /** Filter the given {@link PostingsEnum} with the given {@link Bits}. */
- private static PostingsEnum wrap(PostingsEnum iterator, Bits acceptDocs) {
- if (iterator == null || acceptDocs == null) {
- return iterator;
- }
- return new BitsFilteredPostingsEnum(iterator, acceptDocs);
- }
-
- /** A {@link PostingsEnum} which is filtered by some random-access bits. */
- private static class BitsFilteredPostingsEnum extends FilterPostingsEnum {
-
- private final Bits bits;
-
- private BitsFilteredPostingsEnum(PostingsEnum in, Bits bits) {
- super(in);
- this.bits = bits;
- }
-
- private int doNext(int doc) throws IOException {
- while (doc != NO_MORE_DOCS && bits.get(doc) == false) {
- doc = in.nextDoc();
- }
- return doc;
- }
-
- @Override
- public int nextDoc() throws IOException {
- return doNext(in.nextDoc());
- }
-
- @Override
- public int advance(int target) throws IOException {
- return doNext(in.advance(target));
- }
-
- }
}
Copied: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeQuery.java (from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeFilter.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeQuery.java?p2=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeQuery.java&p1=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeFilter.java&r1=1705593&r2=1706181&rev=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeFilter.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/AbstractVisitingPrefixTreeQuery.java Thu Oct 1 03:26:00 2015
@@ -28,7 +28,6 @@ import org.apache.lucene.search.DocIdSet
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.CellIterator;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
-import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
/**
@@ -36,27 +35,26 @@ import org.apache.lucene.util.BytesRef;
* visitor design patterns for subclasses to guide the traversal and collect
* matching documents.
* <p>
- * Subclasses implement {@link #getDocIdSet(org.apache.lucene.index.LeafReaderContext,
- * org.apache.lucene.util.Bits)} by instantiating a custom {@link
- * VisitorTemplate} subclass (i.e. an anonymous inner class) and implement the
- * required methods.
+ * Subclasses implement {@link #getDocIdSet(org.apache.lucene.index.LeafReaderContext)}
+ * by instantiating a custom {@link VisitorTemplate} subclass (i.e. an anonymous inner class)
+ * and implement the required methods.
*
* @lucene.internal
*/
-public abstract class AbstractVisitingPrefixTreeFilter extends AbstractPrefixTreeFilter {
+public abstract class AbstractVisitingPrefixTreeQuery extends AbstractPrefixTreeQuery {
- //Historical note: this code resulted from a refactoring of RecursivePrefixTreeFilter,
+ //Historical note: this code resulted from a refactoring of RecursivePrefixTreeQuery,
// which in turn came out of SOLR-2155
- //This class perhaps could have been implemented in terms of FilteredTermsEnum & MultiTermQuery
- // & MultiTermQueryWrapperFilter. Maybe so for simple Intersects predicate but not for when we want to collect terms
+ //This class perhaps could have been implemented in terms of FilteredTermsEnum & MultiTermQuery.
+ // Maybe so for simple Intersects predicate but not for when we want to collect terms
// differently depending on cell state like IsWithin and for fuzzy/accurate collection planned improvements. At
// least it would just make things more complicated.
protected final int prefixGridScanLevel;//at least one less than grid.getMaxLevels()
- public AbstractVisitingPrefixTreeFilter(Shape queryShape, String fieldName, SpatialPrefixTree grid,
- int detailLevel, int prefixGridScanLevel) {
+ public AbstractVisitingPrefixTreeQuery(Shape queryShape, String fieldName, SpatialPrefixTree grid,
+ int detailLevel, int prefixGridScanLevel) {
super(queryShape, fieldName, grid, detailLevel);
this.prefixGridScanLevel = Math.max(0, Math.min(prefixGridScanLevel, grid.getMaxLevels() - 1));
assert detailLevel <= grid.getMaxLevels();
@@ -66,8 +64,7 @@ public abstract class AbstractVisitingPr
* An abstract class designed to make it easy to implement predicates or
* other operations on a {@link SpatialPrefixTree} indexed field. An instance
* of this class is not designed to be re-used across LeafReaderContext
- * instances so simply create a new one for each call to, say a {@link
- * org.apache.lucene.search.Filter#getDocIdSet(org.apache.lucene.index.LeafReaderContext, org.apache.lucene.util.Bits)}.
+ * instances so simply create a new one per-leaf.
* The {@link #getDocIdSet()} method here starts the work. It first checks
* that there are indexed terms; if not it quickly returns null. Then it calls
* {@link #start()} so a subclass can set up a return value, like an
@@ -112,8 +109,8 @@ public abstract class AbstractVisitingPr
private BytesRef thisTerm;//the result of termsEnum.term()
private Cell indexedCell;//Cell wrapper of thisTerm. Always updated when thisTerm is.
- public VisitorTemplate(LeafReaderContext context, Bits acceptDocs) throws IOException {
- super(context, acceptDocs);
+ public VisitorTemplate(LeafReaderContext context) throws IOException {
+ super(context);
}
public DocIdSet getDocIdSet() throws IOException {
Copied: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeQuery.java (from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeFilter.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeQuery.java?p2=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeQuery.java&p1=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeFilter.java&r1=1705593&r2=1706181&rev=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeFilter.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/ContainsPrefixTreeQuery.java Thu Oct 1 03:26:00 2015
@@ -41,7 +41,7 @@ import org.apache.lucene.util.SentinelIn
*
* @lucene.experimental
*/
-public class ContainsPrefixTreeFilter extends AbstractPrefixTreeFilter {
+public class ContainsPrefixTreeQuery extends AbstractPrefixTreeQuery {
/**
* If the spatial data for a document is comprised of multiple overlapping or adjacent parts,
@@ -52,7 +52,7 @@ public class ContainsPrefixTreeFilter ex
*/
protected final boolean multiOverlappingIndexedShapes;
- public ContainsPrefixTreeFilter(Shape queryShape, String fieldName, SpatialPrefixTree grid, int detailLevel, boolean multiOverlappingIndexedShapes) {
+ public ContainsPrefixTreeQuery(Shape queryShape, String fieldName, SpatialPrefixTree grid, int detailLevel, boolean multiOverlappingIndexedShapes) {
super(queryShape, fieldName, grid, detailLevel);
this.multiOverlappingIndexedShapes = multiOverlappingIndexedShapes;
}
@@ -61,7 +61,7 @@ public class ContainsPrefixTreeFilter ex
public boolean equals(Object o) {
if (!super.equals(o))
return false;
- return multiOverlappingIndexedShapes == ((ContainsPrefixTreeFilter)o).multiOverlappingIndexedShapes;
+ return multiOverlappingIndexedShapes == ((ContainsPrefixTreeQuery)o).multiOverlappingIndexedShapes;
}
@Override
@@ -71,7 +71,7 @@ public class ContainsPrefixTreeFilter ex
@Override
public String toString(String field) {
- return "ContainsPrefixTreeFilter(" +
+ return getClass().getSimpleName() + "(" +
"fieldName=" + fieldName + "," +
"queryShape=" + queryShape + "," +
"detailLevel=" + detailLevel + "," +
@@ -80,14 +80,14 @@ public class ContainsPrefixTreeFilter ex
}
@Override
- public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
- return new ContainsVisitor(context, acceptDocs).visit(grid.getWorldCell(), acceptDocs);
+ protected DocIdSet getDocIdSet(LeafReaderContext context) throws IOException {
+ return new ContainsVisitor(context).visit(grid.getWorldCell(), null);
}
private class ContainsVisitor extends BaseTermsEnumTraverser {
- public ContainsVisitor(LeafReaderContext context, Bits acceptDocs) throws IOException {
- super(context, acceptDocs);
+ public ContainsVisitor(LeafReaderContext context) throws IOException {
+ super(context);
if (termsEnum != null) {
nextTerm();//advance to first
}
@@ -239,6 +239,7 @@ public class ContainsPrefixTreeFilter ex
/** A hash based mutable set of docIds. If this were Solr code then we might
* use a combination of HashDocSet and SortedIntDocSet instead. */
+ // TODO use DocIdSetBuilder?
private static class SmallDocSet extends DocIdSet implements Bits {
private final SentinelIntSet intSet;
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/HeatmapFacetCounter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/HeatmapFacetCounter.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/HeatmapFacetCounter.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/HeatmapFacetCounter.java Thu Oct 1 03:26:00 2015
@@ -27,15 +27,17 @@ import com.spatial4j.core.shape.Rectangl
import com.spatial4j.core.shape.Shape;
import com.spatial4j.core.shape.SpatialRelation;
import org.apache.lucene.index.IndexReaderContext;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.CellIterator;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
import org.apache.lucene.util.ArrayUtil;
+import org.apache.lucene.util.Bits;
/**
* Computes spatial facets in two dimensions as a grid of numbers. The data is often visualized as a so-called
* "heatmap", hence the name.
+ *
+ * @lucene.experimental
*/
public class HeatmapFacetCounter {
//TODO where should this code live? It could go to PrefixTreeFacetCounter, or maybe here in its own class is fine.
@@ -78,19 +80,16 @@ public class HeatmapFacetCounter {
* uses when approximating what level to go to when indexing a shape given a distErrPct.
*
* @param context the IndexReader's context
- * @param filter a Filter to limit counted docs. For optimal performance, it's
- * {@link org.apache.lucene.search.DocIdSet#bits()} should be non-null. If no filter is provided, live
- * docs are counted.
- * @param inputShape the shape to gather grid squares for; typically a {@link com.spatial4j.core.shape.Rectangle}.
+ * @param topAcceptDocs a Bits to limit counted docs. If null, live docs are counted.
+ * @param inputShape the shape to gather grid squares for; typically a {@link Rectangle}.
* The <em>actual</em> heatmap area will usually be larger since the cells on the edge that overlap
* are returned. We always return a rectangle of integers even if the inputShape isn't a rectangle
* -- the non-intersecting cells will all be 0.
* If null is given, the entire world is assumed.
* @param facetLevel the target depth (detail) of cells.
* @param maxCells the maximum number of cells to return. If the cells exceed this count, an
- * IllegalArgumentException is thrown.
*/
- public static Heatmap calcFacets(PrefixTreeStrategy strategy, IndexReaderContext context, Filter filter,
+ public static Heatmap calcFacets(PrefixTreeStrategy strategy, IndexReaderContext context, Bits topAcceptDocs,
Shape inputShape, final int facetLevel, int maxCells) throws IOException {
if (maxCells > (MAX_ROWS_OR_COLUMNS * MAX_ROWS_OR_COLUMNS)) {
throw new IllegalArgumentException("maxCells (" + maxCells + ") should be <= " + MAX_ROWS_OR_COLUMNS);
@@ -153,7 +152,7 @@ public class HeatmapFacetCounter {
Map<Rectangle,Integer> ancestors = new HashMap<>();
//Now lets count some facets!
- PrefixTreeFacetCounter.compute(strategy, context, filter, inputShape, facetLevel,
+ PrefixTreeFacetCounter.compute(strategy, context, topAcceptDocs, inputShape, facetLevel,
new PrefixTreeFacetCounter.FacetVisitor() {
@Override
public void visit(Cell cell, int count) {
Copied: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeQuery.java (from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeFilter.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeQuery.java?p2=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeQuery.java&p1=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeFilter.java&r1=1705593&r2=1706181&rev=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeFilter.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/IntersectsPrefixTreeQuery.java Thu Oct 1 03:26:00 2015
@@ -26,25 +26,24 @@ import org.apache.lucene.search.DocIdSet
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
import org.apache.lucene.util.BitDocIdSet;
-import org.apache.lucene.util.Bits;
import org.apache.lucene.util.FixedBitSet;
/**
- * A Filter matching documents that have an {@link SpatialRelation#INTERSECTS}
+ * A Query matching documents that have an {@link SpatialRelation#INTERSECTS}
* (i.e. not DISTINCT) relationship with a provided query shape.
*
* @lucene.internal
*/
-public class IntersectsPrefixTreeFilter extends AbstractVisitingPrefixTreeFilter {
+public class IntersectsPrefixTreeQuery extends AbstractVisitingPrefixTreeQuery {
- public IntersectsPrefixTreeFilter(Shape queryShape, String fieldName,
- SpatialPrefixTree grid, int detailLevel,
- int prefixGridScanLevel) {
+ public IntersectsPrefixTreeQuery(Shape queryShape, String fieldName,
+ SpatialPrefixTree grid, int detailLevel,
+ int prefixGridScanLevel) {
super(queryShape, fieldName, grid, detailLevel, prefixGridScanLevel);
}
@Override
- public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ protected DocIdSet getDocIdSet(LeafReaderContext context) throws IOException {
/* Possible optimizations (in IN ADDITION TO THOSE LISTED IN VISITORTEMPLATE):
* If docFreq is 1 (or < than some small threshold), then check to see if we've already
@@ -54,7 +53,7 @@ public class IntersectsPrefixTreeFilter
* Point query shape optimization when the only indexed data is a point (no leaves). Result is a term query.
*/
- return new VisitorTemplate(context, acceptDocs) {
+ return new VisitorTemplate(context) {
private FixedBitSet results;
@Override
@@ -86,7 +85,7 @@ public class IntersectsPrefixTreeFilter
@Override
public String toString(String field) {
- return "IntersectsPrefixTreeFilter(" +
+ return getClass().getSimpleName() + "(" +
"fieldName=" + fieldName + "," +
"queryShape=" + queryShape + "," +
"detailLevel=" + detailLevel + "," +
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/NumberRangePrefixTreeStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/NumberRangePrefixTreeStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/NumberRangePrefixTreeStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/NumberRangePrefixTreeStrategy.java Thu Oct 1 03:26:00 2015
@@ -28,9 +28,9 @@ import com.spatial4j.core.shape.Point;
import com.spatial4j.core.shape.Shape;
import org.apache.lucene.index.IndexReaderContext;
import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.NumberRangePrefixTree;
+import org.apache.lucene.util.Bits;
import static org.apache.lucene.spatial.prefix.tree.NumberRangePrefixTree.UnitNRShape;
@@ -72,13 +72,13 @@ public class NumberRangePrefixTreeStrate
/** Calculates facets between {@code start} and {@code end} to a detail level one greater than that provided by the
* arguments. For example providing March to October of 2014 would return facets to the day level of those months.
* This is just a convenience method.
- * @see #calcFacets(IndexReaderContext, Filter, Shape, int)
+ * @see #calcFacets(IndexReaderContext, Bits, Shape, int)
*/
- public Facets calcFacets(IndexReaderContext context, Filter filter, UnitNRShape start, UnitNRShape end)
+ public Facets calcFacets(IndexReaderContext context, Bits topAcceptDocs, UnitNRShape start, UnitNRShape end)
throws IOException {
Shape facetRange = getGrid().toRangeShape(start, end);
int detailLevel = Math.max(start.getLevel(), end.getLevel()) + 1;
- return calcFacets(context, filter, facetRange, detailLevel);
+ return calcFacets(context, topAcceptDocs, facetRange, detailLevel);
}
/**
@@ -88,10 +88,10 @@ public class NumberRangePrefixTreeStrate
* {@link org.apache.lucene.spatial.prefix.tree.NumberRangePrefixTree.UnitNRShape#getLevel()}.
* Facet computation is implemented by navigating the underlying indexed terms efficiently.
*/
- public Facets calcFacets(IndexReaderContext context, Filter filter, Shape facetRange, final int level)
+ public Facets calcFacets(IndexReaderContext context, Bits topAcceptDocs, Shape facetRange, final int level)
throws IOException {
final Facets facets = new Facets(level);
- PrefixTreeFacetCounter.compute(this, context, filter, facetRange, level,
+ PrefixTreeFacetCounter.compute(this, context, topAcceptDocs, facetRange, level,
new PrefixTreeFacetCounter.FacetVisitor() {
Facets.FacetParentVal parentFacet;
UnitNRShape parentShape;
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeFacetCounter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeFacetCounter.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeFacetCounter.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeFacetCounter.java Thu Oct 1 03:26:00 2015
@@ -25,11 +25,9 @@ import org.apache.lucene.index.LeafReade
import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
import org.apache.lucene.util.Bits;
-import org.apache.lucene.util.SparseFixedBitSet;
/**
* Computes facets on cells for {@link org.apache.lucene.spatial.prefix.PrefixTreeStrategy}.
@@ -67,41 +65,34 @@ public class PrefixTreeFacetCounter {
/**
* Computes facets using a callback/visitor style design, allowing flexibility for the caller to determine what to do
* with each underlying count.
- *
* @param strategy the prefix tree strategy (contains the field reference, grid, max levels)
* @param context the IndexReader's context
- * @param filter a Filter to limit counted docs. For optimal performance, it's
- * {@link org.apache.lucene.search.DocIdSet#bits()} should be non-null. If no filter is provided, live
- * docs are counted.
+ * @param topAcceptDocs a Bits to limit counted docs. If null, live docs are counted.
* @param queryShape the shape to limit the range of facet counts to
* @param facetLevel the maximum depth (detail) of faceted cells
* @param facetVisitor the visitor/callback to receive the counts
*/
- public static void compute(PrefixTreeStrategy strategy, IndexReaderContext context, Filter filter,
+ public static void compute(PrefixTreeStrategy strategy, IndexReaderContext context, Bits topAcceptDocs,
Shape queryShape, int facetLevel, FacetVisitor facetVisitor)
throws IOException {
//We collect per-leaf
for (final LeafReaderContext leafCtx : context.leaves()) {
//determine leaf acceptDocs Bits
Bits leafAcceptDocs;
- if (filter == null) {
+ if (topAcceptDocs == null) {
leafAcceptDocs = leafCtx.reader().getLiveDocs();//filter deleted
} else {
- final DocIdSet docIdSet = filter.getDocIdSet(leafCtx, leafCtx.reader().getLiveDocs());
- if (docIdSet == null) {
- continue;//no docs in filter
- }
- leafAcceptDocs = docIdSet.bits();
- if (leafAcceptDocs == null) {
- final DocIdSetIterator iterator = docIdSet.iterator();
- if (iterator == null) {
- continue;//no docs in filter
- }
- //build bits from iterator (abnormal, hopefully, not expecting many docs)
- SparseFixedBitSet bitSet = new SparseFixedBitSet(leafCtx.reader().maxDoc());
- bitSet.or(iterator);
- leafAcceptDocs = bitSet;
- }
+ leafAcceptDocs = new Bits() {
+ @Override
+ public boolean get(int index) {
+ return topAcceptDocs.get(leafCtx.docBase + index);
+ }
+
+ @Override
+ public int length() {
+ return leafCtx.reader().maxDoc();
+ }
+ };
}
compute(strategy, leafCtx, leafAcceptDocs, queryShape, facetLevel, facetVisitor);
@@ -122,21 +113,20 @@ public class PrefixTreeFacetCounter {
// another scanLevel would be much faster and it tends to be a risky knob (can help a little, can hurt a ton).
// TODO use RPT's configured scan level? Do we know better here? Hard to say.
final int scanLevel = tree.getMaxLevels();
-
//AbstractVisitingPrefixTreeFilter is a Lucene Filter. We don't need a filter; we use it for its great prefix-tree
// traversal code. TODO consider refactoring if/when it makes sense (more use cases than this)
- new AbstractVisitingPrefixTreeFilter(queryShape, strategy.getFieldName(), tree, facetLevel, scanLevel) {
+ new AbstractVisitingPrefixTreeQuery(queryShape, strategy.getFieldName(), tree, facetLevel, scanLevel) {
@Override
public String toString(String field) {
- return "anonPrefixTreeFilter";
+ return "anonPrefixTreeQuery";//un-used
}
@Override
- public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ public DocIdSet getDocIdSet(LeafReaderContext contexts) throws IOException {
assert facetLevel == super.detailLevel;//same thing, FYI. (constant)
- return new VisitorTemplate(context, acceptDocs) {
+ return new VisitorTemplate(context) {
@Override
protected void start() throws IOException {
@@ -185,7 +175,7 @@ public class PrefixTreeFacetCounter {
int count = 0;
postingsEnum = termsEnum.postings(postingsEnum, PostingsEnum.NONE);
while (postingsEnum.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
- if (acceptDocs != null && acceptDocs.get(postingsEnum.docID()) == false) {
+ if (acceptDocs.get(postingsEnum.docID()) == false) {
continue;
}
count++;
@@ -207,6 +197,6 @@ public class PrefixTreeFacetCounter {
}.getDocIdSet();
}
- }.getDocIdSet(context, acceptDocs);
+ }.getDocIdSet(context);
}
}
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java Thu Oct 1 03:26:00 2015
@@ -29,12 +29,12 @@ import org.apache.lucene.document.FieldT
import org.apache.lucene.index.IndexOptions;
import org.apache.lucene.index.IndexReaderContext;
import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.spatial.SpatialStrategy;
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
import org.apache.lucene.spatial.query.SpatialArgs;
import org.apache.lucene.spatial.util.ShapeFieldCacheDistanceValueSource;
+import org.apache.lucene.util.Bits;
/**
* An abstract SpatialStrategy based on {@link SpatialPrefixTree}. The two
@@ -75,7 +75,7 @@ import org.apache.lucene.spatial.util.Sh
* configuration item is {@link #setDistErrPct(double)} which balances
* shape precision against scalability. See those javadocs.
*
- * @lucene.internal
+ * @lucene.experimental
*/
public abstract class PrefixTreeStrategy extends SpatialStrategy {
protected final SpatialPrefixTree grid;
@@ -200,10 +200,10 @@ public abstract class PrefixTreeStrategy
* Computes spatial facets in two dimensions as a grid of numbers. The data is often visualized as a so-called
* "heatmap".
*
- * @see org.apache.lucene.spatial.prefix.HeatmapFacetCounter#calcFacets(PrefixTreeStrategy, org.apache.lucene.index.IndexReaderContext, org.apache.lucene.search.Filter, com.spatial4j.core.shape.Shape, int, int)
+ * @see HeatmapFacetCounter#calcFacets(PrefixTreeStrategy, IndexReaderContext, Bits, Shape, int, int)
*/
- public HeatmapFacetCounter.Heatmap calcFacets(IndexReaderContext context, Filter filter,
+ public HeatmapFacetCounter.Heatmap calcFacets(IndexReaderContext context, Bits topAcceptDocs,
Shape inputShape, final int facetLevel, int maxCells) throws IOException {
- return HeatmapFacetCounter.calcFacets(this, context, filter, inputShape, facetLevel, maxCells);
+ return HeatmapFacetCounter.calcFacets(this, context, topAcceptDocs, inputShape, facetLevel, maxCells);
}
}
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java Thu Oct 1 03:26:00 2015
@@ -23,7 +23,7 @@ import java.util.List;
import com.spatial4j.core.shape.Point;
import com.spatial4j.core.shape.Shape;
-import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.Query;
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.CellIterator;
import org.apache.lucene.spatial.prefix.tree.LegacyCell;
@@ -33,7 +33,7 @@ import org.apache.lucene.spatial.query.S
import org.apache.lucene.spatial.query.UnsupportedSpatialOperation;
/**
- * A {@link PrefixTreeStrategy} which uses {@link AbstractVisitingPrefixTreeFilter}.
+ * A {@link PrefixTreeStrategy} which uses {@link AbstractVisitingPrefixTreeQuery}.
* This strategy has support for searching non-point shapes (note: not tested).
* Even a query shape with distErrPct=0 (fully precise to the grid) should have
* good performance for typical data, unless there is a lot of indexed data
@@ -83,7 +83,7 @@ public class RecursivePrefixTreeStrategy
return multiOverlappingIndexedShapes;
}
- /** See {@link ContainsPrefixTreeFilter#multiOverlappingIndexedShapes}. */
+ /** See {@link ContainsPrefixTreeQuery#multiOverlappingIndexedShapes}. */
public void setMultiOverlappingIndexedShapes(boolean multiOverlappingIndexedShapes) {
this.multiOverlappingIndexedShapes = multiOverlappingIndexedShapes;
}
@@ -171,21 +171,21 @@ public class RecursivePrefixTreeStrategy
}
@Override
- public Filter makeFilter(SpatialArgs args) {
+ public Query makeQuery(SpatialArgs args) {
final SpatialOperation op = args.getOperation();
Shape shape = args.getShape();
int detailLevel = grid.getLevelForDistance(args.resolveDistErr(ctx, distErrPct));
if (op == SpatialOperation.Intersects) {
- return new IntersectsPrefixTreeFilter(
+ return new IntersectsPrefixTreeQuery(
shape, getFieldName(), grid, detailLevel, prefixGridScanLevel);
} else if (op == SpatialOperation.IsWithin) {
- return new WithinPrefixTreeFilter(
+ return new WithinPrefixTreeQuery(
shape, getFieldName(), grid, detailLevel, prefixGridScanLevel,
-1);//-1 flag is slower but ensures correct results
} else if (op == SpatialOperation.Contains) {
- return new ContainsPrefixTreeFilter(shape, getFieldName(), grid, detailLevel,
+ return new ContainsPrefixTreeQuery(shape, getFieldName(), grid, detailLevel,
multiOverlappingIndexedShapes);
}
throw new UnsupportedSpatialOperation(op);
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/TermQueryPrefixTreeStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/TermQueryPrefixTreeStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/TermQueryPrefixTreeStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/TermQueryPrefixTreeStrategy.java Thu Oct 1 03:26:00 2015
@@ -23,8 +23,7 @@ import java.util.List;
import com.spatial4j.core.shape.Point;
import com.spatial4j.core.shape.Shape;
import org.apache.lucene.queries.TermsQuery;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.search.QueryWrapperFilter;
+import org.apache.lucene.search.Query;
import org.apache.lucene.spatial.prefix.tree.Cell;
import org.apache.lucene.spatial.prefix.tree.CellIterator;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
@@ -69,7 +68,7 @@ public class TermQueryPrefixTreeStrategy
}
@Override
- public Filter makeFilter(SpatialArgs args) {
+ public Query makeQuery(SpatialArgs args) {
final SpatialOperation op = args.getOperation();
if (op != SpatialOperation.Intersects)
throw new UnsupportedSpatialOperation(op);
@@ -107,7 +106,7 @@ public class TermQueryPrefixTreeStrategy
}
//unfortunately TermsQuery will needlessly sort & dedupe
//TODO an automatonQuery might be faster?
- return new QueryWrapperFilter(new TermsQuery(getFieldName(), terms));
+ return new TermsQuery(getFieldName(), terms);
}
}
Copied: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeQuery.java (from r1705593, lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeFilter.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeQuery.java?p2=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeQuery.java&p1=lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeFilter.java&r1=1705593&r2=1706181&rev=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeFilter.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/WithinPrefixTreeQuery.java Thu Oct 1 03:26:00 2015
@@ -49,7 +49,7 @@ import org.apache.lucene.util.FixedBitSe
*
* @lucene.experimental
*/
-public class WithinPrefixTreeFilter extends AbstractVisitingPrefixTreeFilter {
+public class WithinPrefixTreeQuery extends AbstractVisitingPrefixTreeQuery {
//TODO LUCENE-4869: implement faster algorithm based on filtering out false-positives of a
// minimal query buffer by looking in a DocValues cache holding a representative
// point of each disjoint component of a document's shape(s).
@@ -60,14 +60,14 @@ public class WithinPrefixTreeFilter exte
private final Shape bufferedQueryShape;//if null then the whole world
/**
- * See {@link AbstractVisitingPrefixTreeFilter#AbstractVisitingPrefixTreeFilter(com.spatial4j.core.shape.Shape, String, org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree, int, int)}.
+ * See {@link AbstractVisitingPrefixTreeQuery#AbstractVisitingPrefixTreeQuery(com.spatial4j.core.shape.Shape, String, org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree, int, int)}.
* {@code queryBuffer} is the (minimum) distance beyond the query shape edge
* where non-matching documents are looked for so they can be excluded. If
* -1 is used then the whole world is examined (a good default for correctness).
*/
- public WithinPrefixTreeFilter(Shape queryShape, String fieldName, SpatialPrefixTree grid,
- int detailLevel, int prefixGridScanLevel,
- double queryBuffer) {
+ public WithinPrefixTreeQuery(Shape queryShape, String fieldName, SpatialPrefixTree grid,
+ int detailLevel, int prefixGridScanLevel,
+ double queryBuffer) {
super(queryShape, fieldName, grid, detailLevel, prefixGridScanLevel);
this.bufferedQueryShape = queryBuffer == -1 ? null : bufferShape(queryShape, queryBuffer);
}
@@ -76,7 +76,7 @@ public class WithinPrefixTreeFilter exte
public boolean equals(Object o) {
if (!super.equals(o)) return false;//checks getClass == o.getClass & instanceof
- WithinPrefixTreeFilter that = (WithinPrefixTreeFilter) o;
+ WithinPrefixTreeQuery that = (WithinPrefixTreeQuery) o;
if (bufferedQueryShape != null ? !bufferedQueryShape.equals(that.bufferedQueryShape) : that.bufferedQueryShape != null)
return false;
@@ -93,7 +93,7 @@ public class WithinPrefixTreeFilter exte
@Override
public String toString(String field) {
- return "WithinPrefixTreeFilter(" +
+ return getClass().getSimpleName() + "(" +
"fieldName=" + fieldName + "," +
"queryShape=" + queryShape + "," +
"detailLevel=" + detailLevel + "," +
@@ -147,8 +147,8 @@ public class WithinPrefixTreeFilter exte
@Override
- public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
- return new VisitorTemplate(context, acceptDocs) {
+ protected DocIdSet getDocIdSet(LeafReaderContext context) throws IOException {
+ return new VisitorTemplate(context) {
private FixedBitSet inside;
private FixedBitSet outside;
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java Thu Oct 1 03:26:00 2015
@@ -17,22 +17,30 @@ package org.apache.lucene.spatial.serial
* limitations under the License.
*/
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
import com.spatial4j.core.context.SpatialContext;
import com.spatial4j.core.io.BinaryCodec;
import com.spatial4j.core.shape.Point;
import com.spatial4j.core.shape.Shape;
-
import org.apache.lucene.document.BinaryDocValuesField;
import org.apache.lucene.document.Field;
-import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.BinaryDocValues;
+import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Explanation;
-import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
+import org.apache.lucene.search.RandomAccessWeight;
+import org.apache.lucene.search.TwoPhaseIterator;
+import org.apache.lucene.search.Weight;
import org.apache.lucene.spatial.SpatialStrategy;
import org.apache.lucene.spatial.query.SpatialArgs;
import org.apache.lucene.spatial.util.DistanceToShapeValueSource;
@@ -41,14 +49,6 @@ import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.BytesRefBuilder;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.util.Map;
-
/**
* A SpatialStrategy based on serializing a Shape stored into BinaryDocValues.
@@ -104,23 +104,16 @@ public class SerializedDVStrategy extend
return new DistanceToShapeValueSource(makeShapeValueSource(), queryPoint, multiplier, ctx);
}
- @Override
- public Query makeQuery(SpatialArgs args) {
- throw new UnsupportedOperationException("This strategy can't return a query that operates" +
- " efficiently. Instead try a Filter or ValueSource.");
- }
-
/**
- * Returns a Filter that should be used in a random-access fashion.
- * Use in another manner is likely to result in an {@link java.lang.UnsupportedOperationException}
- * to prevent misuse because the filter can't efficiently work via iteration.
+ * Returns a Query that should be used in a random-access fashion.
+ * Use in another manner will be SLOW.
*/
@Override
- public Filter makeFilter(final SpatialArgs args) {
+ public Query makeQuery(SpatialArgs args) {
ValueSource shapeValueSource = makeShapeValueSource();
ShapePredicateValueSource predicateValueSource = new ShapePredicateValueSource(
shapeValueSource, args.getOperation(), args.getShape());
- return new PredicateValueSourceFilter(predicateValueSource);
+ return new PredicateValueSourceQuery(predicateValueSource);
}
/**
@@ -132,38 +125,25 @@ public class SerializedDVStrategy extend
return new ShapeDocValueSource(getFieldName(), ctx.getBinaryCodec());
}
- /** This filter only supports returning a DocSet with a bits(). If you try to grab the
- * iterator then you'll get an UnsupportedOperationException.
+ /** Warning: don't iterate over the results of this query; it's designed for use in a random-access fashion
+ * by {@link TwoPhaseIterator}.
*/
- static class PredicateValueSourceFilter extends Filter {
+ static class PredicateValueSourceQuery extends Query {
private final ValueSource predicateValueSource;//we call boolVal(doc)
- public PredicateValueSourceFilter(ValueSource predicateValueSource) {
- super(true);
+ public PredicateValueSourceQuery(ValueSource predicateValueSource) {
this.predicateValueSource = predicateValueSource;
}
@Override
- public DocIdSet getDocIdSet(final LeafReaderContext context, final Bits acceptDocs) throws IOException {
- return new DocIdSet() {
+ public Weight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
+ return new RandomAccessWeight(this) {
@Override
- public DocIdSetIterator iterator() throws IOException {
- throw new UnsupportedOperationException(
- "Iteration is too slow; consume using DocIdSet.bits() instead");
- //Note that if you're truly bent on doing this, then see FunctionValues.getRangeScorer
- }
-
- @Override
- public Bits bits() throws IOException {
- //null Map context -- we simply don't have one. That's ok.
+ protected Bits getMatchingDocs(LeafReaderContext context) throws IOException {
final FunctionValues predFuncValues = predicateValueSource.getValues(null, context);
-
return new Bits() {
-
@Override
public boolean get(int index) {
- if (acceptDocs != null && !acceptDocs.get(index))
- return false;
return predFuncValues.boolVal(index);
}
@@ -173,11 +153,6 @@ public class SerializedDVStrategy extend
}
};
}
-
- @Override
- public long ramBytesUsed() {
- return 0L;
- }
};
}
@@ -186,7 +161,7 @@ public class SerializedDVStrategy extend
if (this == o) return true;
if (super.equals(o) == false) return false;
- PredicateValueSourceFilter that = (PredicateValueSourceFilter) o;
+ PredicateValueSourceQuery that = (PredicateValueSourceQuery) o;
if (!predicateValueSource.equals(that.predicateValueSource)) return false;
@@ -200,11 +175,11 @@ public class SerializedDVStrategy extend
@Override
public String toString(String field) {
- return "PredicateValueSourceFilter(" +
+ return "PredicateValueSourceQuery(" +
predicateValueSource.toString() +
")";
}
- }//PredicateValueSourceFilter
+ }//PredicateValueSourceQuery
/**
* Implements a ValueSource by deserializing a Shape in from BinaryDocValues using BinaryCodec.
Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java Thu Oct 1 03:26:00 2015
@@ -30,10 +30,8 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.ConstantScoreQuery;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.spatial.SpatialStrategy;
import org.apache.lucene.spatial.query.SpatialArgs;
import org.apache.lucene.spatial.query.SpatialOperation;
@@ -125,17 +123,6 @@ public class PointVectorStrategy extends
}
@Override
- public Filter makeFilter(SpatialArgs args) {
- //unwrap the CSQ from makeQuery
- ConstantScoreQuery csq = makeQuery(args);
- Query sub = csq.getQuery();
- if (sub instanceof Filter)
- return (Filter) sub;
- else
- return new QueryWrapperFilter(sub);
- }
-
- @Override
public ConstantScoreQuery makeQuery(SpatialArgs args) {
if(! SpatialOperation.is( args.getOperation(),
SpatialOperation.Intersects,
Modified: lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/PortedSolr3Test.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/PortedSolr3Test.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/PortedSolr3Test.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/PortedSolr3Test.java Thu Oct 1 03:26:00 2015
@@ -17,6 +17,11 @@ package org.apache.lucene.spatial;
* limitations under the License.
*/
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
import com.carrotsearch.randomizedtesting.annotations.Name;
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
import com.spatial4j.core.context.SpatialContext;
@@ -34,11 +39,6 @@ import org.apache.lucene.spatial.query.S
import org.apache.lucene.spatial.vector.PointVectorStrategy;
import org.junit.Test;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
/**
* Based off of Solr 3's SpatialFilterTest.
*/
@@ -165,12 +165,7 @@ public class PortedSolr3Test extends Str
SpatialArgs args = new SpatialArgs(op,shape);
//args.setDistPrecision(0.025);
- Query query;
- if (random().nextBoolean()) {
- query = strategy.makeQuery(args);
- } else {
- query = strategy.makeFilter(args);
- }
+ Query query = strategy.makeQuery(args);
SearchResults results = executeQuery(query, 100);
assertEquals(""+shape,assertNumFound,results.numFound);
if (assertIds != null) {
Modified: lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/QueryEqualsHashCodeTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/QueryEqualsHashCodeTest.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/QueryEqualsHashCodeTest.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/QueryEqualsHashCodeTest.java Thu Oct 1 03:26:00 2015
@@ -80,12 +80,6 @@ public class QueryEqualsHashCodeTest ext
testEqualsHashcode(args1, args2, new ObjGenerator() {
@Override
public Object gen(SpatialArgs args) {
- return strategy.makeFilter(args);
- }
- });
- testEqualsHashcode(args1, args2, new ObjGenerator() {
- @Override
- public Object gen(SpatialArgs args) {
return strategy.makeDistanceValueSource(args.getShape().getCenter());
}
});
Modified: lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/SpatialExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/SpatialExample.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/SpatialExample.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/SpatialExample.java Thu Oct 1 03:26:00 2015
@@ -17,11 +17,12 @@ package org.apache.lucene.spatial;
* limitations under the License.
*/
+import java.io.IOException;
+
import com.spatial4j.core.context.SpatialContext;
import com.spatial4j.core.distance.DistanceUtils;
import com.spatial4j.core.shape.Point;
import com.spatial4j.core.shape.Shape;
-
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericDocValuesField;
@@ -32,9 +33,9 @@ import org.apache.lucene.index.IndexWrit
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.StoredDocument;
import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
@@ -48,8 +49,6 @@ import org.apache.lucene.store.Directory
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.LuceneTestCase;
-import java.io.IOException;
-
/**
* This class serves as example code to show how to use the Lucene spatial
* module.
@@ -151,8 +150,8 @@ public class SpatialExample extends Luce
//note: SpatialArgs can be parsed from a string
SpatialArgs args = new SpatialArgs(SpatialOperation.Intersects,
ctx.makeCircle(-80.0, 33.0, DistanceUtils.dist2Degrees(200, DistanceUtils.EARTH_MEAN_RADIUS_KM)));
- Filter filter = strategy.makeFilter(args);
- TopDocs docs = indexSearcher.search(filter, 10, idSort);
+ Query query = strategy.makeQuery(args);
+ TopDocs docs = indexSearcher.search(query, 10, idSort);
assertDocMatchedIds(indexSearcher, docs, 2);
//Now, lets get the distance for the 1st doc via computing from stored point value:
// (this computation is usually not redundant)
Modified: lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/HeatmapFacetCounterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/HeatmapFacetCounterTest.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/HeatmapFacetCounterTest.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/HeatmapFacetCounterTest.java Thu Oct 1 03:26:00 2015
@@ -31,12 +31,12 @@ import com.spatial4j.core.shape.Rectangl
import com.spatial4j.core.shape.Shape;
import com.spatial4j.core.shape.SpatialRelation;
import com.spatial4j.core.shape.impl.RectangleImpl;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.Query;
import org.apache.lucene.search.TotalHitCountCollector;
import org.apache.lucene.spatial.StrategyTestCase;
import org.apache.lucene.spatial.prefix.tree.QuadPrefixTree;
import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
+import org.apache.lucene.util.Bits;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -185,7 +185,7 @@ public class HeatmapFacetCounterTest ext
// coincides with a grid line due due to edge overlap issue for some grid implementations (geo & quad).
return false;
}
- Filter filter = null; //FYI testing filtering of underlying PrefixTreeFacetCounter is done in another test
+ Bits filter = null; //FYI testing filtering of underlying PrefixTreeFacetCounter is done in another test
//Calculate facets
final int maxCells = 10_000;
final HeatmapFacetCounter.Heatmap heatmap = HeatmapFacetCounter.calcFacets(
@@ -232,7 +232,7 @@ public class HeatmapFacetCounterTest ext
private int countMatchingDocsAtLevel(Point pt, int facetLevel) throws IOException {
// we use IntersectsPrefixTreeFilter directly so that we can specify the level to go to exactly.
RecursivePrefixTreeStrategy strategy = (RecursivePrefixTreeStrategy) this.strategy;
- Filter filter = new IntersectsPrefixTreeFilter(
+ Query filter = new IntersectsPrefixTreeQuery(
pt, strategy.getFieldName(), grid, facetLevel, grid.getMaxLevels());
final TotalHitCountCollector collector = new TotalHitCountCollector();
indexSearcher.search(filter, collector);
Modified: lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/NumberRangeFacetsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/NumberRangeFacetsTest.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/NumberRangeFacetsTest.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/NumberRangeFacetsTest.java Thu Oct 1 03:26:00 2015
@@ -25,10 +25,11 @@ import java.util.List;
import com.carrotsearch.randomizedtesting.annotations.Repeat;
import com.spatial4j.core.shape.Shape;
+import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.queries.TermsQuery;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.search.QueryWrapperFilter;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.SimpleCollector;
import org.apache.lucene.spatial.StrategyTestCase;
import org.apache.lucene.spatial.prefix.NumberRangePrefixTreeStrategy.Facets;
import org.apache.lucene.spatial.prefix.tree.Cell;
@@ -36,6 +37,8 @@ import org.apache.lucene.spatial.prefix.
import org.apache.lucene.spatial.prefix.tree.DateRangePrefixTree;
import org.apache.lucene.spatial.prefix.tree.NumberRangePrefixTree;
import org.apache.lucene.spatial.prefix.tree.NumberRangePrefixTree.UnitNRShape;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.FixedBitSet;
import org.junit.Before;
import org.junit.Test;
@@ -110,8 +113,8 @@ public class NumberRangeFacetsTest exten
detailLevel = -1 * detailLevel;
}
- //Randomly pick a filter
- Filter filter = null;
+ //Randomly pick a filter/acceptDocs
+ Bits topAcceptDocs = null;
List<Integer> acceptFieldIds = new ArrayList<>();
if (usually()) {
//get all possible IDs into a list, random shuffle it, then randomly choose how many of the first we use to
@@ -129,21 +132,22 @@ public class NumberRangeFacetsTest exten
for (Integer acceptDocId : acceptFieldIds) {
terms.add(new Term("id", acceptDocId.toString()));
}
- filter = new QueryWrapperFilter(new TermsQuery(terms));
+
+ topAcceptDocs = searchForDocBits(new TermsQuery(terms));
}
}
//Lets do it!
NumberRangePrefixTree.NRShape facetRange = tree.toRangeShape(tree.toShape(leftCal), tree.toShape(rightCal));
Facets facets = ((NumberRangePrefixTreeStrategy) strategy)
- .calcFacets(indexSearcher.getTopReaderContext(), filter, facetRange, detailLevel);
+ .calcFacets(indexSearcher.getTopReaderContext(), topAcceptDocs, facetRange, detailLevel);
//System.out.println("Q: " + queryIdx + " " + facets);
//Verify results. We do it by looping over indexed shapes and reducing the facet counts.
Shape facetShapeRounded = facetRange.roundToLevel(detailLevel);
for (int indexedShapeId = 0; indexedShapeId < indexedShapes.size(); indexedShapeId++) {
- if (filter != null && !acceptFieldIds.contains(indexedShapeId)) {
+ if (topAcceptDocs != null && !acceptFieldIds.contains(indexedShapeId)) {
continue;// this doc was filtered out via acceptDocs
}
Shape indexedShape = indexedShapes.get(indexedShapeId);
@@ -207,6 +211,29 @@ public class NumberRangeFacetsTest exten
}
}
+ private Bits searchForDocBits(Query query) throws IOException {
+ FixedBitSet bitSet = new FixedBitSet(indexSearcher.getIndexReader().maxDoc());
+ indexSearcher.search(query,
+ new SimpleCollector() {
+ int leafDocBase;
+ @Override
+ public void collect(int doc) throws IOException {
+ bitSet.set(leafDocBase + doc);
+ }
+
+ @Override
+ protected void doSetNextReader(LeafReaderContext context) throws IOException {
+ leafDocBase = context.docBase;
+ }
+
+ @Override
+ public boolean needsScores() {
+ return false;
+ }
+ });
+ return bitSet;
+ }
+
private void preQueryHavoc() {
if (strategy instanceof RecursivePrefixTreeStrategy) {
RecursivePrefixTreeStrategy rpts = (RecursivePrefixTreeStrategy) strategy;
Modified: lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java Thu Oct 1 03:26:00 2015
@@ -153,7 +153,7 @@ public class RandomSpatialOpFuzzyPrefixT
doTest(SpatialOperation.Contains);
}
- /** See LUCENE-5062, {@link ContainsPrefixTreeFilter#multiOverlappingIndexedShapes}. */
+ /** See LUCENE-5062, {@link ContainsPrefixTreeQuery#multiOverlappingIndexedShapes}. */
@Test
public void testContainsPairOverlap() throws IOException {
setupQuadGrid(3, randomBoolean());
Modified: lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/serialized/SerializedStrategyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/serialized/SerializedStrategyTest.java?rev=1706181&r1=1706180&r2=1706181&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/serialized/SerializedStrategyTest.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/test/org/apache/lucene/spatial/serialized/SerializedStrategyTest.java Thu Oct 1 03:26:00 2015
@@ -17,16 +17,14 @@ package org.apache.lucene.spatial.serial
* limitations under the License.
*/
+import java.io.IOException;
+
import com.spatial4j.core.context.SpatialContext;
-import org.apache.lucene.search.Query;
import org.apache.lucene.spatial.SpatialMatchConcern;
-import org.apache.lucene.spatial.SpatialTestQuery;
import org.apache.lucene.spatial.StrategyTestCase;
import org.junit.Before;
import org.junit.Test;
-import java.io.IOException;
-
public class SerializedStrategyTest extends StrategyTestCase {
@Before
@@ -42,12 +40,6 @@ public class SerializedStrategyTest exte
return (strategy instanceof SerializedDVStrategy);
}
- //called by StrategyTestCase; we can't let it call our makeQuery which will UOE ex.
- @Override
- protected Query makeQuery(SpatialTestQuery q) {
- return strategy.makeFilter(q.args);
- }
-
@Test
public void testBasicOperaions() throws IOException {
getAddAndVerifyIndexedDocuments(DATA_SIMPLE_BBOX);