blob: f776e5053c57a3367008ede5f2c294a78eb75a33 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.search.spans;
import java.io.IOException;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.TwoPhaseIterator;
/** Iterates through combinations of start/end positions per-doc.
* Each start/end position represents a range of term positions within the current document.
* These are enumerated in order, by increasing document number, within that by
* increasing start position and finally by increasing end position.
*/
public abstract class Spans extends DocIdSetIterator {
public static final int NO_MORE_POSITIONS = Integer.MAX_VALUE;
/**
* Returns the next start position for the current doc.
* There is always at least one start/end position per doc.
* After the last start/end position at the current doc this returns {@link #NO_MORE_POSITIONS}.
*/
public abstract int nextStartPosition() throws IOException;
/**
* Returns the start position in the current doc, or -1 when {@link #nextStartPosition} was not yet called on the current doc.
* After the last start/end position at the current doc this returns {@link #NO_MORE_POSITIONS}.
*/
public abstract int startPosition();
/**
* Returns the end position for the current start position, or -1 when {@link #nextStartPosition} was not yet called on the current doc.
* After the last start/end position at the current doc this returns {@link #NO_MORE_POSITIONS}.
*/
public abstract int endPosition();
/**
* Return the width of the match, which is typically used to sloppy freq. It is only legal
* to call this method when the iterator is on a valid doc ID and positioned.
* The return value must be positive, and lower values means that the match is
* better.
*/
public abstract int width();
/**
* Collect postings data from the leaves of the current Spans.
*
* This method should only be called after {@link #nextStartPosition()}, and before
* {@link #NO_MORE_POSITIONS} has been reached.
*
* @param collector a SpanCollector
*
* @lucene.experimental
*/
public abstract void collect(SpanCollector collector) throws IOException;
/**
* Return an estimation of the cost of using the positions of
* this {@link Spans} for any single document, but only after
* {@link #asTwoPhaseIterator} returned {@code null}.
* Otherwise this method should not be called.
* The returned value is independent of the current document.
*
* @lucene.experimental
*/
public abstract float positionsCost();
/**
* Optional method: Return a {@link TwoPhaseIterator} view of this
* {@link Scorer}. A return value of {@code null} indicates that
* two-phase iteration is not supported.
* @see Scorer#twoPhaseIterator()
*/
public TwoPhaseIterator asTwoPhaseIterator() {
return null;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Class<? extends Spans> clazz = getClass();
sb.append(clazz.isAnonymousClass() ? clazz.getName() : clazz.getSimpleName());
sb.append("(doc=").append(docID());
sb.append(",start=").append(startPosition());
sb.append(",end=").append(endPosition());
sb.append(")");
return sb.toString();
}
/**
* Called before the current doc's frequency is calculated
*/
protected void doStartCurrentDoc() throws IOException {}
/**
* Called each time the scorer's SpanScorer is advanced during frequency calculation
*/
protected void doCurrentSpans() throws IOException {}
}