You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2016/03/12 01:27:14 UTC

[33/50] [abbrv] lucene-solr git commit: LUCENE-7086: move SlowCompositeReaderWrapper to misc module, and throw clear exc if you try to use in with points

LUCENE-7086: move SlowCompositeReaderWrapper to misc module, and throw clear exc if you try to use in with points

Squashed commits:

commit e26b065c71388407bc6725256ca43d7bb30dee29
Author: Mike McCandless <mi...@apache.org>
Date:   Thu Mar 10 14:16:45 2016 -0500

    simplify the checking for incoming points

commit b7254376dcb398c7739aab4544118bb4526961d5
Merge: 8ec82a0 d35d569
Author: Mike McCandless <mi...@apache.org>
Date:   Thu Mar 10 14:05:24 2016 -0500

    Merge branch 'master' into slow_wrapper

    Conflicts:
    	lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCache.java
    	lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheReopen.java

commit 8ec82a0d9a0dd946d96da20962bb2ea95758edbe
Author: Mike McCandless <mi...@apache.org>
Date:   Thu Mar 10 13:56:25 2016 -0500

    LUCENE-7086: move SlowCompositeReaderWrapper to misc module


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/7523ca11
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/7523ca11
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/7523ca11

Branch: refs/heads/jira/SOLR-445
Commit: 7523ca116276fbcf03bfa630c859c4a58f77add4
Parents: 8cc978b
Author: Mike McCandless <mi...@apache.org>
Authored: Thu Mar 10 16:08:59 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Thu Mar 10 16:08:59 2016 -0500

----------------------------------------------------------------------
 .../lucene50/TestLucene50DocValuesFormat.java   |   2 +-
 .../classification/ClassificationTestBase.java  |   7 +-
 .../DocumentClassificationTestBase.java         |   4 +-
 .../classification/utils/DataSplitterTest.java  |   5 +-
 .../apache/lucene/index/CompositeReader.java    |   2 -
 .../org/apache/lucene/index/IndexReader.java    |   2 -
 .../org/apache/lucene/index/MultiDocValues.java |   6 +-
 .../index/SlowCompositeReaderWrapper.java       | 271 ------------------
 .../lucene54/TestLucene54DocValuesFormat.java   |   6 +-
 .../index/TestBinaryDocValuesUpdates.java       |  28 +-
 .../apache/lucene/index/TestCustomNorms.java    |   4 +-
 .../index/TestDemoParallelLeafReader.java       |  21 +-
 .../lucene/index/TestDirectoryReader.java       |   2 +-
 .../org/apache/lucene/index/TestDocValues.java  |  14 +-
 .../lucene/index/TestDocValuesIndexing.java     |  25 +-
 .../lucene/index/TestDocsAndPositions.java      |   4 +-
 .../apache/lucene/index/TestDocumentWriter.java |   2 +-
 .../apache/lucene/index/TestDuelingCodecs.java  |   4 +-
 .../index/TestExitableDirectoryReader.java      |  17 +-
 .../lucene/index/TestFilterLeafReader.java      |   8 +-
 .../test/org/apache/lucene/index/TestFlex.java  |   2 +-
 .../lucene/index/TestIndexReaderClose.java      |  52 +---
 .../apache/lucene/index/TestIndexWriter.java    |   6 +-
 .../lucene/index/TestLazyProxSkipping.java      |   2 +-
 .../apache/lucene/index/TestMultiDocValues.java |  16 +-
 .../lucene/index/TestMultiLevelSkipList.java    |   2 +-
 .../test/org/apache/lucene/index/TestNorms.java |   4 +-
 .../index/TestNumericDocValuesUpdates.java      |  30 +-
 .../org/apache/lucene/index/TestOmitNorms.java  |   8 +-
 .../apache/lucene/index/TestOmitPositions.java  |   2 +-
 .../org/apache/lucene/index/TestOmitTf.java     |   6 +-
 .../org/apache/lucene/index/TestOrdinalMap.java |   5 +-
 .../index/TestParallelCompositeReader.java      |  34 +--
 .../lucene/index/TestParallelLeafReader.java    |  28 +-
 .../index/TestParallelReaderEmptyIndex.java     |  22 +-
 .../lucene/index/TestParallelTermEnum.java      |   4 +-
 .../org/apache/lucene/index/TestPayloads.java   |  11 +-
 .../apache/lucene/index/TestPointValues.java    |   4 +-
 .../lucene/index/TestPostingsOffsets.java       |   5 +-
 .../apache/lucene/index/TestReaderClosed.java   |   6 +-
 .../index/TestReaderWrapperDVTypeCheck.java     |   5 +-
 .../lucene/index/TestSegmentTermEnum.java       |   2 +-
 .../apache/lucene/index/TestStressAdvance.java  |   2 +-
 .../org/apache/lucene/index/TestTermsEnum.java  |   6 +-
 .../lucene/search/TestDisjunctionMaxQuery.java  |   6 +-
 .../lucene/search/TestMinShouldMatch2.java      |   2 +-
 .../lucene/search/TestMultiPhraseEnum.java      |   8 +-
 .../apache/lucene/search/TestPhraseQuery.java   |   4 +-
 .../lucene/search/TestPositionIncrement.java    |  10 +-
 .../lucene/search/TestSimilarityProvider.java   |  11 +-
 .../apache/lucene/search/TestTermScorer.java    |   7 +-
 .../TestUsageTrackingFilterCachingPolicy.java   |  17 +-
 .../search/spans/TestFieldMaskingSpanQuery.java |  11 +-
 .../search/spans/TestNearSpansOrdered.java      |  29 +-
 .../lucene/search/spans/TestSpanCollection.java |   9 +-
 .../search/spans/TestSpanContainQuery.java      |   7 +-
 .../apache/lucene/search/spans/TestSpans.java   |  13 +-
 .../DefaultSortedSetDocValuesReaderState.java   |  55 +++-
 .../sortedset/TestSortedSetDocValuesFacets.java |  36 ---
 .../lucene/search/grouping/TestGrouping.java    |  12 +-
 .../apache/lucene/search/join/TestJoinUtil.java |   8 +-
 .../memory/TestMemoryIndexAgainstRAMDir.java    |  12 +-
 .../index/SlowCompositeReaderWrapper.java       | 275 +++++++++++++++++++
 .../index/TestSlowCompositeReaderWrapper.java   |  91 ++++++
 .../lucene/uninverting/TestDocTermOrds.java     |  12 +-
 .../lucene/uninverting/TestFieldCache.java      |  10 +-
 .../uninverting/TestFieldCacheReopen.java       |   2 +-
 .../uninverting/TestFieldCacheVsDocValues.java  |   2 +-
 .../uninverting/TestFieldCacheWithThreads.java  |   2 +-
 .../uninverting/TestLegacyFieldCache.java       |  10 +-
 .../lucene/queries/CommonTermsQueryTest.java    |   6 +-
 .../apache/lucene/queries/TermsQueryTest.java   |   4 +-
 .../function/TestSortedSetFieldSource.java      |   2 +-
 .../lucene/queries/payloads/PayloadHelper.java  |   3 +-
 .../queries/payloads/TestPayloadSpans.java      |  39 ++-
 .../queries/payloads/TestPayloadTermQuery.java  |  11 +-
 .../index/BaseDocValuesFormatTestCase.java      |  64 +++--
 .../index/BaseIndexFileFormatTestCase.java      |   6 +-
 .../lucene/index/BasePointsFormatTestCase.java  |   4 +-
 .../index/BasePostingsFormatTestCase.java       |  66 ++---
 .../index/BaseStoredFieldsFormatTestCase.java   |   2 +-
 .../index/BaseTermVectorsFormatTestCase.java    |  12 +-
 .../org/apache/lucene/search/QueryUtils.java    |   6 +-
 .../lucene/search/spans/MultiSpansWrapper.java  |  51 ----
 .../org/apache/lucene/util/LuceneTestCase.java  |  53 ++--
 .../lucene/analysis/TestMockAnalyzer.java       |   2 +-
 .../TestCompressingStoredFieldsFormat.java      |   5 +-
 .../TestCompressingTermVectorsFormat.java       |   8 +-
 .../lucene/index/TestAssertingLeafReader.java   |   5 +-
 89 files changed, 828 insertions(+), 880 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50DocValuesFormat.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50DocValuesFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50DocValuesFormat.java
index 2c38728..9f174dd 100644
--- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50DocValuesFormat.java
+++ b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50DocValuesFormat.java
@@ -200,7 +200,7 @@ public class TestLucene50DocValuesFormat extends BaseCompressingDocValuesFormatT
     
     // now compare again after the merge
     ir = writer.getReader();
