LUCENE-6182: spatial refactor VisitorTemplate.visitScanned needn't be abstract.

And have collectDocs specify BitSet not FixedBitSet.  (these are internal APIs)

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1652154 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
David Wayne Smiley 2015-01-15 16:06:57 +00:00
parent 3a4cf1ca29
commit 4a17f23182
4 changed files with 49 additions and 59 deletions

View File

@ -17,23 +17,21 @@ package org.apache.lucene.spatial.prefix;
* limitations under the License.
*/
import java.io.IOException;
import com.spatial4j.core.shape.Shape;
import org.apache.lucene.index.DocsEnum;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.DocsEnum;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Filter;
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.FixedBitSet;
import java.io.IOException;
/**
* Base class for Lucene Filters on SpatialPrefixTree fields.
*
* @lucene.experimental
*/
public abstract class AbstractPrefixTreeFilter extends Filter {
@ -73,14 +71,15 @@ public abstract class AbstractPrefixTreeFilter extends Filter {
}
/** Holds transient state and docid collecting utility methods as part of
* traversing a {@link TermsEnum}. */
public abstract class BaseTermsEnumTraverser {
* 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 in getDocIdSet
protected TermsEnum termsEnum;//remember to check for null!
protected DocsEnum docsEnum;
public BaseTermsEnumTraverser(LeafReaderContext context, Bits acceptDocs) throws IOException {
@ -93,32 +92,12 @@ public abstract class AbstractPrefixTreeFilter extends Filter {
this.termsEnum = terms.iterator(null);
}
protected void collectDocs(FixedBitSet bitSet) throws IOException {
//WARN: keep this specialization in sync
protected void collectDocs(BitSet bitSet) throws IOException {
assert termsEnum != null;
docsEnum = termsEnum.docs(acceptDocs, docsEnum, DocsEnum.FLAG_NONE);
int docid;
while ((docid = docsEnum.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
bitSet.set(docid);
}
bitSet.or(docsEnum);
}
/* Eventually uncomment when needed.
protected void collectDocs(Collector collector) throws IOException {
//WARN: keep this specialization in sync
assert termsEnum != null;
docsEnum = termsEnum.docs(acceptDocs, docsEnum, DocsEnum.FLAG_NONE);
int docid;
while ((docid = docsEnum.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
collector.collect(docid);
}
}
public abstract class Collector {
abstract void collect(int docid) throws IOException;
}
*/
}
}

View File

@ -17,6 +17,9 @@ package org.apache.lucene.spatial.prefix;
* limitations under the License.
*/
import java.io.IOException;
import java.util.Iterator;
import com.spatial4j.core.shape.Shape;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.TermsEnum;
@ -27,9 +30,6 @@ import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import java.io.IOException;
import java.util.Iterator;
/**
* Traverses a {@link SpatialPrefixTree} indexed field, using the template and
* visitor design patterns for subclasses to guide the traversal and collect
@ -326,17 +326,21 @@ public abstract class AbstractVisitingPrefixTreeFilter extends AbstractPrefixTre
protected abstract DocIdSet finish() throws IOException;
/**
* Visit an indexed cell returned from
* {@link #findSubCellsToVisit(org.apache.lucene.spatial.prefix.tree.Cell)}.
* Visit an indexed non-leaf cell returned from
* {@link #findSubCellsToVisit(org.apache.lucene.spatial.prefix.tree.Cell)}
* that is also found in the index.
* It will also be called by the default implementation of
* {@link #visitScanned(org.apache.lucene.spatial.prefix.tree.Cell)} for
* cells at the bottom detail level.
*
* @param cell An intersecting cell.
* @param cell An intersecting cell; not a leaf.
* @return true to descend to more levels. It is an error to return true
* if cell.level == detailLevel
*/
protected abstract boolean visit(Cell cell) throws IOException;
/**
* Called after visit() returns true and an indexed leaf cell is found. An
* Called when an indexed leaf cell is found. An
* indexed leaf cell means associated documents generally won't be found at
* further detail levels.
*/
@ -345,8 +349,19 @@ public abstract class AbstractVisitingPrefixTreeFilter extends AbstractPrefixTre
/**
* The cell is either indexed as a leaf or is the last level of detail. It
* might not even intersect the query shape, so be sure to check for that.
* The default implementation will check that and if passes then call
* {@link #visitLeaf(org.apache.lucene.spatial.prefix.tree.Cell)} or
* {@link #visit(org.apache.lucene.spatial.prefix.tree.Cell)}.
*/
protected abstract void visitScanned(Cell cell) throws IOException;
protected void visitScanned(Cell cell) throws IOException {
if (queryShape.relate(cell.getShape()).intersects()) {
if (cell.isLeaf()) {
visitLeaf(cell);
} else {
visit(cell);
}
}
}
protected void preSiblings(VNode vNode) throws IOException {
}

View File

@ -17,19 +17,18 @@ package org.apache.lucene.spatial.prefix;
* limitations under the License.
*/
import java.io.IOException;
import com.spatial4j.core.shape.Shape;
import com.spatial4j.core.shape.SpatialRelation;
import org.apache.lucene.index.LeafReaderContext;
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.Bits;
import org.apache.lucene.util.BitDocIdSet;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.FixedBitSet;
import java.io.IOException;
/**
* A Filter matching documents that have an {@link SpatialRelation#INTERSECTS}
* (i.e. not DISTINCT) relationship with a provided query shape.
@ -90,12 +89,6 @@ public class IntersectsPrefixTreeFilter extends AbstractVisitingPrefixTreeFilter
collectDocs(results);
}
@Override
protected void visitScanned(Cell cell) throws IOException {
if (queryShape.relate(cell.getShape()).intersects())
collectDocs(results);
}
}.getDocIdSet();
}

View File

@ -19,15 +19,6 @@ package org.apache.lucene.spatial.prefix;
import java.io.IOException;
import org.apache.lucene.index.LeafReaderContext;
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.BitDocIdSet;
import org.apache.lucene.util.FixedBitSet;
import com.spatial4j.core.context.SpatialContext;
import com.spatial4j.core.distance.DistanceUtils;
import com.spatial4j.core.shape.Circle;
@ -35,6 +26,14 @@ import com.spatial4j.core.shape.Point;
import com.spatial4j.core.shape.Rectangle;
import com.spatial4j.core.shape.Shape;
import com.spatial4j.core.shape.SpatialRelation;
import org.apache.lucene.index.LeafReaderContext;
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.BitDocIdSet;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.FixedBitSet;
/**
* Finds docs where its indexed shape is {@link org.apache.lucene.spatial.query.SpatialOperation#IsWithin
@ -165,7 +164,10 @@ public class WithinPrefixTreeFilter extends AbstractVisitingPrefixTreeFilter {
@Override
protected void visitLeaf(Cell cell) throws IOException {
//visitRelation is declared as a field, populated by visit() so we don't recompute it
//visitRelation is declared as a field, populated by visit() so we don't recompute it.
// We have a specialized visitScanned() which doesn't call this. If we didn't, we would
// not be able to assume visitRelation is from a prior visit() call since in scanning,
// parent cells aren't visited.
assert detailLevel != cell.getLevel();
assert visitRelation == cell.getShape().relate(queryShape);
if (allCellsIntersectQuery(cell, visitRelation))
@ -199,6 +201,7 @@ public class WithinPrefixTreeFilter extends AbstractVisitingPrefixTreeFilter {
@Override
protected void visitScanned(Cell cell) throws IOException {
//slightly optimize over default impl; required for our 'visitRelation' field re-use above
if (allCellsIntersectQuery(cell, null)) {
collectDocs(inside);
} else {