Index: CHANGES.txt =================================================================== --- CHANGES.txt (revision 888322) +++ CHANGES.txt (working copy) @@ -70,6 +70,11 @@ lots of seeking (Mike McCandless, Uwe Schindler, Robert Muir, Yonik Seeley) +* LUCENE-2136: If the multi reader (DirectoryReader or MultiReader) + only has a single sub-reader, delegate all enum requests to it. + This avoid the overhead of using a PQ unecessarily. (Mike + McCandless) + Build Test Cases Index: src/java/org/apache/lucene/index/MultiReader.java =================================================================== --- src/java/org/apache/lucene/index/MultiReader.java (revision 888322) +++ src/java/org/apache/lucene/index/MultiReader.java (working copy) @@ -339,13 +339,23 @@ @Override public TermEnum terms() throws IOException { ensureOpen(); - return new MultiTermEnum(this, subReaders, starts, null); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].terms(); + } else { + return new MultiTermEnum(this, subReaders, starts, null); + } } @Override public TermEnum terms(Term term) throws IOException { ensureOpen(); - return new MultiTermEnum(this, subReaders, starts, term); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].terms(term); + } else { + return new MultiTermEnum(this, subReaders, starts, term); + } } @Override @@ -360,13 +370,34 @@ @Override public TermDocs termDocs() throws IOException { ensureOpen(); - return new MultiTermDocs(this, subReaders, starts); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].termDocs(); + } else { + return new MultiTermDocs(this, subReaders, starts); + } } @Override + public TermDocs termDocs(Term term) throws IOException { + ensureOpen(); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].termDocs(term); + } else { + return super.termDocs(term); + } + } + + @Override public TermPositions termPositions() throws IOException { ensureOpen(); - return new MultiTermPositions(this, subReaders, starts); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].termPositions(); + } else { + return new MultiTermPositions(this, subReaders, starts); + } } @Override Index: src/java/org/apache/lucene/index/DirectoryReader.java =================================================================== --- src/java/org/apache/lucene/index/DirectoryReader.java (revision 888322) +++ src/java/org/apache/lucene/index/DirectoryReader.java (working copy) @@ -627,13 +627,23 @@ @Override public TermEnum terms() throws IOException { ensureOpen(); - return new MultiTermEnum(this, subReaders, starts, null); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].terms(); + } else { + return new MultiTermEnum(this, subReaders, starts, null); + } } @Override public TermEnum terms(Term term) throws IOException { ensureOpen(); - return new MultiTermEnum(this, subReaders, starts, term); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].terms(term); + } else { + return new MultiTermEnum(this, subReaders, starts, term); + } } @Override @@ -648,13 +658,34 @@ @Override public TermDocs termDocs() throws IOException { ensureOpen(); - return new MultiTermDocs(this, subReaders, starts); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].termDocs(); + } else { + return new MultiTermDocs(this, subReaders, starts); + } } @Override + public TermDocs termDocs(Term term) throws IOException { + ensureOpen(); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].termDocs(term); + } else { + return super.termDocs(term); + } + } + + @Override public TermPositions termPositions() throws IOException { ensureOpen(); - return new MultiTermPositions(this, subReaders, starts); + if (subReaders.length == 1) { + // Optimize single segment case: + return subReaders[0].termPositions(); + } else { + return new MultiTermPositions(this, subReaders, starts); + } } /**