package org.apache.lucene.util; /** * Copyright 2005 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. */ /** * Skips along two docNrSkipper sets where either sets has an entry * @author maharwood */ public class OrDocNrSkipper implements DocNrSkipper { DocNrSkipper listA,listB; int aDoc=Integer.MIN_VALUE; int bDoc=Integer.MIN_VALUE; int lastDocNrLookup=Integer.MIN_VALUE; public OrDocNrSkipper(DocNrSkipper listA,DocNrSkipper listB) { this.listA=listA; this.listB=listB; } public int nextDocNr(int docNr) { //Only call nextDocNr if necessary.... if((docNr>lastDocNrLookup)&&(aDoc>=docNr)) { //no need to advance listA - already positioned } else { aDoc=listA.nextDocNr(docNr); //advance A } if((docNr>lastDocNrLookup)&&(bDoc>=docNr)) { //no need to advance listB - already positioned } else { bDoc=listB.nextDocNr(docNr); //advance B } lastDocNrLookup=docNr;//save the docNr if(aDoc==bDoc) { return aDoc; //both same -return } //a!=b so return smaller of two (but remember -1 indicates end of set) if(aDoc>=0) { if(bDoc<0) { return aDoc; //B is at end - return A } if(aDoc