MtasSpanPositionSpans.java
package mtas.search.spans;
import java.io.IOException;
import mtas.codec.util.CodecInfo;
import mtas.codec.util.CodecInfo.IndexDoc;
import mtas.search.spans.util.MtasSpans;
import org.apache.lucene.search.TwoPhaseIterator;
import org.apache.lucene.search.spans.SpanCollector;
/**
* The Class MtasSpanPositionSpans.
*/
public class MtasSpanPositionSpans extends MtasSpans {
/** The query. */
private MtasSpanPositionQuery query;
/** The field. */
private String field;
/** The start. */
private int start;
/** The end. */
private int end;
/** The min position. */
private int minPosition;
/** The max position. */
private int maxPosition;
/** The current start position. */
private int currentStartPosition;
/** The current end position. */
private int currentEndPosition;
/** The doc id. */
private int docId;
/** The mtas codec info. */
private CodecInfo mtasCodecInfo;
/**
* Instantiates a new mtas span position spans.
*
* @param query the query
* @param mtasCodecInfo the mtas codec info
* @param field the field
* @param start the start
* @param end the end
*/
public MtasSpanPositionSpans(MtasSpanPositionQuery query,
CodecInfo mtasCodecInfo, String field, int start, int end) {
super();
this.query = query;
this.mtasCodecInfo = mtasCodecInfo;
this.field = field;
this.start = start;
this.end = end;
minPosition = NO_MORE_POSITIONS;
maxPosition = NO_MORE_POSITIONS;
currentStartPosition = NO_MORE_POSITIONS;
currentEndPosition = NO_MORE_POSITIONS;
docId = -1;
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.spans.Spans#nextStartPosition()
*/
@Override
public int nextStartPosition() throws IOException {
if (currentStartPosition < minPosition) {
currentStartPosition = minPosition;
currentEndPosition = currentStartPosition + 1;
} else {
currentStartPosition++;
currentEndPosition = currentStartPosition + 1;
if (currentStartPosition > maxPosition) {
currentStartPosition = NO_MORE_POSITIONS;
currentEndPosition = NO_MORE_POSITIONS;
}
}
return currentStartPosition;
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.spans.Spans#startPosition()
*/
@Override
public int startPosition() {
return currentStartPosition;
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.spans.Spans#endPosition()
*/
@Override
public int endPosition() {
return currentEndPosition;
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.spans.Spans#width()
*/
@Override
public int width() {
return 1;
}
/*
* (non-Javadoc)
*
* @see
* org.apache.lucene.search.spans.Spans#collect(org.apache.lucene.search.spans
* .SpanCollector)
*/
@Override
public void collect(SpanCollector collector) throws IOException {
// don't do anything
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.DocIdSetIterator#docID()
*/
@Override
public int docID() {
return docId;
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.DocIdSetIterator#nextDoc()
*/
@Override
public int nextDoc() throws IOException {
do {
IndexDoc indexDoc = mtasCodecInfo.getNextDoc(field, docId);
if (indexDoc != null) {
docId = indexDoc.docId;
minPosition = Math.max(start, indexDoc.minPosition);
maxPosition = Math.min(end, indexDoc.maxPosition);
currentStartPosition = -1;
currentEndPosition = -1;
} else {
docId = NO_MORE_DOCS;
minPosition = NO_MORE_POSITIONS;
maxPosition = NO_MORE_POSITIONS;
currentStartPosition = NO_MORE_POSITIONS;
currentEndPosition = NO_MORE_POSITIONS;
}
} while (docId != NO_MORE_DOCS && (minPosition > maxPosition));
return docId;
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.DocIdSetIterator#advance(int)
*/
@Override
public int advance(int target) throws IOException {
int tmpTarget = target - 1;
do {
IndexDoc indexDoc = mtasCodecInfo.getNextDoc(field, tmpTarget);
if (indexDoc != null) {
docId = indexDoc.docId;
minPosition = Math.max(start, indexDoc.minPosition);
maxPosition = Math.min(end, indexDoc.maxPosition);
currentStartPosition = -1;
currentEndPosition = -1;
} else {
docId = NO_MORE_DOCS;
minPosition = NO_MORE_POSITIONS;
maxPosition = NO_MORE_POSITIONS;
currentStartPosition = NO_MORE_POSITIONS;
currentEndPosition = NO_MORE_POSITIONS;
}
tmpTarget = docId;
} while (docId != NO_MORE_DOCS && minPosition > maxPosition);
return docId;
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.DocIdSetIterator#cost()
*/
@Override
public long cost() {
return mtasCodecInfo.getNumberOfDocs(field);
}
/*
* (non-Javadoc)
*
* @see org.apache.lucene.search.spans.Spans#positionsCost()
*/
@Override
public float positionsCost() {
return 0;
}
/*
* (non-Javadoc)
*
* @see mtas.search.spans.util.MtasSpans#asTwoPhaseIterator()
*/
@Override
public TwoPhaseIterator asTwoPhaseIterator() {
if (!query.twoPhaseIteratorAllowed()) {
return null;
} else {
// TODO
return null;
}
}
}