+++ /dev/null
-package org.apache.lucene.store.instantiated;
-
-/**
- * Copyright 2006 The Apache Software Foundation
- *
- * Licensed 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.
- */
-
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermDocs;
-
-/**
- * A {@link org.apache.lucene.index.TermDocs} navigating an {@link InstantiatedIndexReader}.
- */
-public class InstantiatedTermDocs
- implements TermDocs {
-
- private final InstantiatedIndexReader reader;
-
- public InstantiatedTermDocs(InstantiatedIndexReader reader) {
- this.reader = reader;
- }
-
- private int currentDocumentIndex;
- protected InstantiatedTermDocumentInformation currentDocumentInformation;
- protected InstantiatedTerm currentTerm;
-
-
- public void seek(Term term) {
- currentTerm = reader.getIndex().findTerm(term);
- currentDocumentIndex = -1;
- }
-
- public void seek(org.apache.lucene.index.TermEnum termEnum) {
- seek(termEnum.term());
- }
-
-
- public int doc() {
- return currentDocumentInformation.getDocument().getDocumentNumber();
- }
-
- public int freq() {
- return currentDocumentInformation.getTermPositions().length;
- }
-
-
- public boolean next() {
- if (currentTerm != null) {
- currentDocumentIndex++;
- if (currentDocumentIndex < currentTerm.getAssociatedDocuments().length) {
- currentDocumentInformation = currentTerm.getAssociatedDocuments()[currentDocumentIndex];
- if (reader.isDeleted(currentDocumentInformation.getDocument().getDocumentNumber())) {
- return next();
- } else {
- return true;
- }
- } else {
- // mimic SegmentTermDocs
- currentDocumentIndex = currentTerm.getAssociatedDocuments().length -1;
- }
- }
- return false;
- }
-
-
- public int read(int[] docs, int[] freqs) {
- int i;
- for (i = 0; i < docs.length; i++) {
- if (!next()) {
- break;
- }
- docs[i] = doc();
- freqs[i] = freq();
- }
- return i;
- }
-
- /**
- * Skips entries to the first beyond the current whose document number is
- * greater than or equal to <i>target</i>. <p>Returns true if there is such
- * an entry. <p>Behaves as if written: <pre>
- * boolean skipTo(int target) {
- * do {
- * if (!next())
- * return false;
- * } while (target > doc());
- * return true;
- * }
- * </pre>
- * This implementation is considerably more efficient than that.
- *
- */
- public boolean skipTo(int target) {
- if (currentTerm == null) {
- return false;
- }
-
- if (currentDocumentIndex >= target) {
- return next();
- }
-
- int startOffset = currentDocumentIndex >= 0 ? currentDocumentIndex : 0;
- int pos = currentTerm.seekCeilingDocumentInformationIndex(target, startOffset);
-
- if (pos == -1) {
- // mimic SegmentTermDocs that positions at the last index
- currentDocumentIndex = currentTerm.getAssociatedDocuments().length -1;
- return false;
- }
-
- currentDocumentInformation = currentTerm.getAssociatedDocuments()[pos];
- currentDocumentIndex = pos;
- if (reader.hasDeletions() && reader.isDeleted(currentDocumentInformation.getDocument().getDocumentNumber())) {
- return next();
- } else {
- return true;
- }
- }
-
- /**
- * Does nothing
- */
- public void close() {
- }
-}