-    LeafReader ar = getOnlySegmentReader(ir);
+    LeafReader ar = getOnlyLeafReader(ir);
     Terms terms = ar.terms("indexed");
     if (terms != null) {
       assertEquals(terms.size(), ar.getSortedSetDocValues("dv").getValueCount());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/classification/src/test/org/apache/lucene/classification/ClassificationTestBase.java
----------------------------------------------------------------------
diff --git a/lucene/classification/src/test/org/apache/lucene/classification/ClassificationTestBase.java b/lucene/classification/src/test/org/apache/lucene/classification/ClassificationTestBase.java
index 605b490..331a74b 100644
--- a/lucene/classification/src/test/org/apache/lucene/classification/ClassificationTestBase.java
+++ b/lucene/classification/src/test/org/apache/lucene/classification/ClassificationTestBase.java
@@ -27,7 +27,6 @@ import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.LeafReader;
 import org.apache.lucene.index.RandomIndexWriter;
-import org.apache.lucene.index.SlowCompositeReaderWrapper;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BytesRef;
@@ -190,7 +189,8 @@ public abstract class ClassificationTestBase<T> extends LuceneTestCase {
     indexWriter.addDocument(doc);
 
     indexWriter.commit();
-    return SlowCompositeReaderWrapper.wrap(indexWriter.getReader());
+    indexWriter.forceMerge(1);
+    return getOnlyLeafReader(indexWriter.getReader());
   }
 
   protected LeafReader getRandomIndex(Analyzer analyzer, int size) throws IOException {
@@ -213,7 +213,8 @@ public abstract class ClassificationTestBase<T> extends LuceneTestCase {
       indexWriter.addDocument(doc);
     }
     indexWriter.commit();
-    return SlowCompositeReaderWrapper.wrap(indexWriter.getReader());
+    indexWriter.forceMerge(1);
+    return getOnlyLeafReader(indexWriter.getReader());
   }
 
   private String createRandomString(Random random) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/classification/src/test/org/apache/lucene/classification/document/DocumentClassificationTestBase.java
----------------------------------------------------------------------
diff --git a/lucene/classification/src/test/org/apache/lucene/classification/document/DocumentClassificationTestBase.java b/lucene/classification/src/test/org/apache/lucene/classification/document/DocumentClassificationTestBase.java
index 316802b..4193bde 100644
--- a/lucene/classification/src/test/org/apache/lucene/classification/document/DocumentClassificationTestBase.java
+++ b/lucene/classification/src/test/org/apache/lucene/classification/document/DocumentClassificationTestBase.java
@@ -30,7 +30,6 @@ import org.apache.lucene.document.Field;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.LeafReader;
 import org.apache.lucene.index.RandomIndexWriter;
-import org.apache.lucene.index.SlowCompositeReaderWrapper;
 import org.apache.lucene.util.BytesRef;
 import org.junit.Before;
 
@@ -202,7 +201,8 @@ public abstract class DocumentClassificationTestBase<T> extends ClassificationTe
     indexWriter.addDocument(doc);
 
     indexWriter.commit();
-    return SlowCompositeReaderWrapper.wrap(indexWriter.getReader());
+    indexWriter.forceMerge(1);
+    return getOnlyLeafReader(indexWriter.getReader());
   }
 
   protected Document getVideoGameDocument() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/classification/src/test/org/apache/lucene/classification/utils/DataSplitterTest.java
----------------------------------------------------------------------
diff --git a/lucene/classification/src/test/org/apache/lucene/classification/utils/DataSplitterTest.java b/lucene/classification/src/test/org/apache/lucene/classification/utils/DataSplitterTest.java
index d69fefb..2984bb5 100644
--- a/lucene/classification/src/test/org/apache/lucene/classification/utils/DataSplitterTest.java
+++ b/lucene/classification/src/test/org/apache/lucene/classification/utils/DataSplitterTest.java
@@ -27,7 +27,6 @@ import org.apache.lucene.index.LeafReader;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.RandomIndexWriter;
-import org.apache.lucene.index.SlowCompositeReaderWrapper;
 import org.apache.lucene.store.BaseDirectoryWrapper;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.TestUtil;
@@ -75,9 +74,9 @@ public class DataSplitterTest extends LuceneTestCase {
     }
 
     indexWriter.commit();
+    indexWriter.forceMerge(1);
 
