All Downloads are FREE. Search and download functionalities are using the official Maven repository.

lux.search.DocIterator Maven / Gradle / Ivy

There is a newer version: 1.1.0
Show newest version
package lux.search;

import java.io.IOException;
import java.util.List;

import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.Weight;

/**
 * Used to return results that are sorted in document order, or unordered.
 */
public class DocIterator extends DocIdSetIterator {
      
    private final LuxSearcher luxSearcher;
    private final Weight weight;
    private final boolean ordered;
    private int nextReader;
    private int docID;
    private Scorer scorer;
    private List leaves;
    private AtomicReaderContext leaf;
      
    /**
     * @param query the lucene query whose results will be iterated
     * @param ordered whether the docs must be scored in order
     * @param luxSearcher TODO
     * @throws IOException
     */
    DocIterator (LuxSearcher luxSearcher, Query query, boolean ordered) throws IOException {
        this.luxSearcher = luxSearcher;
        weight = this.luxSearcher.createNormalizedWeight(query);
        leaves = this.luxSearcher.getIndexReader().leaves();
        this.ordered = ordered;
        nextReader = 0;
        docID = -1;
        advanceScorer();
    }

    private void advanceScorer () throws IOException {
        while (nextReader < leaves.size()) {
            leaf = leaves.get(nextReader++);
            scorer = weight.scorer(leaf, ordered, false, leaf.reader().getLiveDocs()); // NB: arg 3 (topScorer) was 'true' prior to 4.1 upgrade but incorrectly I think??
            if (scorer != null) {
                return;
            }
        }
        scorer = null;
    }
      
    @Override
    public int docID() {
        return docID;
    }

    /**
     * Note: this returns docIDs that must be interpreted relative to the current leaf reader:
     * these are not offset by the leaf.docBase.
     */
    @Override
    public int nextDoc() throws IOException {
        while (scorer != null) {
            docID = scorer.nextDoc();
            if (docID != NO_MORE_DOCS) {
                return docID;
            }
            advanceScorer();
        }
        return NO_MORE_DOCS;
    }

    @Override
    public int advance(int target) throws IOException {
        while (scorer != null) {
            docID = scorer.advance(target - leaf.docBase);
            if (docID != NO_MORE_DOCS) {
                return docID + leaf.docBase;
            }
            advanceScorer();
        }
        return NO_MORE_DOCS;
    }
      
    
    public AtomicReaderContext getCurrentReaderContext () {
        return leaf;
    }

    @Override
    public long cost() {
        return 0;
    }
 
}

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */




© 2015 - 2024 Weber Informatics LLC | Privacy Policy