org.apache.lucene.search.spans.Spans.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.lucene.search.spans.Spans.java

Source

/*
 * 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 {
    }

}