Index: lucene/src/java/org/apache/lucene/index/ParallelReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/ParallelReader.java (revision 1239141) +++ lucene/src/java/org/apache/lucene/index/ParallelReader.java (working copy) @@ -21,10 +21,9 @@ import java.util.*; import org.apache.lucene.util.Bits; -import org.apache.lucene.util.BytesRef; -/** An AtomicIndexReader which reads multiple, parallel indexes. Each index added +/** An {@link AtomicReader} which reads multiple, parallel indexes. Each index added * must have the same number of documents, but typically each contains * different fields. Each document contains the union of the fields of all * documents with the same document number. When searching, matches for a @@ -42,48 +41,42 @@ * undefined behavior. */ public class ParallelReader extends AtomicReader { - private List readers = new ArrayList(); - private List decrefOnClose = new ArrayList(); // remember which subreaders to decRef on close - boolean incRefReaders = false; - private SortedMap fieldToReader = new TreeMap(); - private Map> readerToFields = new HashMap>(); - private List storedFieldReaders = new ArrayList(); - private Map normsCache = new HashMap(); - private int maxDoc; - private int numDocs; - private boolean hasDeletions; - private final FieldInfos fieldInfos; - + private final FieldInfos fieldInfos = new FieldInfos(); private final ParallelFields fields = new ParallelFields(); + private final List readers = new ArrayList(); + private final List decrefOnClose = new ArrayList(); // remember which subreaders to decRef on close + private final boolean incRefReaders; + final SortedMap fieldToReader = new TreeMap(); + private final List storedFieldReaders = new ArrayList(); + private final Map normsCache = new HashMap(); + private int maxDoc = 0; + private int numDocs = 0; + private boolean hasDeletions = false; /** Construct a ParallelReader. *

Note that all subreaders are closed if this ParallelReader is closed.

*/ - public ParallelReader() throws IOException { this(true); } + public ParallelReader() throws IOException { + this(true); + } /** Construct a ParallelReader. * @param closeSubReaders indicates whether the subreaders should be closed * when this ParallelReader is closed */ public ParallelReader(boolean closeSubReaders) throws IOException { - super(); this.incRefReaders = !closeSubReaders; - fieldInfos = new FieldInfos(); } /** {@inheritDoc} */ @Override public String toString() { final StringBuilder buffer = new StringBuilder("ParallelReader("); - final Iterator iter = readers.iterator(); - if (iter.hasNext()) { + for (final Iterator iter = readers.iterator(); iter.hasNext();) { buffer.append(iter.next()); + if (iter.hasNext()) buffer.append(", "); } - while (iter.hasNext()) { - buffer.append(", ").append(iter.next()); - } - buffer.append(')'); - return buffer.toString(); + return buffer.append(')').toString(); } /** Add an AtomicIndexReader. @@ -104,11 +97,9 @@ * of {@link AtomicReader#maxDoc()} * @throws IOException if there is a low-level IO error */ - public void add(AtomicReader reader, boolean ignoreStoredFields) - throws IOException { - + public void add(AtomicReader reader, boolean ignoreStoredFields) throws IOException { ensureOpen(); - if (readers.size() == 0) { + if (readers.isEmpty()) { this.maxDoc = reader.maxDoc(); this.numDocs = reader.numDocs(); this.hasDeletions = reader.hasDeletions(); @@ -121,7 +112,7 @@ throw new IllegalArgumentException ("All readers must have same numDocs: "+numDocs+"!="+reader.numDocs()); - final FieldInfos readerFieldInfos = MultiFields.getMergedFieldInfos(reader); + final FieldInfos readerFieldInfos = reader.getFieldInfos(); for(FieldInfo fieldInfo : readerFieldInfos) { // update fieldToReader map // NOTE: first reader having a given field "wins": if (fieldToReader.get(fieldInfo.name) == null) { @@ -144,9 +135,9 @@ } } - private class ParallelFieldsEnum extends FieldsEnum { - String currentField; - Iterator keys; + private final class ParallelFieldsEnum extends FieldsEnum { + private String currentField; + private final Iterator keys; private final Fields fields; ParallelFieldsEnum(Fields fields) { @@ -172,10 +163,13 @@ } // Single instance of this, per ParallelReader instance - private class ParallelFields extends Fields { + private final class ParallelFields extends Fields { final HashMap fields = new HashMap(); - public void addField(String fieldName, Terms terms) throws IOException { + ParallelFields() { + } + + void addField(String fieldName, Terms terms) throws IOException { fields.put(fieldName, terms); } @@ -203,7 +197,7 @@ @Override public Bits getLiveDocs() { ensureOpen(); - return readers.get(0).getLiveDocs(); + return readers.isEmpty() ? null : readers.get(0).getLiveDocs(); } @Override @@ -261,11 +255,6 @@ return reader==null ? false : reader.hasNorms(field); } - // for testing - AtomicReader[] getSubReaders() { - return readers.toArray(new AtomicReader[readers.size()]); - } - @Override protected synchronized void doClose() throws IOException { for (int i = 0; i < readers.size(); i++) { @@ -280,6 +269,7 @@ // TODO: I suspect this is completely untested!!!!! @Override public DocValues docValues(String field) throws IOException { + ensureOpen(); AtomicReader reader = fieldToReader.get(field); return reader == null ? null : reader.docValues(field); } @@ -287,6 +277,7 @@ // TODO: I suspect this is completely untested!!!!! @Override public synchronized DocValues normValues(String field) throws IOException { + ensureOpen(); DocValues values = normsCache.get(field); if (values == null) { AtomicReader reader = fieldToReader.get(field);