-    originalIndex = SlowCompositeReaderWrapper.wrap(indexWriter.getReader());
-
+    originalIndex = getOnlyLeafReader(indexWriter.getReader());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/java/org/apache/lucene/index/CompositeReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/CompositeReader.java b/lucene/core/src/java/org/apache/lucene/index/CompositeReader.java
index 0f6a44e..83bb92a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/CompositeReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/CompositeReader.java
@@ -26,8 +26,6 @@ import org.apache.lucene.store.*;
  be used to get stored fields from the underlying LeafReaders,
  but it is not possible to directly retrieve postings. To do that, get
  the {@link LeafReaderContext} for all sub-readers via {@link #leaves()}.
- Alternatively, you can mimic an {@link LeafReader} (with a serious slowdown),
- by wrapping composite readers with {@link SlowCompositeReaderWrapper}.
  
  <p>IndexReader instances for indexes on disk are usually constructed
  with a call to one of the static <code>DirectoryReader.open()</code> methods,

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/java/org/apache/lucene/index/IndexReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexReader.java b/lucene/core/src/java/org/apache/lucene/index/IndexReader.java
index 865f816..976f548 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexReader.java
@@ -56,8 +56,6 @@ import org.apache.lucene.util.IOUtils;
   be used to get stored fields from the underlying LeafReaders,
   but it is not possible to directly retrieve postings. To do that, get
   the sub-readers via {@link CompositeReader#getSequentialSubReaders}.
-  Alternatively, you can mimic an {@link LeafReader} (with a serious slowdown),
-  by wrapping composite readers with {@link SlowCompositeReaderWrapper}.
  </ul>
  
  <p>IndexReader instances for indexes on disk are usually constructed

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java b/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
index 383139f..3394797 100644
--- a/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
@@ -486,8 +486,8 @@ public class MultiDocValues {
 
     private static final long BASE_RAM_BYTES_USED = RamUsageEstimator.shallowSizeOfInstance(OrdinalMap.class);
 
-    // cache key of whoever asked for this awful thing
-    final Object owner;
+    /** Cache key of whoever asked for this awful thing */
+    public final Object owner;
     // globalOrd -> (globalOrd - segmentOrd) where segmentOrd is the the ordinal in the first segment that contains this term
     final PackedLongValues globalOrdDeltas;
     // globalOrd -> first segment container
@@ -703,7 +703,7 @@ public class MultiDocValues {
     LongValues currentGlobalOrds;
     
     /** Creates a new MultiSortedSetDocValues over <code>values</code> */
-    MultiSortedSetDocValues(SortedSetDocValues values[], int docStarts[], OrdinalMap mapping) throws IOException {
+    public MultiSortedSetDocValues(SortedSetDocValues values[], int docStarts[], OrdinalMap mapping) throws IOException {
       assert docStarts.length == values.length + 1;
       this.values = values;
       this.docStarts = docStarts;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java b/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java
deleted file mode 100644
index e44c53c..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-package org.apache.lucene.index;
-
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.lucene.index.MultiDocValues.MultiSortedDocValues;
-import org.apache.lucene.index.MultiDocValues.MultiSortedSetDocValues;
-import org.apache.lucene.index.MultiDocValues.OrdinalMap;
-import org.apache.lucene.util.Bits;
-
-/**
- * This class forces a composite reader (eg a {@link
- * MultiReader} or {@link DirectoryReader}) to emulate a
- * {@link LeafReader}.  This requires implementing the postings
- * APIs on-the-fly, using the static methods in {@link
- * MultiFields}, {@link MultiDocValues}, by stepping through
- * the sub-readers to merge fields/terms, appending docs, etc.
- *
- * <p><b>NOTE</b>: this class almost always results in a
- * performance hit.  If this is important to your use case,
- * you'll get better performance by gathering the sub readers using
- * {@link IndexReader#getContext()} to get the
- * leaves and then operate per-LeafReader,
- * instead of using this class.
- */
-public final class SlowCompositeReaderWrapper extends LeafReader {
-
-  private final CompositeReader in;
-  private final Fields fields;
-  private final boolean merging;
-  
-  /** This method is sugar for getting an {@link LeafReader} from
-   * an {@link IndexReader} of any kind. If the reader is already atomic,
-   * it is returned unchanged, otherwise wrapped by this class.
-   */
-  public static LeafReader wrap(IndexReader reader) throws IOException {
-    if (reader instanceof CompositeReader) {
-      return new SlowCompositeReaderWrapper((CompositeReader) reader, false);
-    } else {
-      assert reader instanceof LeafReader;
-      return (LeafReader) reader;
-    }
-  }
-
-  SlowCompositeReaderWrapper(CompositeReader reader, boolean merging) throws IOException {
-    super();
-    in = reader;
-    fields = MultiFields.getFields(in);
-    in.registerParentReader(this);
-    this.merging = merging;
-  }
-
-  @Override
-  public String toString() {
-    return "SlowCompositeReaderWrapper(" + in + ")";
-  }
-
-  @Override
-  public void addCoreClosedListener(CoreClosedListener listener) {
-    addCoreClosedListenerAsReaderClosedListener(in, listener);
-  }
-
-  @Override
-  public void removeCoreClosedListener(CoreClosedListener listener) {
-    removeCoreClosedListenerAsReaderClosedListener(in, listener);
-  }
-
-  @Override
-  public Fields fields() {
-    ensureOpen();
-    return fields;
-  }
-
-  @Override
-  public NumericDocValues getNumericDocValues(String field) throws IOException {
-    ensureOpen();
-    return MultiDocValues.getNumericValues(in, field);
-  }
-
-  @Override
-  public Bits getDocsWithField(String field) throws IOException {
-    ensureOpen();
-    return MultiDocValues.getDocsWithField(in, field);
-  }
-
-  @Override
-  public BinaryDocValues getBinaryDocValues(String field) throws IOException {
-    ensureOpen();
-    return MultiDocValues.getBinaryValues(in, field);
-  }
-  
-  @Override
-  public SortedNumericDocValues getSortedNumericDocValues(String field) throws IOException {
-    ensureOpen();
-    return MultiDocValues.getSortedNumericValues(in, field);
-  }
-
-  @Override
-  public SortedDocValues getSortedDocValues(String field) throws IOException {
-    ensureOpen();
-    OrdinalMap map = null;
-    synchronized (cachedOrdMaps) {
-      map = cachedOrdMaps.get(field);
-      if (map == null) {
-        // uncached, or not a multi dv
-        SortedDocValues dv = MultiDocValues.getSortedValues(in, field);
-        if (dv instanceof MultiSortedDocValues) {
-          map = ((MultiSortedDocValues)dv).mapping;
-          if (map.owner == getCoreCacheKey() && merging == false) {
-            cachedOrdMaps.put(field, map);
-          }
-        }
-        return dv;
-      }
-    }
-    int size = in.leaves().size();
-    final SortedDocValues[] values = new SortedDocValues[size];
-    final int[] starts = new int[size+1];
-    for (int i = 0; i < size; i++) {
-      LeafReaderContext context = in.leaves().get(i);
-      final LeafReader reader = context.reader();
-      final FieldInfo fieldInfo = reader.getFieldInfos().fieldInfo(field);
-      if (fieldInfo != null && fieldInfo.getDocValuesType() != DocValuesType.SORTED) {
-        return null;
-      }
-      SortedDocValues v = reader.getSortedDocValues(field);
-      if (v == null) {
-        v = DocValues.emptySorted();
-      }
-      values[i] = v;
-      starts[i] = context.docBase;
-    }
-    starts[size] = maxDoc();
-    return new MultiSortedDocValues(values, starts, map);
-  }
-  
-  @Override
-  public SortedSetDocValues getSortedSetDocValues(String field) throws IOException {
-    ensureOpen();
-    OrdinalMap map = null;
-    synchronized (cachedOrdMaps) {
-      map = cachedOrdMaps.get(field);
-      if (map == null) {
-        // uncached, or not a multi dv
-        SortedSetDocValues dv = MultiDocValues.getSortedSetValues(in, field);
-        if (dv instanceof MultiSortedSetDocValues) {
-          map = ((MultiSortedSetDocValues)dv).mapping;
-          if (map.owner == getCoreCacheKey() && merging == false) {
-            cachedOrdMaps.put(field, map);
-          }
-        }
-        return dv;
-      }
-    }
-   
-    assert map != null;
-    int size = in.leaves().size();
-    final SortedSetDocValues[] values = new SortedSetDocValues[size];
-    final int[] starts = new int[size+1];
-    for (int i = 0; i < size; i++) {
-      LeafReaderContext context = in.leaves().get(i);
-      final LeafReader reader = context.reader();
-      final FieldInfo fieldInfo = reader.getFieldInfos().fieldInfo(field);
-      if(fieldInfo != null && fieldInfo.getDocValuesType() != DocValuesType.SORTED_SET){
-        return null;
-      }
-      SortedSetDocValues v = reader.getSortedSetDocValues(field);
-      if (v == null) {
-        v = DocValues.emptySortedSet();
-      }
-      values[i] = v;
-      starts[i] = context.docBase;
-    }
-    starts[size] = maxDoc();
-    return new MultiSortedSetDocValues(values, starts, map);
-  }
-  
-  // TODO: this could really be a weak map somewhere else on the coreCacheKey,
-  // but do we really need to optimize slow-wrapper any more?
-  private final Map<String,OrdinalMap> cachedOrdMaps = new HashMap<>();
-
-  @Override
-  public NumericDocValues getNormValues(String field) throws IOException {
-    ensureOpen();
-    return MultiDocValues.getNormValues(in, field);
-  }
-  
-  @Override
-  public Fields getTermVectors(int docID) throws IOException {
-    ensureOpen();
-    return in.getTermVectors(docID);
-  }
-
-  @Override
-  public int numDocs() {
-    // Don't call ensureOpen() here (it could affect performance)
-    return in.numDocs();
-  }
-
-  @Override
-  public int maxDoc() {
-    // Don't call ensureOpen() here (it could affect performance)
-    return in.maxDoc();
-  }
-
-  @Override
-  public void document(int docID, StoredFieldVisitor visitor) throws IOException {
-    ensureOpen();
-    in.document(docID, visitor);
-  }
-
-  @Override
-  public Bits getLiveDocs() {
-    ensureOpen();
-    return MultiFields.getLiveDocs(in);
-  }
-
-  @Override
-  public PointValues getPointValues() {
-    ensureOpen();
-    return null;
-  }
-
-  @Override
-  public FieldInfos getFieldInfos() {
-    ensureOpen();
-    return MultiFields.getMergedFieldInfos(in);
-  }
-
-  @Override
-  public Object getCoreCacheKey() {
-    return in.getCoreCacheKey();
-  }
-
-  @Override
-  public Object getCombinedCoreAndDeletesKey() {
-    return in.getCombinedCoreAndDeletesKey();
-  }
-
-  @Override
-  protected void doClose() throws IOException {
-    // TODO: as this is a wrapper, should we really close the delegate?
-    in.close();
-  }
-
-  @Override
-  public void checkIntegrity() throws IOException {
-    ensureOpen();
-    for (LeafReaderContext ctx : in.leaves()) {
-      ctx.reader().checkIntegrity();
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java b/lucene/core/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
index cede1d7..b6f178d 100644
--- a/lucene/core/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
+++ b/lucene/core/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
@@ -362,7 +362,7 @@ public class TestLucene54DocValuesFormat extends BaseCompressingDocValuesFormatT
     
     // now compare again after the merge
     ir = writer.getReader();
-    LeafReader ar = getOnlySegmentReader(ir);
+    LeafReader ar = getOnlyLeafReader(ir);
     Terms terms = ar.terms("indexed");
     if (terms != null) {
       assertEquals(terms.size(), ar.getSortedSetDocValues("dv").getValueCount());
@@ -541,7 +541,7 @@ public class TestLucene54DocValuesFormat extends BaseCompressingDocValuesFormatT
       w.forceMerge(1);
       DirectoryReader r = DirectoryReader.open(w);
       w.close();
-      SegmentReader sr = getOnlySegmentReader(r);
+      LeafReader sr = getOnlyLeafReader(r);
       assertEquals(maxDoc, sr.maxDoc());
       SortedSetDocValues values = sr.getSortedSetDocValues("sset");
       assertNotNull(values);
@@ -591,7 +591,7 @@ public class TestLucene54DocValuesFormat extends BaseCompressingDocValuesFormatT
       w.forceMerge(1);
       DirectoryReader r = DirectoryReader.open(w);
       w.close();
-      SegmentReader sr = getOnlySegmentReader(r);
+      LeafReader sr = getOnlyLeafReader(r);
       assertEquals(maxDoc, sr.maxDoc());
       SortedNumericDocValues values = sr.getSortedNumericDocValues("snum");
       assertNotNull(values);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java b/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
index 4025f58..8dc8a3c 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
@@ -253,16 +253,14 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
       writer.close();
     }
     
-    LeafReader slow = SlowCompositeReaderWrapper.wrap(reader);
-    
-    Bits liveDocs = slow.getLiveDocs();
+    Bits liveDocs = MultiFields.getLiveDocs(reader);
     boolean[] expectedLiveDocs = new boolean[] { true, false, false, true, true, true };
     for (int i = 0; i < expectedLiveDocs.length; i++) {
       assertEquals(expectedLiveDocs[i], liveDocs.get(i));
     }
     
     long[] expectedValues = new long[] { 1, 2, 3, 17, 5, 17};
-    BinaryDocValues bdv = slow.getBinaryDocValues("val");
+    BinaryDocValues bdv = MultiDocValues.getBinaryValues(reader, "val");
     for (int i = 0; i < expectedValues.length; i++) {
       assertEquals(expectedValues[i], getValue(bdv, i));
     }
@@ -469,10 +467,9 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
     
     final DirectoryReader reader = DirectoryReader.open(dir);
     
-    LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    BinaryDocValues bdv = r.getBinaryDocValues("bdv");
-    SortedDocValues sdv = r.getSortedDocValues("sorted");
-    for (int i = 0; i < r.maxDoc(); i++) {
+    BinaryDocValues bdv = MultiDocValues.getBinaryValues(reader, "bdv");
+    SortedDocValues sdv = MultiDocValues.getSortedValues(reader, "sorted");
+    for (int i = 0; i < reader.maxDoc(); i++) {
       assertEquals(17, getValue(bdv, i));
       BytesRef term = sdv.get(i);
       assertEquals(new BytesRef("value"), term);
@@ -499,9 +496,8 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
     writer.close();
     
     final DirectoryReader reader = DirectoryReader.open(dir);
-    final LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    BinaryDocValues bdv = r.getBinaryDocValues("bdv");
-    for (int i = 0; i < r.maxDoc(); i++) {
+    BinaryDocValues bdv = MultiDocValues.getBinaryValues(reader, "bdv");
+    for (int i = 0; i < reader.maxDoc(); i++) {
       assertEquals(3, getValue(bdv, i));
     }
     reader.close();
@@ -598,9 +594,8 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
     writer.close();
     
     final DirectoryReader reader = DirectoryReader.open(dir);
-    final LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    BinaryDocValues bdv = r.getBinaryDocValues("bdv");
-    for (int i = 0; i < r.maxDoc(); i++) {
+    BinaryDocValues bdv = MultiDocValues.getBinaryValues(reader, "bdv");
+    for (int i = 0; i < reader.maxDoc(); i++) {
       assertEquals(3, getValue(bdv, i));
     }
     reader.close();
@@ -1018,9 +1013,8 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
     writer.close();
     
     DirectoryReader reader = DirectoryReader.open(dir);
-    LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    BinaryDocValues f1 = r.getBinaryDocValues("f1");
-    BinaryDocValues f2 = r.getBinaryDocValues("f2");
+    BinaryDocValues f1 = MultiDocValues.getBinaryValues(reader, "f1");
+    BinaryDocValues f2 = MultiDocValues.getBinaryValues(reader, "f2");
     assertEquals(12L, getValue(f1, 0));
     assertEquals(13L, getValue(f2, 0));
     assertEquals(17L, getValue(f1, 1));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java b/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java
index 1d0ba54..c513093 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java
@@ -66,8 +66,8 @@ public class TestCustomNorms extends LuceneTestCase {
     }
     writer.commit();
     writer.close();
-    LeafReader open = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir));
-    NumericDocValues norms = open.getNormValues(floatTestField);
+    DirectoryReader open = DirectoryReader.open(dir);
+    NumericDocValues norms = MultiDocValues.getNormValues(open, floatTestField);
     assertNotNull(norms);
     for (int i = 0; i < open.maxDoc(); i++) {
       Document document = open.document(i);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestDemoParallelLeafReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDemoParallelLeafReader.java b/lucene/core/src/test/org/apache/lucene/index/TestDemoParallelLeafReader.java
index 0034cee..9f3339c 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDemoParallelLeafReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDemoParallelLeafReader.java
@@ -405,13 +405,8 @@ public class TestDemoParallelLeafReader extends LuceneTestCase {
             //TestUtil.checkIndex(dir);
 
             SegmentInfos infos = SegmentInfos.readLatestCommit(dir);
-            final LeafReader parLeafReader;
-            if (infos.size() == 1) {
-              parLeafReader = new SegmentReader(infos.info(0), IOContext.DEFAULT);
-            } else {
-              // This just means we didn't forceMerge above:
-              parLeafReader = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir));
-            }
+            assert infos.size() == 1;
+            final LeafReader parLeafReader = new SegmentReader(infos.info(0), IOContext.DEFAULT);
 
             //checkParallelReader(leaf, parLeafReader, schemaGen);
 
@@ -682,9 +677,7 @@ public class TestDemoParallelLeafReader extends LuceneTestCase {
           w.addDocument(newDoc);
         }
 
-        if (random().nextBoolean()) {
-          w.forceMerge(1);
-        }
+        w.forceMerge(1);
 
         w.close();
       }
@@ -750,9 +743,7 @@ public class TestDemoParallelLeafReader extends LuceneTestCase {
           }
         }
 
-        if (random().nextBoolean()) {
-          w.forceMerge(1);
-        }
+        w.forceMerge(1);
 
         w.close();
       }
@@ -845,9 +836,7 @@ public class TestDemoParallelLeafReader extends LuceneTestCase {
           }
         }
 
-        if (random().nextBoolean()) {
-          w.forceMerge(1);
-        }
+        w.forceMerge(1);
 
         w.close();
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReader.java b/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReader.java
index 24b2c50..8e62094 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReader.java
@@ -761,7 +761,7 @@ public class TestDirectoryReader extends LuceneTestCase {
     writer.commit();
   
     DirectoryReader r = DirectoryReader.open(dir);
-    LeafReader r1 = getOnlySegmentReader(r);
+    LeafReader r1 = getOnlyLeafReader(r);
     assertEquals(26, r1.terms("field").size());
     assertEquals(10, r1.terms("number").size());
     writer.addDocument(doc);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDocValues.java b/lucene/core/src/test/org/apache/lucene/index/TestDocValues.java
index ad4d60c..2266caf 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDocValues.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDocValues.java
@@ -41,7 +41,7 @@ public class TestDocValues extends LuceneTestCase {
     IndexWriter iw = new IndexWriter(dir, newIndexWriterConfig(null));
     iw.addDocument(new Document());
     DirectoryReader dr = DirectoryReader.open(iw);
-    LeafReader r = getOnlySegmentReader(dr);
+    LeafReader r = getOnlyLeafReader(dr);
     
     // ok
     assertNotNull(DocValues.getBinary(r, "bogus"));
@@ -66,7 +66,7 @@ public class TestDocValues extends LuceneTestCase {
     doc.add(new StringField("foo", "bar", Field.Store.NO));
     iw.addDocument(doc);
     DirectoryReader dr = DirectoryReader.open(iw);
-    LeafReader r = getOnlySegmentReader(dr);
+    LeafReader r = getOnlyLeafReader(dr);
    
     // errors
     expectThrows(IllegalStateException.class, () -> {
@@ -103,7 +103,7 @@ public class TestDocValues extends LuceneTestCase {
     doc.add(new NumericDocValuesField("foo", 3));
     iw.addDocument(doc);
     DirectoryReader dr = DirectoryReader.open(iw);
-    LeafReader r = getOnlySegmentReader(dr);
+    LeafReader r = getOnlyLeafReader(dr);
     
     // ok
     assertNotNull(DocValues.getNumeric(r, "foo"));
@@ -136,7 +136,7 @@ public class TestDocValues extends LuceneTestCase {
     doc.add(new BinaryDocValuesField("foo", new BytesRef("bar")));
     iw.addDocument(doc);
     DirectoryReader dr = DirectoryReader.open(iw);
-    LeafReader r = getOnlySegmentReader(dr);
+    LeafReader r = getOnlyLeafReader(dr);
     
     // ok
     assertNotNull(DocValues.getBinary(r, "foo"));
@@ -171,7 +171,7 @@ public class TestDocValues extends LuceneTestCase {
     doc.add(new SortedDocValuesField("foo", new BytesRef("bar")));
     iw.addDocument(doc);
     DirectoryReader dr = DirectoryReader.open(iw);
-    LeafReader r = getOnlySegmentReader(dr);
+    LeafReader r = getOnlyLeafReader(dr);
     
     // ok
     assertNotNull(DocValues.getBinary(r, "foo"));
@@ -202,7 +202,7 @@ public class TestDocValues extends LuceneTestCase {
     doc.add(new SortedSetDocValuesField("foo", new BytesRef("bar")));
     iw.addDocument(doc);
     DirectoryReader dr = DirectoryReader.open(iw);
-    LeafReader r = getOnlySegmentReader(dr);
+    LeafReader r = getOnlyLeafReader(dr);
     
     // ok
     assertNotNull(DocValues.getSortedSet(r, "foo"));
@@ -237,7 +237,7 @@ public class TestDocValues extends LuceneTestCase {
     doc.add(new SortedNumericDocValuesField("foo", 3));
     iw.addDocument(doc);
     DirectoryReader dr = DirectoryReader.open(iw);
-    LeafReader r = getOnlySegmentReader(dr);
+    LeafReader r = getOnlyLeafReader(dr);
     
     // ok
     assertNotNull(DocValues.getSortedNumeric(r, "foo"));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestDocValuesIndexing.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDocValuesIndexing.java b/lucene/core/src/test/org/apache/lucene/index/TestDocValuesIndexing.java
index 44b5b75..2e0cbd9 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDocValuesIndexing.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDocValuesIndexing.java
@@ -58,7 +58,7 @@ public class TestDocValuesIndexing extends LuceneTestCase {
     doc.add(newStringField("id", "1", Field.Store.YES));
     doc.add(new NumericDocValuesField("dv", 1));
     w.addDocument(doc);
-    IndexReader r1 = w.getReader();
+    DirectoryReader r1 = w.getReader();
     w.close();
 
     Directory d2 = newDirectory();
@@ -67,12 +67,12 @@ public class TestDocValuesIndexing extends LuceneTestCase {
     doc.add(newStringField("id", "2", Field.Store.YES));
     doc.add(new NumericDocValuesField("dv", 2));
     w.addDocument(doc);
-    IndexReader r2 = w.getReader();
+    DirectoryReader r2 = w.getReader();
     w.close();
 
     Directory d3 = newDirectory();
     w = new RandomIndexWriter(random(), d3);
-    w.addIndexes(SlowCodecReaderWrapper.wrap(SlowCompositeReaderWrapper.wrap(r1)), SlowCodecReaderWrapper.wrap(SlowCompositeReaderWrapper.wrap(r2)));
+    w.addIndexes(SlowCodecReaderWrapper.wrap(getOnlyLeafReader(r1)), SlowCodecReaderWrapper.wrap(getOnlyLeafReader(r2)));
     r1.close();
     d1.close();
     r2.close();
@@ -81,7 +81,7 @@ public class TestDocValuesIndexing extends LuceneTestCase {
     w.forceMerge(1);
     DirectoryReader r3 = w.getReader();
     w.close();
-    LeafReader sr = getOnlySegmentReader(r3);
+    LeafReader sr = getOnlyLeafReader(r3);
     assertEquals(2, sr.numDocs());
     NumericDocValues docValues = sr.getNumericDocValues("dv");
     assertNotNull(docValues);
@@ -109,7 +109,7 @@ public class TestDocValuesIndexing extends LuceneTestCase {
 
     DirectoryReader r = w.getReader();
     w.close();
-    assertEquals(17, DocValues.getNumeric(getOnlySegmentReader(r), "field").get(0));
+    assertEquals(17, DocValues.getNumeric(getOnlyLeafReader(r), "field").get(0));
     r.close();
     d.close();
   }
@@ -130,7 +130,7 @@ public class TestDocValuesIndexing extends LuceneTestCase {
 
     DirectoryReader r = w.getReader();
     w.close();
-    assertEquals(17, DocValues.getNumeric(getOnlySegmentReader(r), "field").get(0));
+    assertEquals(17, DocValues.getNumeric(getOnlyLeafReader(r), "field").get(0));
     r.close();
     d.close();
   }
@@ -150,7 +150,7 @@ public class TestDocValuesIndexing extends LuceneTestCase {
     });
 
     DirectoryReader r = w.getReader();
-    assertEquals(17, getOnlySegmentReader(r).getNumericDocValues("field").get(0));
+    assertEquals(17, getOnlyLeafReader(r).getNumericDocValues("field").get(0));
     r.close();
     w.close();
     d.close();
@@ -171,7 +171,7 @@ public class TestDocValuesIndexing extends LuceneTestCase {
     w.addDocument(doc);
     w.forceMerge(1);
     DirectoryReader r = w.getReader();
-    BinaryDocValues s = DocValues.getSorted(getOnlySegmentReader(r), "field");
+    BinaryDocValues s = DocValues.getSorted(getOnlyLeafReader(r), "field");
 
     BytesRef bytes1 = s.get(0);
     assertEquals(bytes.length, bytes1.length);
@@ -199,19 +199,18 @@ public class TestDocValuesIndexing extends LuceneTestCase {
       writer.addDocument(doc);
     }
     DirectoryReader r = writer.getReader();
-    LeafReader slow = SlowCompositeReaderWrapper.wrap(r);
-    FieldInfos fi = slow.getFieldInfos();
+    FieldInfos fi = MultiFields.getMergedFieldInfos(r);
     FieldInfo dvInfo = fi.fieldInfo("dv");
     assertTrue(dvInfo.getDocValuesType() != DocValuesType.NONE);
-    NumericDocValues dv = slow.getNumericDocValues("dv");
+    NumericDocValues dv = MultiDocValues.getNumericValues(r, "dv");
     for (int i = 0; i < 50; i++) {
       assertEquals(i, dv.get(i));
-      Document d = slow.document(i);
+      Document d = r.document(i);
       // cannot use d.get("dv") due to another bug!
       assertNull(d.getField("dv"));
       assertEquals(Integer.toString(i), d.get("docId"));
     }
-    slow.close();
+    r.close();
     writer.close();
     dir.close();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestDocsAndPositions.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDocsAndPositions.java b/lucene/core/src/test/org/apache/lucene/index/TestDocsAndPositions.java
index dc49db1..2ef5824 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDocsAndPositions.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDocsAndPositions.java
@@ -335,7 +335,7 @@ public class TestDocsAndPositions extends LuceneTestCase {
     doc.add(newStringField("foo", "bar", Field.Store.NO));
     writer.addDocument(doc);
     DirectoryReader reader = writer.getReader();
-    LeafReader r = getOnlySegmentReader(reader);
+    LeafReader r = getOnlyLeafReader(reader);
     PostingsEnum disi = TestUtil.docs(random(), r, "foo", new BytesRef("bar"), null, PostingsEnum.NONE);
     int docid = disi.docID();
     assertEquals(-1, docid);
@@ -360,7 +360,7 @@ public class TestDocsAndPositions extends LuceneTestCase {
     doc.add(newTextField("foo", "bar", Field.Store.NO));
     writer.addDocument(doc);
     DirectoryReader reader = writer.getReader();
-    LeafReader r = getOnlySegmentReader(reader);
+    LeafReader r = getOnlyLeafReader(reader);
     PostingsEnum disi = r.postings(new Term("foo", "bar"), PostingsEnum.ALL);
     int docid = disi.docID();
     assertEquals(-1, docid);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java b/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
index 489a185..a814c4c 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
@@ -284,7 +284,7 @@ public class TestDocumentWriter extends LuceneTestCase {
 
     TestUtil.checkIndex(dir);
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(dir));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(dir));
     FieldInfos fi = reader.getFieldInfos();
     // f1
     assertFalse("f1 should have no norms", fi.fieldInfo("f1").hasNorms());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java b/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java
index b79e638..62fe28a 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java
@@ -162,8 +162,8 @@ public class TestDuelingCodecs extends LuceneTestCase {
     createRandomIndex(numdocs, leftWriter, seed);
     createRandomIndex(numdocs, rightWriter, seed);
 
-    leftReader = wrapReader(leftWriter.getReader(), false);
-    rightReader = wrapReader(rightWriter.getReader(), false);
+    leftReader = wrapReader(leftWriter.getReader());
+    rightReader = wrapReader(rightWriter.getReader());
     
     // check that our readers are valid
     TestUtil.checkReader(leftReader);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestExitableDirectoryReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestExitableDirectoryReader.java b/lucene/core/src/test/org/apache/lucene/index/TestExitableDirectoryReader.java
index 36c9e0d..65cf84e 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestExitableDirectoryReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestExitableDirectoryReader.java
@@ -78,8 +78,8 @@ public class TestExitableDirectoryReader extends LuceneTestCase {
       }
     }
 
-    public TestReader(IndexReader reader) throws IOException {
-      super(SlowCompositeReaderWrapper.wrap(reader));
+    public TestReader(LeafReader reader) throws IOException {
+      super(reader);
     }
 
     @Override
@@ -107,6 +107,7 @@ public class TestExitableDirectoryReader extends LuceneTestCase {
     Document d3 = new Document();
     d3.add(newTextField("default", "ones two four", Field.Store.YES));
     writer.addDocument(d3);
+    writer.forceMerge(1);
 
     writer.commit();
     writer.close();
@@ -122,43 +123,39 @@ public class TestExitableDirectoryReader extends LuceneTestCase {
     // Not checking the validity of the result, all we are bothered about in this test is the timing out.
     directoryReader = DirectoryReader.open(directory);
     exitableDirectoryReader = new ExitableDirectoryReader(directoryReader, new QueryTimeoutImpl(1000));
-    reader = new TestReader(exitableDirectoryReader);
+    reader = new TestReader(getOnlyLeafReader(exitableDirectoryReader));
     searcher = new IndexSearcher(reader);
     searcher.search(query, 10);
     reader.close();
-    exitableDirectoryReader.close();
 
 
     // Set a really low timeout value (1 millisecond) and expect an Exception
     directoryReader = DirectoryReader.open(directory);
     exitableDirectoryReader = new ExitableDirectoryReader(directoryReader, new QueryTimeoutImpl(1));
-    reader = new TestReader(exitableDirectoryReader);
+    reader = new TestReader(getOnlyLeafReader(exitableDirectoryReader));
     IndexSearcher slowSearcher = new IndexSearcher(reader);
     expectThrows(ExitingReaderException.class, () -> {
       slowSearcher.search(query, 10);
     });
     reader.close();
-    exitableDirectoryReader.close();
    
     // Set maximum time out and expect the query to complete. 
     // Not checking the validity of the result, all we are bothered about in this test is the timing out.
     directoryReader = DirectoryReader.open(directory);
     exitableDirectoryReader = new ExitableDirectoryReader(directoryReader, new QueryTimeoutImpl(Long.MAX_VALUE));
-    reader = new TestReader(exitableDirectoryReader);
+    reader = new TestReader(getOnlyLeafReader(exitableDirectoryReader));
     searcher = new IndexSearcher(reader);
     searcher.search(query, 10);
     reader.close();
-    exitableDirectoryReader.close();
 
     // Set a negative time allowed and expect the query to complete (should disable timeouts)
     // Not checking the validity of the result, all we are bothered about in this test is the timing out.
     directoryReader = DirectoryReader.open(directory);
     exitableDirectoryReader = new ExitableDirectoryReader(directoryReader, new QueryTimeoutImpl(-189034L));
-    reader = new TestReader(exitableDirectoryReader);
+    reader = new TestReader(getOnlyLeafReader(exitableDirectoryReader));
     searcher = new IndexSearcher(reader);
     searcher.search(query, 10);
     reader.close();
-    exitableDirectoryReader.close();
 
     directory.close();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestFilterLeafReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestFilterLeafReader.java b/lucene/core/src/test/org/apache/lucene/index/TestFilterLeafReader.java
index cad47a4..e9f6fe2 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestFilterLeafReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestFilterLeafReader.java
@@ -98,8 +98,8 @@ public class TestFilterLeafReader extends LuceneTestCase {
       }
     }
     
-    public TestReader(IndexReader reader) throws IOException {
-      super(SlowCompositeReaderWrapper.wrap(reader));
+    public TestReader(LeafReader reader) throws IOException {
+      super(reader);
     }
 
     @Override
@@ -128,7 +128,7 @@ public class TestFilterLeafReader extends LuceneTestCase {
     Document d3 = new Document();
     d3.add(newTextField("default", "two four", Field.Store.YES));
     writer.addDocument(d3);
-
+    writer.forceMerge(1);
     writer.close();
 
     Directory target = newDirectory();
@@ -137,7 +137,7 @@ public class TestFilterLeafReader extends LuceneTestCase {
     ((BaseDirectoryWrapper) target).setCrossCheckTermVectorsOnClose(false);
 
     writer = new IndexWriter(target, newIndexWriterConfig(new MockAnalyzer(random())));
-    try (LeafReader reader = new TestReader(DirectoryReader.open(directory))) {
+    try (LeafReader reader = new TestReader(getOnlyLeafReader(DirectoryReader.open(directory)))) {
       writer.addIndexes(SlowCodecReaderWrapper.wrap(reader));
     }
     writer.close();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestFlex.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestFlex.java b/lucene/core/src/test/org/apache/lucene/index/TestFlex.java
index 3d716e1..d91301f 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestFlex.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestFlex.java
@@ -70,7 +70,7 @@ public class TestFlex extends LuceneTestCase {
     w.addDocument(doc);
     w.forceMerge(1);
     DirectoryReader r = w.getReader();
-    TermsEnum terms = getOnlySegmentReader(r).fields().terms("f").iterator();
+    TermsEnum terms = getOnlyLeafReader(r).fields().terms("f").iterator();
     assertTrue(terms.next() != null);
     try {
       assertEquals(0, terms.ord());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
index 6b22fd7..91dcb6e 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
@@ -37,14 +37,15 @@ public class TestIndexReaderClose extends LuceneTestCase {
   public void testCloseUnderException() throws IOException {
     Directory dir = newDirectory();
     IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(random(), new MockAnalyzer(random())));
+    writer.addDocument(new Document());
     writer.commit();
     writer.close();
     final int iters = 1000 +  1 + random().nextInt(20);
     for (int j = 0; j < iters; j++) {
       DirectoryReader open = DirectoryReader.open(dir);
       final boolean throwOnClose = !rarely();
-      LeafReader wrap = SlowCompositeReaderWrapper.wrap(open);
-      FilterLeafReader reader = new FilterLeafReader(wrap) {
+      LeafReader leaf = getOnlyLeafReader(open);
+      FilterLeafReader reader = new FilterLeafReader(leaf) {
         @Override
         protected void doClose() throws IOException {
           super.doClose();
@@ -87,54 +88,10 @@ public class TestIndexReaderClose extends LuceneTestCase {
         reader.close(); // call it again
       }
       assertEquals(0, count.get());
-      wrap.close();
     }
     dir.close();
   }
 
-  public void testCoreListenerOnSlowCompositeReaderWrapper() throws IOException {
-    RandomIndexWriter w = new RandomIndexWriter(random(), newDirectory());
-    final int numDocs = TestUtil.nextInt(random(), 1, 5);
-    for (int i = 0; i < numDocs; ++i) {
-      w.addDocument(new Document());
-      if (random().nextBoolean()) {
-        w.commit();
-      }
-    }
-    w.commit();
-    w.close();
-
-    final IndexReader reader = DirectoryReader.open(w.w.getDirectory());
-    final LeafReader leafReader = SlowCompositeReaderWrapper.wrap(reader);
-    
-    final int numListeners = TestUtil.nextInt(random(), 1, 10);
-    final List<LeafReader.CoreClosedListener> listeners = new ArrayList<>();
-    AtomicInteger counter = new AtomicInteger(numListeners);
-    
-    for (int i = 0; i < numListeners; ++i) {
-      CountCoreListener listener = new CountCoreListener(counter, leafReader.getCoreCacheKey());
-      listeners.add(listener);
-      leafReader.addCoreClosedListener(listener);
-    }
-    for (int i = 0; i < 100; ++i) {
-      leafReader.addCoreClosedListener(listeners.get(random().nextInt(listeners.size())));
-    }
-    final int removed = random().nextInt(numListeners);
-    Collections.shuffle(listeners, random());
-    for (int i = 0; i < removed; ++i) {
-      leafReader.removeCoreClosedListener(listeners.get(i));
-    }
-    assertEquals(numListeners, counter.get());
-    // make sure listeners are registered on the wrapped reader and that closing any of them has the same effect
-    if (random().nextBoolean()) {
-      reader.close();
-    } else {
-      leafReader.close();
-    }
-    assertEquals(removed, counter.get());
-    w.w.getDirectory().close();
-  }
-
   public void testCoreListenerOnWrapperWithDifferentCacheKey() throws IOException {
     RandomIndexWriter w = new RandomIndexWriter(random(), newDirectory());
     final int numDocs = TestUtil.nextInt(random(), 1, 5);
@@ -144,13 +101,14 @@ public class TestIndexReaderClose extends LuceneTestCase {
         w.commit();
       }
     }
+    w.forceMerge(1);
     w.commit();
     w.close();
 
     final IndexReader reader = DirectoryReader.open(w.w.getDirectory());
     // We explicitly define a different cache key
     final Object coreCacheKey = new Object();
-    final LeafReader leafReader = new FilterLeafReader(SlowCompositeReaderWrapper.wrap(reader)) {
+    final LeafReader leafReader = new FilterLeafReader(getOnlyLeafReader(reader)) {
       @Override
       public Object getCoreCacheKey() {
         return coreCacheKey;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
index 7461618..2c3543e 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
@@ -692,7 +692,7 @@ public class TestIndexWriter extends LuceneTestCase {
     writer.addDocument(doc);  
     writer.close();
     DirectoryReader reader = DirectoryReader.open(dir);
-    LeafReader subreader = getOnlySegmentReader(reader);
+    LeafReader subreader = getOnlyLeafReader(reader);
     TermsEnum te = subreader.fields().terms("").iterator();
     assertEquals(new BytesRef("a"), te.next());
     assertEquals(new BytesRef("b"), te.next());
@@ -713,7 +713,7 @@ public class TestIndexWriter extends LuceneTestCase {
     writer.addDocument(doc);  
     writer.close();
     DirectoryReader reader = DirectoryReader.open(dir);
-    LeafReader subreader = getOnlySegmentReader(reader);
+    LeafReader subreader = getOnlyLeafReader(reader);
     TermsEnum te = subreader.fields().terms("").iterator();
     assertEquals(new BytesRef(""), te.next());
     assertEquals(new BytesRef("a"), te.next());
@@ -2549,7 +2549,7 @@ public class TestIndexWriter extends LuceneTestCase {
     w.commit();
     w.close();
     DirectoryReader r = DirectoryReader.open(d);
-    assertEquals(0, getOnlySegmentReader(r).getNormValues("foo").get(0));
+    assertEquals(0, getOnlyLeafReader(r).getNormValues("foo").get(0));
     r.close();
     d.close();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestLazyProxSkipping.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestLazyProxSkipping.java b/lucene/core/src/test/org/apache/lucene/index/TestLazyProxSkipping.java
index a928fd2..ff79e5e 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestLazyProxSkipping.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestLazyProxSkipping.java
@@ -104,7 +104,7 @@ public class TestLazyProxSkipping extends LuceneTestCase {
         writer.forceMerge(1);
         writer.close();
 
-      SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(directory));
+      LeafReader reader = getOnlyLeafReader(DirectoryReader.open(directory));
 
       this.searcher = newSearcher(reader);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestMultiDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestMultiDocValues.java b/lucene/core/src/test/org/apache/lucene/index/TestMultiDocValues.java
index 121e85c..5b70c38 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestMultiDocValues.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestMultiDocValues.java
@@ -56,7 +56,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     NumericDocValues multi = MultiDocValues.getNumericValues(ir, "numbers");
@@ -91,7 +91,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     BinaryDocValues multi = MultiDocValues.getBinaryValues(ir, "bytes");
@@ -131,7 +131,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     SortedDocValues multi = MultiDocValues.getSortedValues(ir, "bytes");
@@ -173,7 +173,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     SortedDocValues multi = MultiDocValues.getSortedValues(ir, "bytes");
@@ -214,7 +214,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     SortedSetDocValues multi = MultiDocValues.getSortedSetValues(ir, "bytes");
@@ -276,7 +276,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     SortedSetDocValues multi = MultiDocValues.getSortedSetValues(ir, "bytes");
@@ -337,7 +337,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     SortedNumericDocValues multi = MultiDocValues.getSortedNumericValues(ir, "nums");
@@ -388,7 +388,7 @@ public class TestMultiDocValues extends LuceneTestCase {
     DirectoryReader ir = iw.getReader();
     iw.forceMerge(1);
     DirectoryReader ir2 = iw.getReader();
-    LeafReader merged = getOnlySegmentReader(ir2);
+    LeafReader merged = getOnlyLeafReader(ir2);
     iw.close();
     
     Bits multi = MultiDocValues.getDocsWithField(ir, "numbers");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java b/lucene/core/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java
index a82444b..bc14cb8 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java
@@ -80,7 +80,7 @@ public class TestMultiLevelSkipList extends LuceneTestCase {
     writer.forceMerge(1);
     writer.close();
 
-    LeafReader reader = getOnlySegmentReader(DirectoryReader.open(dir));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(dir));
     
     for (int i = 0; i < 2; i++) {
       counter = 0;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestNorms.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestNorms.java b/lucene/core/src/test/org/apache/lucene/index/TestNorms.java
index 562cefb..45db69a 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestNorms.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestNorms.java
@@ -111,8 +111,8 @@ public class TestNorms extends LuceneTestCase {
   public void testMaxByteNorms() throws IOException {
     Directory dir = newFSDirectory(createTempDir("TestNorms.testMaxByteNorms"));
     buildIndex(dir);
-    LeafReader open = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir));
-    NumericDocValues normValues = open.getNormValues(byteTestField);
+    DirectoryReader open = DirectoryReader.open(dir);
+    NumericDocValues normValues = MultiDocValues.getNormValues(open, byteTestField);
     assertNotNull(normValues);
     for (int i = 0; i < open.maxDoc(); i++) {
       Document document = open.document(i);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java b/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java
index 727f6ff..15ecc0f 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java
@@ -238,16 +238,14 @@ public class TestNumericDocValuesUpdates extends LuceneTestCase {
       writer.close();
     }
     
-    LeafReader slow = SlowCompositeReaderWrapper.wrap(reader);
-    
-    Bits liveDocs = slow.getLiveDocs();
+    Bits liveDocs = MultiFields.getLiveDocs(reader);
     boolean[] expectedLiveDocs = new boolean[] { true, false, false, true, true, true };
     for (int i = 0; i < expectedLiveDocs.length; i++) {
       assertEquals(expectedLiveDocs[i], liveDocs.get(i));
     }
     
     long[] expectedValues = new long[] { 1, 2, 3, 17, 5, 17};
-    NumericDocValues ndv = slow.getNumericDocValues("val");
+    NumericDocValues ndv = MultiDocValues.getNumericValues(reader, "val");
     for (int i = 0; i < expectedValues.length; i++) {
       assertEquals(expectedValues[i], ndv.get(i));
     }
@@ -460,10 +458,9 @@ public class TestNumericDocValuesUpdates extends LuceneTestCase {
     
     final DirectoryReader reader = DirectoryReader.open(dir);
     
-    LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    NumericDocValues ndv = r.getNumericDocValues("ndv");
-    SortedDocValues sdv = r.getSortedDocValues("sorted");
-    for (int i = 0; i < r.maxDoc(); i++) {
+    NumericDocValues ndv = MultiDocValues.getNumericValues(reader, "ndv");
+    SortedDocValues sdv = MultiDocValues.getSortedValues(reader, "sorted");
+    for (int i = 0; i < reader.maxDoc(); i++) {
       assertEquals(17, ndv.get(i));
       final BytesRef term = sdv.get(i);
       assertEquals(new BytesRef("value"), term);
@@ -491,9 +488,8 @@ public class TestNumericDocValuesUpdates extends LuceneTestCase {
     writer.close();
     
     final DirectoryReader reader = DirectoryReader.open(dir);
-    final LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    NumericDocValues ndv = r.getNumericDocValues("ndv");
-    for (int i = 0; i < r.maxDoc(); i++) {
+    NumericDocValues ndv = MultiDocValues.getNumericValues(reader, "ndv");
+    for (int i = 0; i < reader.maxDoc(); i++) {
       assertEquals(3, ndv.get(i));
     }
     reader.close();
@@ -592,9 +588,8 @@ public class TestNumericDocValuesUpdates extends LuceneTestCase {
     writer.close();
     
     final DirectoryReader reader = DirectoryReader.open(dir);
-    final LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    NumericDocValues ndv = r.getNumericDocValues("ndv");
-    for (int i = 0; i < r.maxDoc(); i++) {
+    NumericDocValues ndv = MultiDocValues.getNumericValues(reader, "ndv");
+    for (int i = 0; i < reader.maxDoc(); i++) {
       assertEquals(3, ndv.get(i));
     }
     reader.close();
@@ -806,7 +801,7 @@ public class TestNumericDocValuesUpdates extends LuceneTestCase {
     writer.close();
     
     reader = DirectoryReader.open(dir);
-    LeafReader ar = getOnlySegmentReader(reader);
+    LeafReader ar = getOnlyLeafReader(reader);
     assertEquals(DocValuesType.NUMERIC, ar.getFieldInfos().fieldInfo("foo").getDocValuesType());
     IndexSearcher searcher = new IndexSearcher(reader);
     TopFieldDocs td;
@@ -1103,9 +1098,8 @@ public class TestNumericDocValuesUpdates extends LuceneTestCase {
     writer.close();
     
     DirectoryReader reader = DirectoryReader.open(dir);
-    LeafReader r = SlowCompositeReaderWrapper.wrap(reader);
-    NumericDocValues f1 = r.getNumericDocValues("f1");
-    NumericDocValues f2 = r.getNumericDocValues("f2");
+    NumericDocValues f1 = MultiDocValues.getNumericValues(reader, "f1");
+    NumericDocValues f2 = MultiDocValues.getNumericValues(reader, "f2");
     assertEquals(12L, f1.get(0));
     assertEquals(13L, f2.get(0));
     assertEquals(17L, f1.get(1));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestOmitNorms.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestOmitNorms.java b/lucene/core/src/test/org/apache/lucene/index/TestOmitNorms.java
index 83dfd19..bc3c3e8 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestOmitNorms.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestOmitNorms.java
@@ -66,7 +66,7 @@ public class TestOmitNorms extends LuceneTestCase {
     // flush
     writer.close();
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(ram));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(ram));
     FieldInfos fi = reader.getFieldInfos();
     assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f1").omitsNorms());
     assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f2").omitsNorms());
@@ -120,7 +120,7 @@ public class TestOmitNorms extends LuceneTestCase {
     // flush
     writer.close();
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(ram));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(ram));
     FieldInfos fi = reader.getFieldInfos();
     assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f1").omitsNorms());
     assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f2").omitsNorms());
@@ -168,7 +168,7 @@ public class TestOmitNorms extends LuceneTestCase {
     // flush
     writer.close();
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(ram));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(ram));
     FieldInfos fi = reader.getFieldInfos();
     assertTrue("OmitNorms field bit should not be set.", !fi.fieldInfo("f1").omitsNorms());
     assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f2").omitsNorms());
@@ -297,7 +297,7 @@ public class TestOmitNorms extends LuceneTestCase {
     // fully merge and validate MultiNorms against single segment.
     riw.forceMerge(1);
     DirectoryReader ir2 = riw.getReader();
-    NumericDocValues norms2 = getOnlySegmentReader(ir2).getNormValues(field);
+    NumericDocValues norms2 = getOnlyLeafReader(ir2).getNormValues(field);
 
     if (norms1 == null) {
       assertNull(norms2);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestOmitPositions.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestOmitPositions.java b/lucene/core/src/test/org/apache/lucene/index/TestOmitPositions.java
index 38c7251..f5a74b5 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestOmitPositions.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestOmitPositions.java
@@ -153,7 +153,7 @@ public class TestOmitPositions extends LuceneTestCase {
     // flush
     writer.close();
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(ram));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(ram));
     FieldInfos fi = reader.getFieldInfos();
     // docs + docs = docs
     assertEquals(IndexOptions.DOCS, fi.fieldInfo("f1").getIndexOptions());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java b/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
index 807c704..3c12a0d 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
@@ -105,7 +105,7 @@ public class TestOmitTf extends LuceneTestCase {
     // flush
     writer.close();
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(ram));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(ram));
     FieldInfos fi = reader.getFieldInfos();
     assertEquals("OmitTermFreqAndPositions field bit should be set.", IndexOptions.DOCS, fi.fieldInfo("f1").getIndexOptions());
     assertEquals("OmitTermFreqAndPositions field bit should be set.", IndexOptions.DOCS, fi.fieldInfo("f2").getIndexOptions());
@@ -157,7 +157,7 @@ public class TestOmitTf extends LuceneTestCase {
     // flush
     writer.close();
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(ram));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(ram));
     FieldInfos fi = reader.getFieldInfos();
     assertEquals("OmitTermFreqAndPositions field bit should be set.", IndexOptions.DOCS, fi.fieldInfo("f1").getIndexOptions());
     assertEquals("OmitTermFreqAndPositions field bit should be set.", IndexOptions.DOCS, fi.fieldInfo("f2").getIndexOptions());
@@ -200,7 +200,7 @@ public class TestOmitTf extends LuceneTestCase {
     // flush
     writer.close();
 
-    SegmentReader reader = getOnlySegmentReader(DirectoryReader.open(ram));
+    LeafReader reader = getOnlyLeafReader(DirectoryReader.open(ram));
     FieldInfos fi = reader.getFieldInfos();
     assertEquals("OmitTermFreqAndPositions field bit should not be set.", IndexOptions.DOCS_AND_FREQS_AND_POSITIONS, fi.fieldInfo("f1").getIndexOptions());
     assertEquals("OmitTermFreqAndPositions field bit should be set.", IndexOptions.DOCS, fi.fieldInfo("f2").getIndexOptions());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestOrdinalMap.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestOrdinalMap.java b/lucene/core/src/test/org/apache/lucene/index/TestOrdinalMap.java
index e0fab18..1f9ff11 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestOrdinalMap.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestOrdinalMap.java
@@ -83,13 +83,12 @@ public class TestOrdinalMap extends LuceneTestCase {
     }
     iw.commit();
     DirectoryReader r = iw.getReader();
-    LeafReader ar = SlowCompositeReaderWrapper.wrap(r);
-    SortedDocValues sdv = ar.getSortedDocValues("sdv");
+    SortedDocValues sdv = MultiDocValues.getSortedValues(r, "sdv");
     if (sdv instanceof MultiSortedDocValues) {
       OrdinalMap map = ((MultiSortedDocValues) sdv).mapping;
       assertEquals(RamUsageTester.sizeOf(map, ORDINAL_MAP_ACCUMULATOR), map.ramBytesUsed());
     }
-    SortedSetDocValues ssdv = ar.getSortedSetDocValues("ssdv");
+    SortedSetDocValues ssdv = MultiDocValues.getSortedSetValues(r, "ssdv");
     if (ssdv instanceof MultiSortedSetDocValues) {
       OrdinalMap map = ((MultiSortedSetDocValues) ssdv).mapping;
       assertEquals(RamUsageTester.sizeOf(map, ORDINAL_MAP_ACCUMULATOR), map.ramBytesUsed());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java b/lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java
index 7078380..166c9e4d 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java
@@ -18,6 +18,8 @@ package org.apache.lucene.index;
 
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Random;
 
 import org.apache.lucene.analysis.MockAnalyzer;
@@ -276,32 +278,6 @@ public class TestParallelCompositeReader extends LuceneTestCase {
     dir2.close();
   }
   
-  public void testIncompatibleIndexes3() throws IOException {
-    Directory dir1 = getDir1(random());
-    Directory dir2 = getDir2(random());
-
-    CompositeReader ir1 = new MultiReader(DirectoryReader.open(dir1), SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1))),
-        ir2 = new MultiReader(DirectoryReader.open(dir2), DirectoryReader.open(dir2));
-    CompositeReader[] readers = new CompositeReader[] {ir1, ir2};
-
-    expectThrows(IllegalArgumentException.class, () -> {
-      new ParallelCompositeReader(readers);
-    });
-
-    expectThrows(IllegalArgumentException.class, () -> {
-      new ParallelCompositeReader(random().nextBoolean(), readers, readers);
-    });
-
-    assertEquals(1, ir1.getRefCount());
-    assertEquals(1, ir2.getRefCount());
-    ir1.close();
-    ir2.close();
-    assertEquals(0, ir1.getRefCount());
-    assertEquals(0, ir2.getRefCount());
-    dir1.close();
-    dir2.close();
-  }
-  
   public void testIgnoreStoredFields() throws IOException {
     Directory dir1 = getDir1(random());
     Directory dir2 = getDir2(random());
@@ -317,7 +293,7 @@ public class TestParallelCompositeReader extends LuceneTestCase {
     assertNull(pr.document(0).get("f3"));
     assertNull(pr.document(0).get("f4"));
     // check that fields are there
-    LeafReader slow = SlowCompositeReaderWrapper.wrap(pr);
+    Fields slow = MultiFields.getFields(pr);
     assertNotNull(slow.terms("f1"));
     assertNotNull(slow.terms("f2"));
     assertNotNull(slow.terms("f3"));
@@ -333,7 +309,7 @@ public class TestParallelCompositeReader extends LuceneTestCase {
     assertNull(pr.document(0).get("f3"));
     assertNull(pr.document(0).get("f4"));
     // check that fields are there
-    slow = SlowCompositeReaderWrapper.wrap(pr);
+    slow = MultiFields.getFields(pr);
     assertNull(slow.terms("f1"));
     assertNull(slow.terms("f2"));
     assertNotNull(slow.terms("f3"));
@@ -349,7 +325,7 @@ public class TestParallelCompositeReader extends LuceneTestCase {
     assertNull(pr.document(0).get("f3"));
     assertNull(pr.document(0).get("f4"));
     // check that fields are there
-    slow = SlowCompositeReaderWrapper.wrap(pr);
+    slow = MultiFields.getFields(pr);
     assertNull(slow.terms("f1"));
     assertNull(slow.terms("f2"));
     assertNotNull(slow.terms("f3"));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestParallelLeafReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestParallelLeafReader.java b/lucene/core/src/test/org/apache/lucene/index/TestParallelLeafReader.java
index 31aa603..f7f401f 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestParallelLeafReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestParallelLeafReader.java
@@ -63,8 +63,8 @@ public class TestParallelLeafReader extends LuceneTestCase {
   public void testFieldNames() throws Exception {
     Directory dir1 = getDir1(random());
     Directory dir2 = getDir2(random());
-    ParallelLeafReader pr = new ParallelLeafReader(SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1)),
-                                                       SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir2)));
+    ParallelLeafReader pr = new ParallelLeafReader(getOnlyLeafReader(DirectoryReader.open(dir1)),
+                                                   getOnlyLeafReader(DirectoryReader.open(dir2)));
     FieldInfos fieldInfos = pr.getFieldInfos();
     assertEquals(4, fieldInfos.size());
     assertNotNull(fieldInfos.fieldInfo("f1"));
@@ -81,8 +81,8 @@ public class TestParallelLeafReader extends LuceneTestCase {
     Directory dir2 = getDir2(random());
     LeafReader ir1, ir2;
     // close subreaders, ParallelReader will not change refCounts, but close on its own close
-    ParallelLeafReader pr = new ParallelLeafReader(ir1 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1)),
-                                                       ir2 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir2)));
+    ParallelLeafReader pr = new ParallelLeafReader(ir1 = getOnlyLeafReader(DirectoryReader.open(dir1)),
+                                                   ir2 = getOnlyLeafReader(DirectoryReader.open(dir2)));
                                                        
     // check RefCounts
     assertEquals(1, ir1.getRefCount());
@@ -97,8 +97,8 @@ public class TestParallelLeafReader extends LuceneTestCase {
   public void testRefCounts2() throws IOException {
     Directory dir1 = getDir1(random());
     Directory dir2 = getDir2(random());
-    LeafReader ir1 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1));
-    LeafReader ir2 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir2));
+    LeafReader ir1 = getOnlyLeafReader(DirectoryReader.open(dir1));
+    LeafReader ir2 = getOnlyLeafReader(DirectoryReader.open(dir2));
     // don't close subreaders, so ParallelReader will increment refcounts
     ParallelLeafReader pr = new ParallelLeafReader(false, ir1, ir2);
     // check RefCounts
@@ -117,7 +117,7 @@ public class TestParallelLeafReader extends LuceneTestCase {
   
   public void testCloseInnerReader() throws Exception {
     Directory dir1 = getDir1(random());
-    LeafReader ir1 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1));
+    LeafReader ir1 = getOnlyLeafReader(DirectoryReader.open(dir1));
     
     // with overlapping
     ParallelLeafReader pr = new ParallelLeafReader(true,
@@ -149,8 +149,8 @@ public class TestParallelLeafReader extends LuceneTestCase {
     w2.addDocument(d3);
     w2.close();
     
-    LeafReader ir1 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1));
-    LeafReader ir2 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir2));
+    LeafReader ir1 = getOnlyLeafReader(DirectoryReader.open(dir1));
+    LeafReader ir2 = getOnlyLeafReader(DirectoryReader.open(dir2));
 
     // indexes don't have the same number of documents
     expectThrows(IllegalArgumentException.class, () -> {
@@ -175,8 +175,8 @@ public class TestParallelLeafReader extends LuceneTestCase {
   public void testIgnoreStoredFields() throws IOException {
     Directory dir1 = getDir1(random());
     Directory dir2 = getDir2(random());
-    LeafReader ir1 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1));
-    LeafReader ir2 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir2));
+    LeafReader ir1 = getOnlyLeafReader(DirectoryReader.open(dir1));
+    LeafReader ir2 = getOnlyLeafReader(DirectoryReader.open(dir2));
     
     // with overlapping
     ParallelLeafReader pr = new ParallelLeafReader(false,
@@ -276,8 +276,8 @@ public class TestParallelLeafReader extends LuceneTestCase {
     dir1 = getDir1(random);
     dir2 = getDir2(random);
     ParallelLeafReader pr = new ParallelLeafReader(
-        SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir1)),
-        SlowCompositeReaderWrapper.wrap(DirectoryReader.open(dir2)));
+        getOnlyLeafReader(DirectoryReader.open(dir1)),
+        getOnlyLeafReader(DirectoryReader.open(dir2)));
     TestUtil.checkReader(pr);
     return newSearcher(pr);
   }
@@ -293,6 +293,7 @@ public class TestParallelLeafReader extends LuceneTestCase {
     d2.add(newTextField("f1", "v2", Field.Store.YES));
     d2.add(newTextField("f2", "v2", Field.Store.YES));
     w1.addDocument(d2);
+    w1.forceMerge(1);
     w1.close();
     return dir1;
   }
@@ -308,6 +309,7 @@ public class TestParallelLeafReader extends LuceneTestCase {
     d4.add(newTextField("f3", "v2", Field.Store.YES));
     d4.add(newTextField("f4", "v2", Field.Store.YES));
     w2.addDocument(d4);
+    w2.forceMerge(1);
     w2.close();
     return dir2;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestParallelReaderEmptyIndex.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestParallelReaderEmptyIndex.java b/lucene/core/src/test/org/apache/lucene/index/TestParallelReaderEmptyIndex.java
index 373a125..61c84dc 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestParallelReaderEmptyIndex.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestParallelReaderEmptyIndex.java
@@ -50,15 +50,7 @@ public class TestParallelReaderEmptyIndex extends LuceneTestCase {
 
     IndexWriter iwOut = new IndexWriter(rdOut, newIndexWriterConfig(new MockAnalyzer(random())));
     
-    ParallelLeafReader apr = new ParallelLeafReader(
-        SlowCompositeReaderWrapper.wrap(DirectoryReader.open(rd1)),
-        SlowCompositeReaderWrapper.wrap(DirectoryReader.open(rd2)));
-    
-    // When unpatched, Lucene crashes here with a NoSuchElementException (caused by ParallelTermEnum)
-    iwOut.addIndexes(SlowCodecReaderWrapper.wrap(apr));
-    iwOut.forceMerge(1);
-    
-    // 2nd try with a readerless parallel reader
+    // add a readerless parallel reader
     iwOut.addIndexes(SlowCodecReaderWrapper.wrap(new ParallelLeafReader()));
     iwOut.forceMerge(1);
 
@@ -136,16 +128,18 @@ public class TestParallelReaderEmptyIndex extends LuceneTestCase {
     Directory rdOut = newDirectory();
 
     IndexWriter iwOut = new IndexWriter(rdOut, newIndexWriterConfig(new MockAnalyzer(random())));
-    final DirectoryReader reader1, reader2;
-    ParallelLeafReader pr = new ParallelLeafReader(
-        SlowCompositeReaderWrapper.wrap(reader1 = DirectoryReader.open(rd1)),
-        SlowCompositeReaderWrapper.wrap(reader2 = DirectoryReader.open(rd2)));
+    DirectoryReader reader1 = DirectoryReader.open(rd1);
+    DirectoryReader reader2 = DirectoryReader.open(rd2);
+    ParallelLeafReader pr = new ParallelLeafReader(false,
+                                                   getOnlyLeafReader(reader1),
+                                                   getOnlyLeafReader(reader2));
 
     // When unpatched, Lucene crashes here with an ArrayIndexOutOfBoundsException (caused by TermVectorsWriter)
     iwOut.addIndexes(SlowCodecReaderWrapper.wrap(pr));
 
-    // ParallelReader closes any IndexReader you added to it:
     pr.close();
+    reader1.close();
+    reader2.close();
     
     // assert subreaders were closed
     assertEquals(0, reader1.getRefCount());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7523ca11/lucene/core/src/test/org/apache/lucene/index/TestParallelTermEnum.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestParallelTermEnum.java b/lucene/core/src/test/org/apache/lucene/index/TestParallelTermEnum.java
index c51fd2d..a83c549 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestParallelTermEnum.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestParallelTermEnum.java
@@ -59,8 +59,8 @@ public class TestParallelTermEnum extends LuceneTestCase {
 
     iw2.close();
 
-    this.ir1 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(rd1));
-    this.ir2 = SlowCompositeReaderWrapper.wrap(DirectoryReader.open(rd2));
+    this.ir1 = getOnlyLeafReader(DirectoryReader.open(rd1));
+    this.ir2 = getOnlyLeafReader(DirectoryReader.open(rd2));
   }
 
   @Override