add --shared
[pylucene.git] / lucene-java-3.4.0 / lucene / src / java / org / apache / lucene / search / FilteredDocIdSetIterator.java
1 package org.apache.lucene.search;
2
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import java.io.IOException;
21
22 /**
23  * Abstract decorator class of a DocIdSetIterator
24  * implementation that provides on-demand filter/validation
25  * mechanism on an underlying DocIdSetIterator.  See {@link
26  * FilteredDocIdSet}.
27  */
28 public abstract class FilteredDocIdSetIterator extends DocIdSetIterator {
29   protected DocIdSetIterator _innerIter;
30   private int doc;
31         
32   /**
33    * Constructor.
34    * @param innerIter Underlying DocIdSetIterator.
35    */
36   public FilteredDocIdSetIterator(DocIdSetIterator innerIter) {
37     if (innerIter == null) {
38       throw new IllegalArgumentException("null iterator");
39     }
40     _innerIter = innerIter;
41     doc = -1;
42   }
43         
44   /**
45    * Validation method to determine whether a docid should be in the result set.
46    * @param doc docid to be tested
47    * @return true if input docid should be in the result set, false otherwise.
48    * @see #FilteredDocIdSetIterator(DocIdSetIterator)
49    */
50   abstract protected boolean match(int doc) throws IOException;
51         
52   @Override
53   public int docID() {
54     return doc;
55   }
56   
57   @Override
58   public int nextDoc() throws IOException {
59     while ((doc = _innerIter.nextDoc()) != NO_MORE_DOCS) {
60       if (match(doc)) {
61         return doc;
62       }
63     }
64     return doc;
65   }
66   
67   @Override
68   public int advance(int target) throws IOException {
69     doc = _innerIter.advance(target);
70     if (doc != NO_MORE_DOCS) {
71       if (match(doc)) {
72         return doc;
73       } else {
74         while ((doc = _innerIter.nextDoc()) != NO_MORE_DOCS) {
75           if (match(doc)) {
76             return doc;
77           }
78         }
79         return doc;
80       }
81     }
82     return doc;
83   }
84   
85 }