You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2014/11/20 05:22:41 UTC

svn commit: r1640670 - in /lucene/dev/branches/lucene6065: lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/test/org/apache/lucene/index/ lucene/memory/src/java/org/apache/lucene/index/memory/ lucene/misc/src/java/org/apache/lucene/uninver...

Author: rmuir
Date: Thu Nov 20 04:22:40 2014
New Revision: 1640670

URL: http://svn.apache.org/r1640670
Log:
LUCENE-6065: current state

Added:
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader2.java   (with props)
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader2.java   (with props)
Modified:
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ExitableDirectoryReader.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/IndexReader.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/MergeState.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java
    lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java
    lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestAddIndexes.java
    lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
    lucene/dev/branches/lucene6065/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
    lucene/dev/branches/lucene6065/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java
    lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AllDeletedFilterReader.java
    lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingDirectoryReader.java
    lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
    lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/MockRandomMergePolicy.java
    lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java
    lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java
    lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java
    lucene/dev/branches/lucene6065/solr/core/src/java/org/apache/solr/search/Insanity.java
    lucene/dev/branches/lucene6065/solr/core/src/test/org/apache/solr/search/TestDocSet.java

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java Thu Nov 20 04:22:40 2014
@@ -31,7 +31,12 @@ import java.util.Locale;
 import java.util.Map;
 
 import org.apache.lucene.codecs.Codec;
+import org.apache.lucene.codecs.DocValuesProducer;
+import org.apache.lucene.codecs.FieldsProducer;
+import org.apache.lucene.codecs.NormsProducer;
 import org.apache.lucene.codecs.PostingsFormat;
+import org.apache.lucene.codecs.StoredFieldsReader;
+import org.apache.lucene.codecs.TermVectorsReader;
 import org.apache.lucene.index.CheckIndex.Status.DocValuesStatus;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.store.AlreadyClosedException;
@@ -632,11 +637,6 @@ public class CheckIndex implements Close
 
         segInfoStat.openReaderPassed = true;
         
-        if (infoStream != null)
-          infoStream.print("    test: check integrity.....");
-        reader.checkIntegrity();
-        msg(infoStream, "OK");
-
         if (reader.maxDoc() != info.info.getDocCount()) {
           throw new RuntimeException("SegmentReader.maxDoc() " + reader.maxDoc() + " != SegmentInfos.docCount " + info.info.getDocCount());
         }
@@ -846,6 +846,16 @@ public class CheckIndex implements Close
       if (infoStream != null) {
         infoStream.print("    test: field norms.........");
       }
+      
+      // nocommit: remove instanceof
+      // nocommit: use producer for everything from here, to not load up all norms into RAM!
+      if (reader instanceof LeafReader2) {
+        NormsProducer producer = ((LeafReader2)reader).getNormsReader();
+        if (producer != null) {
+          producer.checkIntegrity();
+        }
+      }
+      
       for (FieldInfo info : reader.getFieldInfos()) {
         if (info.hasNorms()) {
           checkNorms(info, reader, infoStream);
@@ -1451,6 +1461,15 @@ public class CheckIndex implements Close
       if (infoStream != null) {
         infoStream.print("    test: terms, freq, prox...");
       }
+      
+      // nocommit: remove instanceof
+      // nocommit: use producer for everything from here, to not load up all fields into RAM!
+      if (reader instanceof LeafReader2) {
+        FieldsProducer producer = ((LeafReader2)reader).getPostingsReader();
+        if (producer != null) {
+          producer.checkIntegrity();
+        }
+      }
 
       final Fields fields = reader.fields();
       final FieldInfos fieldInfos = reader.getFieldInfos();
@@ -1487,6 +1506,15 @@ public class CheckIndex implements Close
       if (infoStream != null) {
         infoStream.print("    test: stored fields.......");
       }
+      
+      // nocommit: remove instanceof
+      // nocommit: use producer for everything from here, to not load up all fields into RAM!
+      if (reader instanceof LeafReader2) {
+        StoredFieldsReader producer = ((LeafReader2)reader).getFieldsReader();
+        if (producer != null) {
+          producer.checkIntegrity();
+        }
+      }
 
       // Scan stored fields for all documents
       final Bits liveDocs = reader.getLiveDocs();
@@ -1533,6 +1561,16 @@ public class CheckIndex implements Close
       if (infoStream != null) {
         infoStream.print("    test: docvalues...........");
       }
+      
+      // nocommit: remove instanceof
+      // nocommit: use producer for everything from here, to not load up all fields into RAM!
+      if (reader instanceof LeafReader2) {
+        DocValuesProducer producer = ((LeafReader2)reader).getDocValuesReader();
+        if (producer != null) {
+          producer.checkIntegrity();
+        }
+      }
+      
       for (FieldInfo fieldInfo : reader.getFieldInfos()) {
         if (fieldInfo.getDocValuesType() != DocValuesType.NONE) {
           status.totalValueFields++;
@@ -1727,6 +1765,7 @@ public class CheckIndex implements Close
     } else if (docsWithField.length() != reader.maxDoc()) {
       throw new RuntimeException(fi.name + " docsWithField has incorrect length: " + docsWithField.length() + ",expected: " + reader.maxDoc());
     }
+    // nocommit: move these checks to TestUtil.checkReader
     switch(fi.getDocValuesType()) {
       case SORTED:
         status.totalSortedFields++;
@@ -1810,6 +1849,15 @@ public class CheckIndex implements Close
       if (infoStream != null) {
         infoStream.print("    test: term vectors........");
       }
+      
+      // nocommit: remove instanceof
+      // nocommit: use producer for everything from here, to not load up all fields into RAM!
+      if (reader instanceof LeafReader2) {
+        TermVectorsReader producer = ((LeafReader2)reader).getTermVectorsReader();
+        if (producer != null) {
+          producer.checkIntegrity();
+        }
+      }
 
       DocsEnum docs = null;
       DocsAndPositionsEnum postings = null;

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ExitableDirectoryReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ExitableDirectoryReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ExitableDirectoryReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ExitableDirectoryReader.java Thu Nov 20 04:22:40 2014
@@ -90,13 +90,7 @@ public class ExitableDirectoryReader ext
     @Override
     public Object getCoreCacheKey() {
       return in.getCoreCacheKey();  
-    }
-    
-    @Override
-    public Object getCombinedCoreAndDeletesKey() {
-      return in.getCombinedCoreAndDeletesKey();
-    }
-    
+    }    
   }
 
   /**

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java Thu Nov 20 04:22:40 2014
@@ -39,14 +39,12 @@ import org.apache.lucene.util.BytesRef;
  * content the contained reader, you could consider overriding
  * {@link #getCoreCacheKey()} so that
  * {@link CachingWrapperFilter} shares the same entries for this atomic reader
- * and the wrapped one. {@link #getCombinedCoreAndDeletesKey()} could be
- * overridden as well if the {@link #getLiveDocs() live docs} are not changed
- * either.
+ * and the wrapped one.
  */
-public class FilterLeafReader extends LeafReader {
+public abstract class FilterLeafReader extends LeafReader {
 
   /** Get the wrapped instance by <code>reader</code> as long as this reader is
-   *  an intance of {@link FilterLeafReader}.  */
+   *  an instance of {@link FilterLeafReader}.  */
   public static LeafReader unwrap(LeafReader reader) {
     while (reader instanceof FilterLeafReader) {
       reader = ((FilterLeafReader) reader).in;
@@ -462,10 +460,4 @@ public class FilterLeafReader extends Le
     ensureOpen();
     return in.getDocsWithField(field);
   }
-
-  @Override
-  public void checkIntegrity() throws IOException {
-    ensureOpen();
-    in.checkIntegrity();
-  }
 }

Added: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader2.java?rev=1640670&view=auto
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader2.java (added)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader2.java Thu Nov 20 04:22:40 2014
@@ -0,0 +1,144 @@
+package org.apache.lucene.index;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+
+import org.apache.lucene.codecs.DocValuesProducer;
+import org.apache.lucene.codecs.FieldsProducer;
+import org.apache.lucene.codecs.NormsProducer;
+import org.apache.lucene.codecs.StoredFieldsReader;
+import org.apache.lucene.codecs.TermVectorsReader;
+import org.apache.lucene.search.CachingWrapperFilter;
+import org.apache.lucene.util.Bits;
+
+/**  A <code>FilterLeafReader</code> contains another LeafReader, which it
+ * uses as its basic source of data, possibly transforming the data along the
+ * way or providing additional functionality. The class
+ * <code>FilterLeafReader</code> itself simply implements all abstract methods
+ * of <code>IndexReader</code> with versions that pass all requests to the
+ * contained index reader. Subclasses of <code>FilterLeafReader</code> may
+ * further override some of these methods and may also provide additional
+ * methods and fields.
+ * <p><b>NOTE</b>: If you override {@link #getLiveDocs()}, you will likely need
+ * to override {@link #numDocs()} as well and vice-versa.
+ * <p><b>NOTE</b>: If this {@link FilterLeafReader} does not change the
+ * content the contained reader, you could consider overriding
+ * {@link #getCoreCacheKey()} so that
+ * {@link CachingWrapperFilter} shares the same entries for this atomic reader
+ * and the wrapped one.
+ */
+public class FilterLeafReader2 extends LeafReader2 {
+
+  /** Get the wrapped instance by <code>reader</code> as long as this reader is
+   *  an instance of {@link FilterLeafReader}.  */
+  public static LeafReader2 unwrap(LeafReader2 reader) {
+    while (reader instanceof FilterLeafReader2) {
+      reader = ((FilterLeafReader2) reader).in;
+    }
+    return reader;
+  }
+  
+  /** The underlying LeafReader. */
+  protected final LeafReader2 in;
+  
+  /**
+   * <p>Construct a FilterLeafReader based on the specified base reader.
+   * <p>Note that base reader is closed if this FilterLeafReader is closed.</p>
+   * @param in specified base reader.
+   */
+  public FilterLeafReader2(LeafReader2 in) {
+    super();
+    if (in == null) {
+      throw new NullPointerException("incoming LeafReader cannot be null");
+    }
+    this.in = in;
+    in.registerParentReader(this);
+  }
+  
+  @Override
+  protected TermVectorsReader getTermVectorsReader() {
+    return in.getTermVectorsReader();
+  }
+
+  @Override
+  protected StoredFieldsReader getFieldsReader() {
+    return in.getFieldsReader();
+  }
+
+  @Override
+  protected NormsProducer getNormsReader() {
+    return in.getNormsReader();
+  }
+
+  @Override
+  protected DocValuesProducer getDocValuesReader() {
+    return in.getDocValuesReader();
+  }
+
+  @Override
+  protected FieldsProducer getPostingsReader() {
+    return in.getPostingsReader();
+  }
+
+  @Override
+  public void addCoreClosedListener(CoreClosedListener listener) {
+    in.addCoreClosedListener(listener);
+  }
+
+  @Override
+  public void removeCoreClosedListener(CoreClosedListener listener) {
+    in.removeCoreClosedListener(listener);
+  }
+
+  @Override
+  public Bits getLiveDocs() {
+    ensureOpen();
+    return in.getLiveDocs();
+  }
+  
+  @Override
+  public FieldInfos getFieldInfos() {
+    return in.getFieldInfos();
+  }
+
+  @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
+  protected void doClose() throws IOException {
+    in.close();
+  }
+
+  @Override
+  public String toString() {
+    final StringBuilder buffer = new StringBuilder("FilterLeafReader(");
+    buffer.append(in);
+    buffer.append(')');
+    return buffer.toString();
+  }
+}

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/IndexReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/IndexReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/IndexReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/IndexReader.java Thu Nov 20 04:22:40 2014
@@ -110,8 +110,6 @@ public abstract class IndexReader implem
 
   /** Expert: adds a {@link ReaderClosedListener}.  The
    * provided listener will be invoked when this reader is closed.
-   * At this point, it is safe for apps to evict this reader from
-   * any caches keyed on {@link #getCombinedCoreAndDeletesKey()}.
    *
    * @lucene.experimental */
   public final void addReaderClosedListener(ReaderClosedListener listener) {
@@ -283,8 +281,7 @@ public abstract class IndexReader implem
   /** {@inheritDoc}
    * <p>For caching purposes, {@code IndexReader} subclasses are not allowed
    * to implement equals/hashCode, so methods are declared final.
-   * To lookup instances from caches use {@link #getCoreCacheKey} and 
-   * {@link #getCombinedCoreAndDeletesKey}.
+   * To lookup instances from caches use {@link #getCoreCacheKey}.
    */
   @Override
   public final boolean equals(Object obj) {
@@ -294,8 +291,7 @@ public abstract class IndexReader implem
   /** {@inheritDoc}
    * <p>For caching purposes, {@code IndexReader} subclasses are not allowed
    * to implement equals/hashCode, so methods are declared final.
-   * To lookup instances from caches use {@link #getCoreCacheKey} and 
-   * {@link #getCombinedCoreAndDeletesKey}.
+   * To lookup instances from caches use {@link #getCoreCacheKey}.
    */
   @Override
   public final int hashCode() {
@@ -447,15 +443,6 @@ public abstract class IndexReader implem
     return this;
   }
 
-  /** Expert: Returns a key for this IndexReader that also includes deletions,
-   * so CachingWrapperFilter can find it again.
-   * This key must not have equals()/hashCode() methods, so &quot;equals&quot; means &quot;identical&quot;. */
-  public Object getCombinedCoreAndDeletesKey() {
-    // Don't call ensureOpen since FC calls this (to evict)
-    // on close
-    return this;
-  }
-  
   /** Returns the number of documents containing the 
    * <code>term</code>.  This method returns 0 if the term or
    * field does not exists.  This method does not take into

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader.java Thu Nov 20 04:22:40 2014
@@ -318,13 +318,10 @@ public abstract class LeafReader extends
    *  synchronization.
    */
   public abstract Bits getLiveDocs();
-
-  /**
-   * Checks consistency of this reader.
-   * <p>
-   * Note that this may be costly in terms of I/O, e.g.
-   * may involve computing a checksum value against large data files.
-   * @lucene.internal
-   */
-  public abstract void checkIntegrity() throws IOException;
+  
+  // nocommit:
+  // uncomment for compile
+  //public abstract void cutover();
+  // uncomment for testing
+  public void cutover() {}
 }

Added: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader2.java?rev=1640670&view=auto
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader2.java (added)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/LeafReader2.java Thu Nov 20 04:22:40 2014
@@ -0,0 +1,562 @@
+package org.apache.lucene.index;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.lucene.codecs.DocValuesProducer;
+import org.apache.lucene.codecs.FieldsProducer;
+import org.apache.lucene.codecs.NormsProducer;
+import org.apache.lucene.codecs.StoredFieldsReader;
+import org.apache.lucene.codecs.TermVectorsReader;
+import org.apache.lucene.store.AlreadyClosedException;
+import org.apache.lucene.util.Accountable;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.CloseableThreadLocal;
+import org.apache.lucene.util.IOUtils;
+
+/** "this is the new LeafReader" */
+// nocommit: fold into LeafReader when all FilterReaders are converted
+public abstract class LeafReader2 extends LeafReader {
+  
+  /** 
+   * Expert: retrieve thread-private TermVectorsReader
+   * @throws AlreadyClosedException if this reader is closed
+   * @lucene.internal 
+   */
+  protected abstract TermVectorsReader getTermVectorsReader();
+
+  /** 
+   * Expert: retrieve thread-private StoredFieldsReader
+   * @throws AlreadyClosedException if this reader is closed
+   * @lucene.internal 
+   */
+  protected abstract StoredFieldsReader getFieldsReader();
+  
+  /** 
+   * Expert: retrieve underlying NormsProducer
+   * @throws AlreadyClosedException if this reader is closed
+   * @lucene.internal 
+   */
+  protected abstract NormsProducer getNormsReader();
+  
+  /** 
+   * Expert: retrieve underlying DocValuesProducer
+   * @throws AlreadyClosedException if this reader is closed
+   * @lucene.internal 
+   */
+  protected abstract DocValuesProducer getDocValuesReader();
+  
+  /** 
+   * Expert: retrieve underlying FieldsProducer
+   * @throws AlreadyClosedException if this reader is closed
+   * @lucene.internal  
+   */
+  protected abstract FieldsProducer getPostingsReader();
+  
+  @Override
+  public final Fields fields() {
+    return getPostingsReader();
+  }
+  
+  private final void checkBounds(int docID) {
+    if (docID < 0 || docID >= maxDoc()) {       
+      throw new IndexOutOfBoundsException("docID must be >= 0 and < maxDoc=" + maxDoc() + " (got docID=" + docID + ")");
+    }
+  }
+  
+  @Override
+  public final void document(int docID, StoredFieldVisitor visitor) throws IOException {
+    checkBounds(docID);
+    getFieldsReader().visitDocument(docID, visitor);
+  }
+  
+  @Override
+  public final Fields getTermVectors(int docID) throws IOException {
+    TermVectorsReader termVectorsReader = getTermVectorsReader();
+    if (termVectorsReader == null) {
+      return null;
+    }
+    checkBounds(docID);
+    return termVectorsReader.get(docID);
+  }
+  
+  final CloseableThreadLocal<Map<String,Object>> docValuesLocal = new CloseableThreadLocal<Map<String,Object>>() {
+    @Override
+    protected Map<String,Object> initialValue() {
+      return new HashMap<>();
+    }
+  };
+
+  final CloseableThreadLocal<Map<String,Bits>> docsWithFieldLocal = new CloseableThreadLocal<Map<String,Bits>>() {
+    @Override
+    protected Map<String,Bits> initialValue() {
+      return new HashMap<>();
+    }
+  };
+  
+
+  final CloseableThreadLocal<Map<String,Object>> normsLocal = new CloseableThreadLocal<Map<String,Object>>() {
+    @Override
+    protected Map<String,Object> initialValue() {
+      return new HashMap<>();
+    }
+  };
+  
+  // returns the FieldInfo that corresponds to the given field and type, or
+  // null if the field does not exist, or not indexed as the requested
+  // DovDocValuesType.
+  private FieldInfo getDVField(String field, DocValuesType type) {
+    FieldInfo fi = getFieldInfos().fieldInfo(field);
+    if (fi == null) {
+      // Field does not exist
+      return null;
+    }
+    if (fi.getDocValuesType() == DocValuesType.NONE) {
+      // Field was not indexed with doc values
+      return null;
+    }
+    if (fi.getDocValuesType() != type) {
+      // Field DocValues are different than requested type
+      return null;
+    }
+
+    return fi;
+  }
+  
+  @Override
+  public final NumericDocValues getNumericDocValues(String field) throws IOException {
+    ensureOpen();
+    Map<String,Object> dvFields = docValuesLocal.get();
+
+    Object previous = dvFields.get(field);
+    if (previous != null && previous instanceof NumericDocValues) {
+      return (NumericDocValues) previous;
+    } else {
+      FieldInfo fi = getDVField(field, DocValuesType.NUMERIC);
+      if (fi == null) {
+        return null;
+      }
+      NumericDocValues dv = getDocValuesReader().getNumeric(fi);
+      dvFields.put(field, dv);
+      return dv;
+    }
+  }
+  
+  @Override
+  public final Bits getDocsWithField(String field) throws IOException {
+    ensureOpen();
+    Map<String,Bits> dvFields = docsWithFieldLocal.get();
+
+    Bits previous = dvFields.get(field);
+    if (previous != null) {
+      return previous;
+    } else {
+      FieldInfo fi = getFieldInfos().fieldInfo(field);
+      if (fi == null) {
+        // Field does not exist
+        return null;
+      }
+      if (fi.getDocValuesType() == DocValuesType.NONE) {
+        // Field was not indexed with doc values
+        return null;
+      }
+      Bits dv = getDocValuesReader().getDocsWithField(fi);
+      dvFields.put(field, dv);
+      return dv;
+    }
+  }
+
+  @Override
+  public final BinaryDocValues getBinaryDocValues(String field) throws IOException {
+    ensureOpen();
+    FieldInfo fi = getDVField(field, DocValuesType.BINARY);
+    if (fi == null) {
+      return null;
+    }
+
+    Map<String,Object> dvFields = docValuesLocal.get();
+
+    BinaryDocValues dvs = (BinaryDocValues) dvFields.get(field);
+    if (dvs == null) {
+      dvs = getDocValuesReader().getBinary(fi);
+      dvFields.put(field, dvs);
+    }
+
+    return dvs;
+  }
+
+  @Override
+  public final SortedDocValues getSortedDocValues(String field) throws IOException {
+    ensureOpen();
+    Map<String,Object> dvFields = docValuesLocal.get();
+    
+    Object previous = dvFields.get(field);
+    if (previous != null && previous instanceof SortedDocValues) {
+      return (SortedDocValues) previous;
+    } else {
+      FieldInfo fi = getDVField(field, DocValuesType.SORTED);
+      if (fi == null) {
+        return null;
+      }
+      SortedDocValues dv = getDocValuesReader().getSorted(fi);
+      dvFields.put(field, dv);
+      return dv;
+    }
+  }
+  
+  @Override
+  public final SortedNumericDocValues getSortedNumericDocValues(String field) throws IOException {
+    ensureOpen();
+    Map<String,Object> dvFields = docValuesLocal.get();
+
+    Object previous = dvFields.get(field);
+    if (previous != null && previous instanceof SortedNumericDocValues) {
+      return (SortedNumericDocValues) previous;
+    } else {
+      FieldInfo fi = getDVField(field, DocValuesType.SORTED_NUMERIC);
+      if (fi == null) {
+        return null;
+      }
+      SortedNumericDocValues dv = getDocValuesReader().getSortedNumeric(fi);
+      dvFields.put(field, dv);
+      return dv;
+    }
+  }
+
+  @Override
+  public final SortedSetDocValues getSortedSetDocValues(String field) throws IOException {
+    ensureOpen();
+    Map<String,Object> dvFields = docValuesLocal.get();
+    
+    Object previous = dvFields.get(field);
+    if (previous != null && previous instanceof SortedSetDocValues) {
+      return (SortedSetDocValues) previous;
+    } else {
+      FieldInfo fi = getDVField(field, DocValuesType.SORTED_SET);
+      if (fi == null) {
+        return null;
+      }
+      SortedSetDocValues dv = getDocValuesReader().getSortedSet(fi);
+      dvFields.put(field, dv);
+      return dv;
+    }
+  }
+  
+  @Override
+  public final NumericDocValues getNormValues(String field) throws IOException {
+    ensureOpen();
+    Map<String,Object> normFields = normsLocal.get();
+
+    NumericDocValues norms = (NumericDocValues) normFields.get(field);
+    if (norms != null) {
+      return norms;
+    } else {
+      FieldInfo fi = getFieldInfos().fieldInfo(field);
+      if (fi == null || !fi.hasNorms()) {
+        // Field does not exist or does not index norms
+        return null;
+      }
+      norms = getNormsReader().getNorms(fi);
+      normFields.put(field, norms);
+      return norms;
+    }
+  }
+
+  @Override
+  protected void doClose() throws IOException {
+    IOUtils.close(docValuesLocal, docsWithFieldLocal, normsLocal);
+  }
+
+  // nocommit
+  @Override
+  public void cutover() {}
+  
+  // nocommit: this is all cutover API
+  // --------------------------------------------------------------------------
+  public static LeafReader2 hack(final LeafReader reader) throws IOException {
+    if (reader instanceof LeafReader2) {
+      return (LeafReader2) reader;
+    } else {
+      // simulate it, over the old leafReader api      
+      return new LeafReader2() {
+
+        @Override
+        protected TermVectorsReader getTermVectorsReader() {
+          ensureOpen();
+          return readerToTermVectorsReader(reader);
+        }
+
+        @Override
+        protected StoredFieldsReader getFieldsReader() {
+          ensureOpen();
+          return readerToStoredFieldsReader(reader);
+        }
+
+        @Override
+        protected NormsProducer getNormsReader() {
+          ensureOpen();
+          return readerToNormsProducer(reader);
+        }
+
+        @Override
+        protected DocValuesProducer getDocValuesReader() {
+          ensureOpen();
+          return readerToDocValuesProducer(reader);
+        }
+
+        @Override
+        protected FieldsProducer getPostingsReader() {
+          ensureOpen();
+          try {
+            return readerToFieldsProducer(reader);
+          } catch (IOException bogus) {
+            throw new AssertionError(bogus);
+          }
+        }
+
+        @Override
+        public void addCoreClosedListener(CoreClosedListener listener) {
+          reader.addCoreClosedListener(listener);
+        }
+
+        @Override
+        public void removeCoreClosedListener(CoreClosedListener listener) {
+          reader.removeCoreClosedListener(listener);
+        }
+
+        @Override
+        public FieldInfos getFieldInfos() {
+          return reader.getFieldInfos();
+        }
+
+        @Override
+        public Bits getLiveDocs() {
+          return reader.getLiveDocs();
+        }
+
+        @Override
+        public int numDocs() {
+          return reader.numDocs();
+        }
+
+        @Override
+        public int maxDoc() {
+          return reader.maxDoc();
+        }
+
+        @Override
+        public Object getCoreCacheKey() {
+          return reader.getCoreCacheKey();
+        }
+      };
+    }
+  }
+  
+  private static NormsProducer readerToNormsProducer(final LeafReader reader) {
+    return new NormsProducer() {
+
+      @Override
+      public NumericDocValues getNorms(FieldInfo field) throws IOException {
+        return reader.getNormValues(field.name);
+      }
+
+      @Override
+      public void checkIntegrity() throws IOException {
+        // We already checkIntegrity the entire reader up front in SegmentMerger
+      }
+
+      @Override
+      public void close() {
+      }
+
+      @Override
+      public long ramBytesUsed() {
+        return 0;
+      }
+
+      @Override
+      public Iterable<? extends Accountable> getChildResources() {
+        return Collections.emptyList();
+      }
+    };
+  }
+
+  private static DocValuesProducer readerToDocValuesProducer(final LeafReader reader) {
+    return new DocValuesProducer() {
+
+      @Override
+      public NumericDocValues getNumeric(FieldInfo field) throws IOException {  
+        return reader.getNumericDocValues(field.name);
+      }
+
+      @Override
+      public BinaryDocValues getBinary(FieldInfo field) throws IOException {
+        return reader.getBinaryDocValues(field.name);
+      }
+
+      @Override
+      public SortedDocValues getSorted(FieldInfo field) throws IOException {
+        return reader.getSortedDocValues(field.name);
+      }
+
+      @Override
+      public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOException {
+        return reader.getSortedNumericDocValues(field.name);
+      }
+
+      @Override
+      public SortedSetDocValues getSortedSet(FieldInfo field) throws IOException {
+        return reader.getSortedSetDocValues(field.name);
+      }
+
+      @Override
+      public Bits getDocsWithField(FieldInfo field) throws IOException {
+        return reader.getDocsWithField(field.name);
+      }
+
+      @Override
+      public void checkIntegrity() throws IOException {
+        // We already checkIntegrity the entire reader up front in SegmentMerger
+      }
+
+      @Override
+      public void close() {
+      }
+
+      @Override
+      public long ramBytesUsed() {
+        return 0;
+      }
+
+      @Override
+      public Iterable<? extends Accountable> getChildResources() {
+        return Collections.emptyList();
+      }
+    };
+  }
+
+  private static StoredFieldsReader readerToStoredFieldsReader(final LeafReader reader) {
+    return new StoredFieldsReader() {
+      @Override
+      public void visitDocument(int docID, StoredFieldVisitor visitor) throws IOException {
+        reader.document(docID, visitor);
+      }
+
+      @Override
+      public StoredFieldsReader clone() {
+        return readerToStoredFieldsReader(reader);
+      }
+
+      @Override
+      public void checkIntegrity() throws IOException {
+        // We already checkIntegrity the entire reader up front in SegmentMerger
+      }
+
+      @Override
+      public void close() {
+      }
+
+      @Override
+      public long ramBytesUsed() {
+        return 0;
+      }
+
+      @Override
+      public Iterable<? extends Accountable> getChildResources() {
+        return Collections.emptyList();
+      }
+    };
+  }
+
+  private static TermVectorsReader readerToTermVectorsReader(final LeafReader reader) {
+    return new TermVectorsReader() {
+      @Override
+      public Fields get(int docID) throws IOException {
+        return reader.getTermVectors(docID);
+      }
+
+      @Override
+      public TermVectorsReader clone() {
+        return readerToTermVectorsReader(reader);
+      }
+
+      @Override
+      public void checkIntegrity() throws IOException {
+        // We already checkIntegrity the entire reader up front in SegmentMerger
+      }
+
+      @Override
+      public void close() {
+      }
+
+      @Override
+      public long ramBytesUsed() {
+        return 0;
+      }
+
+      @Override
+      public Iterable<? extends Accountable> getChildResources() {
+        return Collections.emptyList();
+      }
+    };
+  }
+
+  private static FieldsProducer readerToFieldsProducer(final LeafReader reader) throws IOException {
+    final Fields fields = reader.fields();
+    return new FieldsProducer() {
+      @Override
+      public Iterator<String> iterator() {
+        return fields.iterator();
+      }
+
+      @Override
+      public Terms terms(String field) throws IOException {
+        return fields.terms(field);
+      }
+
+      @Override
+      public int size() {
+        return fields.size();
+      }
+
+      @Override
+      public void checkIntegrity() throws IOException {
+        // We already checkIntegrity the entire reader up front in SegmentMerger
+      }
+
+      @Override
+      public void close() {
+      }
+
+      @Override
+      public long ramBytesUsed() {
+        return 0;
+      }
+
+      @Override
+      public Iterable<? extends Accountable> getChildResources() {
+        return Collections.emptyList();
+      }
+    };
+  }
+}

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/MergeState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/MergeState.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/MergeState.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/MergeState.java Thu Nov 20 04:22:40 2014
@@ -18,8 +18,6 @@ package org.apache.lucene.index;
  */
 
 import java.io.IOException;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.lucene.codecs.DocValuesProducer;
@@ -28,7 +26,6 @@ import org.apache.lucene.codecs.NormsPro
 import org.apache.lucene.codecs.StoredFieldsReader;
 import org.apache.lucene.codecs.TermVectorsReader;
 import org.apache.lucene.store.Directory;
-import org.apache.lucene.util.Accountable;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.InfoStream;
 import org.apache.lucene.util.packed.PackedInts;
@@ -108,47 +105,33 @@ public class MergeState {
       liveDocs[i] = reader.getLiveDocs();
       fieldInfos[i] = reader.getFieldInfos();
 
-      NormsProducer normsProducer;
-      DocValuesProducer docValuesProducer;
-      StoredFieldsReader storedFieldsReader;
-      TermVectorsReader termVectorsReader;
-      FieldsProducer fieldsProducer;
-      if (reader instanceof SegmentReader) {
-        SegmentReader segmentReader = (SegmentReader) reader;
-        normsProducer = segmentReader.getNormsReader();
-        if (normsProducer != null) {
-          normsProducer = normsProducer.getMergeInstance();
-        }
-        docValuesProducer = segmentReader.getDocValuesReader();
-        if (docValuesProducer != null) {
-          docValuesProducer = docValuesProducer.getMergeInstance();
-        }
-        storedFieldsReader = segmentReader.getFieldsReader();
-        if (storedFieldsReader != null) {
-          storedFieldsReader = storedFieldsReader.getMergeInstance();
-        }
-        termVectorsReader = segmentReader.getTermVectorsReader();
-        if (termVectorsReader != null) {
-          termVectorsReader = termVectorsReader.getMergeInstance();
-        }
-        fieldsProducer = segmentReader.fields();
-        if (fieldsProducer != null) {
-          fieldsProducer = fieldsProducer.getMergeInstance();
-        }
-      } else {
-        // A "foreign" reader
-        normsProducer = readerToNormsProducer(reader);
-        docValuesProducer = readerToDocValuesProducer(reader);
-        storedFieldsReader = readerToStoredFieldsReader(reader);
-        termVectorsReader = readerToTermVectorsReader(reader);
-        fieldsProducer = readerToFieldsProducer(reader);
+      // nocommit
+      LeafReader2 coreReader = LeafReader2.hack(reader);
+      
+      normsProducers[i] = coreReader.getNormsReader();
+      if (normsProducers[i] != null) {
+        normsProducers[i] = normsProducers[i].getMergeInstance();
+      }
+      
+      docValuesProducers[i] = coreReader.getDocValuesReader();
+      if (docValuesProducers[i] != null) {
+        docValuesProducers[i] = docValuesProducers[i].getMergeInstance();
+      }
+      
+      storedFieldsReaders[i] = coreReader.getFieldsReader();
+      if (storedFieldsReaders[i] != null) {
+        storedFieldsReaders[i] = storedFieldsReaders[i].getMergeInstance();
+      }
+      
+      termVectorsReaders[i] = coreReader.getTermVectorsReader();
+      if (termVectorsReaders[i] != null) {
+        termVectorsReaders[i] = termVectorsReaders[i].getMergeInstance();
+      }
+      
+      fieldsProducers[i] = coreReader.getPostingsReader();
+      if (fieldsProducers[i] != null) {
+        fieldsProducers[i] = fieldsProducers[i].getMergeInstance();
       }
-
-      normsProducers[i] = normsProducer;
-      docValuesProducers[i] = docValuesProducer;
-      storedFieldsReaders[i] = storedFieldsReader;
-      termVectorsReaders[i] = termVectorsReader;
-      fieldsProducers[i] = fieldsProducer;
     }
 
     this.segmentInfo = segmentInfo;
@@ -158,193 +141,7 @@ public class MergeState {
     setDocMaps(readers);
   }
 
-  private NormsProducer readerToNormsProducer(final LeafReader reader) {
-    return new NormsProducer() {
-
-      @Override
-      public NumericDocValues getNorms(FieldInfo field) throws IOException {
-        return reader.getNormValues(field.name);
-      }
-
-      @Override
-      public void checkIntegrity() throws IOException {
-        // We already checkIntegrity the entire reader up front in SegmentMerger
-      }
-
-      @Override
-      public void close() {
-      }
-
-      @Override
-      public long ramBytesUsed() {
-        return 0;
-      }
-
-      @Override
-      public Iterable<? extends Accountable> getChildResources() {
-        return Collections.emptyList();
-      }
-    };
-  }
-
-  private DocValuesProducer readerToDocValuesProducer(final LeafReader reader) {
-    return new DocValuesProducer() {
-
-      @Override
-      public NumericDocValues getNumeric(FieldInfo field) throws IOException {  
-        return reader.getNumericDocValues(field.name);
-      }
-
-      @Override
-      public BinaryDocValues getBinary(FieldInfo field) throws IOException {
-        return reader.getBinaryDocValues(field.name);
-      }
-
-      @Override
-      public SortedDocValues getSorted(FieldInfo field) throws IOException {
-        return reader.getSortedDocValues(field.name);
-      }
-
-      @Override
-      public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOException {
-        return reader.getSortedNumericDocValues(field.name);
-      }
-
-      @Override
-      public SortedSetDocValues getSortedSet(FieldInfo field) throws IOException {
-        return reader.getSortedSetDocValues(field.name);
-      }
-
-      @Override
-      public Bits getDocsWithField(FieldInfo field) throws IOException {
-        return reader.getDocsWithField(field.name);
-      }
-
-      @Override
-      public void checkIntegrity() throws IOException {
-        // We already checkIntegrity the entire reader up front in SegmentMerger
-      }
-
-      @Override
-      public void close() {
-      }
-
-      @Override
-      public long ramBytesUsed() {
-        return 0;
-      }
-
-      @Override
-      public Iterable<? extends Accountable> getChildResources() {
-        return Collections.emptyList();
-      }
-    };
-  }
-
-  private StoredFieldsReader readerToStoredFieldsReader(final LeafReader reader) {
-    return new StoredFieldsReader() {
-      @Override
-      public void visitDocument(int docID, StoredFieldVisitor visitor) throws IOException {
-        reader.document(docID, visitor);
-      }
-
-      @Override
-      public StoredFieldsReader clone() {
-        return readerToStoredFieldsReader(reader);
-      }
-
-      @Override
-      public void checkIntegrity() throws IOException {
-        // We already checkIntegrity the entire reader up front in SegmentMerger
-      }
-
-      @Override
-      public void close() {
-      }
-
-      @Override
-      public long ramBytesUsed() {
-        return 0;
-      }
-
-      @Override
-      public Iterable<? extends Accountable> getChildResources() {
-        return Collections.emptyList();
-      }
-    };
-  }
-
-  private TermVectorsReader readerToTermVectorsReader(final LeafReader reader) {
-    return new TermVectorsReader() {
-      @Override
-      public Fields get(int docID) throws IOException {
-        return reader.getTermVectors(docID);
-      }
-
-      @Override
-      public TermVectorsReader clone() {
-        return readerToTermVectorsReader(reader);
-      }
 
-      @Override
-      public void checkIntegrity() throws IOException {
-        // We already checkIntegrity the entire reader up front in SegmentMerger
-      }
-
-      @Override
-      public void close() {
-      }
-
-      @Override
-      public long ramBytesUsed() {
-        return 0;
-      }
-
-      @Override
-      public Iterable<? extends Accountable> getChildResources() {
-        return Collections.emptyList();
-      }
-    };
-  }
-
-  private FieldsProducer readerToFieldsProducer(final LeafReader reader) throws IOException {
-    final Fields fields = reader.fields();
-    return new FieldsProducer() {
-      @Override
-      public Iterator<String> iterator() {
-        return fields.iterator();
-      }
-
-      @Override
-      public Terms terms(String field) throws IOException {
-        return fields.terms(field);
-      }
-
-      @Override
-      public int size() {
-        return fields.size();
-      }
-
-      @Override
-      public void checkIntegrity() throws IOException {
-        // We already checkIntegrity the entire reader up front in SegmentMerger
-      }
-
-      @Override
-      public void close() {
-      }
-
-      @Override
-      public long ramBytesUsed() {
-        return 0;
-      }
-
-      @Override
-      public Iterable<? extends Accountable> getChildResources() {
-        return Collections.emptyList();
-      }
-    };
-  }
 
   // NOTE: removes any "all deleted" readers from mergeState.readers
   private void setDocMaps(List<LeafReader> readers) throws IOException {

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java Thu Nov 20 04:22:40 2014
@@ -316,12 +316,4 @@ public class ParallelLeafReader extends 
     NumericDocValues values = reader == null ? null : reader.getNormValues(field);
     return values;
   }
-
-  @Override
-  public void checkIntegrity() throws IOException {
-    ensureOpen();
-    for (LeafReader reader : completeReaderSet) {
-      reader.checkIntegrity();
-    }
-  }
 }

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java Thu Nov 20 04:22:40 2014
@@ -19,9 +19,7 @@ package org.apache.lucene.index;
 
 import java.io.IOException;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.LinkedHashSet;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -67,8 +65,7 @@ final class SegmentCoreReaders implement
   final FieldInfos coreFieldInfos;
 
   // TODO: make a single thread local w/ a
-  // Thingy class holding fieldsReader, termVectorsReader,
-  // normsProducer
+  // Thingy class holding fieldsReader, termVectorsReader
 
   final CloseableThreadLocal<StoredFieldsReader> fieldsReaderLocal = new CloseableThreadLocal<StoredFieldsReader>() {
     @Override
@@ -84,13 +81,6 @@ final class SegmentCoreReaders implement
     }
   };
 
-  final CloseableThreadLocal<Map<String,Object>> normsLocal = new CloseableThreadLocal<Map<String,Object>>() {
-    @Override
-    protected Map<String,Object> initialValue() {
-      return new HashMap<>();
-    }
-  };
-
   private final Set<CoreClosedListener> coreClosedListeners = 
       Collections.synchronizedSet(new LinkedHashSet<CoreClosedListener>());
   
@@ -157,32 +147,13 @@ final class SegmentCoreReaders implement
     throw new AlreadyClosedException("SegmentCoreReaders is already closed");
   }
 
-  NumericDocValues getNormValues(FieldInfos infos, String field) throws IOException {
-    Map<String,Object> normFields = normsLocal.get();
-
-    NumericDocValues norms = (NumericDocValues) normFields.get(field);
-    if (norms != null) {
-      return norms;
-    } else {
-      FieldInfo fi = infos.fieldInfo(field);
-      if (fi == null || !fi.hasNorms()) {
-        // Field does not exist or does not index norms
-        return null;
-      }
-      assert normsProducer != null;
-      norms = normsProducer.getNorms(fi);
-      normFields.put(field, norms);
-      return norms;
-    }
-  }
-
   void decRef() throws IOException {
     if (ref.decrementAndGet() == 0) {
 //      System.err.println("--- closing core readers");
       Throwable th = null;
       try {
-        IOUtils.close(termVectorsLocal, fieldsReaderLocal, normsLocal, fields, termVectorsReaderOrig, fieldsReaderOrig,
-            cfsReader, normsProducer);
+        IOUtils.close(termVectorsLocal, fieldsReaderLocal, fields, termVectorsReaderOrig, fieldsReaderOrig,
+                      cfsReader, normsProducer);
       } catch (Throwable throwable) {
         th = throwable;
       } finally {

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java Thu Nov 20 04:22:40 2014
@@ -51,15 +51,6 @@ final class SegmentMerger {
   // note, just like in codec apis Directory 'dir' is NOT the same as segmentInfo.dir!!
   SegmentMerger(List<LeafReader> readers, SegmentInfo segmentInfo, InfoStream infoStream, Directory dir,
                 MergeState.CheckAbort checkAbort, FieldInfos.FieldNumbers fieldNumbers, IOContext context) throws IOException {
-    // validate incoming readers
-    for (LeafReader reader : readers) {
-      if ((reader instanceof SegmentReader) == false) {
-        // We only validate foreign readers up front: each index component
-        // calls .checkIntegrity itself for each incoming producer
-        reader.checkIntegrity();
-      }
-    }
-
     mergeState = new MergeState(readers, segmentInfo, infoStream, checkAbort);
     directory = dir;
     this.codec = segmentInfo.getCodec();

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java Thu Nov 20 04:22:40 2014
@@ -20,9 +20,7 @@ package org.apache.lucene.index;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.apache.lucene.codecs.Codec;
 import org.apache.lucene.codecs.DocValuesProducer;
@@ -36,8 +34,6 @@ import org.apache.lucene.store.IOContext
 import org.apache.lucene.util.Accountable;
 import org.apache.lucene.util.Accountables;
 import org.apache.lucene.util.Bits;
-import org.apache.lucene.util.CloseableThreadLocal;
-import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.RamUsageEstimator;
 
 /**
@@ -47,7 +43,7 @@ import org.apache.lucene.util.RamUsageEs
  * may share the same core data.
  * @lucene.experimental
  */
-public final class SegmentReader extends LeafReader implements Accountable {
+public final class SegmentReader extends LeafReader2 implements Accountable {
 
   private static final long BASE_RAM_BYTES_USED =
         RamUsageEstimator.shallowSizeOfInstance(SegmentReader.class)
@@ -63,21 +59,6 @@ public final class SegmentReader extends
 
   final SegmentCoreReaders core;
   final SegmentDocValues segDocValues;
-  
-  final CloseableThreadLocal<Map<String,Object>> docValuesLocal = new CloseableThreadLocal<Map<String,Object>>() {
-    @Override
-    protected Map<String,Object> initialValue() {
-      return new HashMap<>();
-    }
-  };
-
-  final CloseableThreadLocal<Map<String,Bits>> docsWithFieldLocal = new CloseableThreadLocal<Map<String,Bits>>() {
-    @Override
-    protected Map<String,Bits> initialValue() {
-      return new HashMap<>();
-    }
-  };
-
   final DocValuesProducer docValuesProducer;
   final FieldInfos fieldInfos;
   
@@ -196,7 +177,7 @@ public final class SegmentReader extends
       core.decRef();
     } finally {
       try {
-        IOUtils.close(docValuesLocal, docsWithFieldLocal);
+        super.doClose();
       } finally {
         if (docValuesProducer instanceof SegmentDocValuesProducer) {
           segDocValues.decRef(((SegmentDocValuesProducer)docValuesProducer).dvGens);
@@ -212,18 +193,6 @@ public final class SegmentReader extends
     ensureOpen();
     return fieldInfos;
   }
-  
-  @Override
-  public void document(int docID, StoredFieldVisitor visitor) throws IOException {
-    checkBounds(docID);
-    getFieldsReader().visitDocument(docID, visitor);
-  }
-
-  @Override
-  public FieldsProducer fields() {
-    ensureOpen();
-    return core.fields;
-  }
 
   @Override
   public int numDocs() {
@@ -237,50 +206,34 @@ public final class SegmentReader extends
     return si.info.getDocCount();
   }
 
-  /** Expert: retrieve thread-private {@link
-   *  TermVectorsReader}
-   *  @lucene.internal */
-  public TermVectorsReader getTermVectorsReader() {
+  @Override
+  protected TermVectorsReader getTermVectorsReader() {
     ensureOpen();
     return core.termVectorsLocal.get();
   }
 
-  /** Expert: retrieve thread-private {@link
-   *  StoredFieldsReader}
-   *  @lucene.internal */
-  public StoredFieldsReader getFieldsReader() {
+  @Override
+  protected StoredFieldsReader getFieldsReader() {
     ensureOpen();
     return core.fieldsReaderLocal.get();
   }
   
-  /** Expert: retrieve underlying NormsProducer
-   *  @lucene.internal */
-  public NormsProducer getNormsReader() {
+  @Override
+  protected NormsProducer getNormsReader() {
     ensureOpen();
     return core.normsProducer;
   }
   
-  /** Expert: retrieve underlying DocValuesProducer
-   *  @lucene.internal */
-  public DocValuesProducer getDocValuesReader() {
+  @Override
+  protected DocValuesProducer getDocValuesReader() {
     ensureOpen();
     return docValuesProducer;
   }
 
   @Override
-  public Fields getTermVectors(int docID) throws IOException {
-    TermVectorsReader termVectorsReader = getTermVectorsReader();
-    if (termVectorsReader == null) {
-      return null;
-    }
-    checkBounds(docID);
-    return termVectorsReader.get(docID);
-  }
-  
-  private void checkBounds(int docID) {
-    if (docID < 0 || docID >= maxDoc()) {       
-      throw new IndexOutOfBoundsException("docID must be >= 0 and < maxDoc=" + maxDoc() + " (got docID=" + docID + ")");
-    }
+  public FieldsProducer getPostingsReader() {
+    ensureOpen();
+    return core.fields;
   }
 
   @Override
@@ -322,157 +275,6 @@ public final class SegmentReader extends
     // Today it passes "this" as its coreCacheKey:
     return core;
   }
-
-  @Override
-  public Object getCombinedCoreAndDeletesKey() {
-    return this;
-  }
-
-  // returns the FieldInfo that corresponds to the given field and type, or
-  // null if the field does not exist, or not indexed as the requested
-  // DovDocValuesType.
-  private FieldInfo getDVField(String field, DocValuesType type) {
-    FieldInfo fi = fieldInfos.fieldInfo(field);
-    if (fi == null) {
-      // Field does not exist
-      return null;
-    }
-    if (fi.getDocValuesType() == DocValuesType.NONE) {
-      // Field was not indexed with doc values
-      return null;
-    }
-    if (fi.getDocValuesType() != type) {
-      // Field DocValues are different than requested type
-      return null;
-    }
-
-    return fi;
-  }
-  
-  @Override
-  public NumericDocValues getNumericDocValues(String field) throws IOException {
-    ensureOpen();
-    Map<String,Object> dvFields = docValuesLocal.get();
-
-    Object previous = dvFields.get(field);
-    if (previous != null && previous instanceof NumericDocValues) {
-      return (NumericDocValues) previous;
-    } else {
-      FieldInfo fi = getDVField(field, DocValuesType.NUMERIC);
-      if (fi == null) {
-        return null;
-      }
-      NumericDocValues dv = docValuesProducer.getNumeric(fi);
-      dvFields.put(field, dv);
-      return dv;
-    }
-  }
-
-  @Override
-  public Bits getDocsWithField(String field) throws IOException {
-    ensureOpen();
-    Map<String,Bits> dvFields = docsWithFieldLocal.get();
-
-    Bits previous = dvFields.get(field);
-    if (previous != null) {
-      return previous;
-    } else {
-      FieldInfo fi = fieldInfos.fieldInfo(field);
-      if (fi == null) {
-        // Field does not exist
-        return null;
-      }
-      if (fi.getDocValuesType() == DocValuesType.NONE) {
-        // Field was not indexed with doc values
-        return null;
-      }
-      Bits dv = docValuesProducer.getDocsWithField(fi);
-      dvFields.put(field, dv);
-      return dv;
-    }
-  }
-
-  @Override
-  public BinaryDocValues getBinaryDocValues(String field) throws IOException {
-    ensureOpen();
-    FieldInfo fi = getDVField(field, DocValuesType.BINARY);
-    if (fi == null) {
-      return null;
-    }
-
-    Map<String,Object> dvFields = docValuesLocal.get();
-
-    BinaryDocValues dvs = (BinaryDocValues) dvFields.get(field);
-    if (dvs == null) {
-      dvs = docValuesProducer.getBinary(fi);
-      dvFields.put(field, dvs);
-    }
-
-    return dvs;
-  }
-
-  @Override
-  public SortedDocValues getSortedDocValues(String field) throws IOException {
-    ensureOpen();
-    Map<String,Object> dvFields = docValuesLocal.get();
-    
-    Object previous = dvFields.get(field);
-    if (previous != null && previous instanceof SortedDocValues) {
-      return (SortedDocValues) previous;
-    } else {
-      FieldInfo fi = getDVField(field, DocValuesType.SORTED);
-      if (fi == null) {
-        return null;
-      }
-      SortedDocValues dv = docValuesProducer.getSorted(fi);
-      dvFields.put(field, dv);
-      return dv;
-    }
-  }
-  
-  @Override
-  public SortedNumericDocValues getSortedNumericDocValues(String field) throws IOException {
-    ensureOpen();
-    Map<String,Object> dvFields = docValuesLocal.get();
-
-    Object previous = dvFields.get(field);
-    if (previous != null && previous instanceof SortedNumericDocValues) {
-      return (SortedNumericDocValues) previous;
-    } else {
-      FieldInfo fi = getDVField(field, DocValuesType.SORTED_NUMERIC);
-      if (fi == null) {
-        return null;
-      }
-      SortedNumericDocValues dv = docValuesProducer.getSortedNumeric(fi);
-      dvFields.put(field, dv);
-      return dv;
-    }
-  }
-
-  @Override
-  public SortedSetDocValues getSortedSetDocValues(String field) throws IOException {
-    ensureOpen();
-    Map<String,Object> dvFields = docValuesLocal.get();
-    
-    Object previous = dvFields.get(field);
-    if (previous != null && previous instanceof SortedSetDocValues) {
-      return (SortedSetDocValues) previous;
-    } else {
-      FieldInfo fi = getDVField(field, DocValuesType.SORTED_SET);
-      if (fi == null) {
-        return null;
-      }
-      SortedSetDocValues dv = docValuesProducer.getSortedSet(fi);
-      dvFields.put(field, dv);
-      return dv;
-    }
-  }
-
-  @Override
-  public NumericDocValues getNormValues(String field) throws IOException {
-    ensureOpen();
-    return core.getNormValues(fieldInfos, field);
-  }
   
   @Override
   public void addCoreClosedListener(CoreClosedListener listener) {
@@ -520,33 +322,4 @@ public final class SegmentReader extends
     }
     return resources;
   }
-
-  @Override
-  public void checkIntegrity() throws IOException {
-    ensureOpen();
-
-    // stored fields
-    getFieldsReader().checkIntegrity();
-    
-    // term vectors
-    TermVectorsReader termVectorsReader = getTermVectorsReader();
-    if (termVectorsReader != null) {
-      termVectorsReader.checkIntegrity();
-    }
-    
-    // terms/postings
-    if (core.fields != null) {
-      core.fields.checkIntegrity();
-    }
-    
-    // norms
-    if (core.normsProducer != null) {
-      core.normsProducer.checkIntegrity();
-    }
-    
-    // docvalues
-    if (docValuesProducer != null) {
-      docValuesProducer.checkIntegrity();
-    }
-  }
 }

Modified: lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/java/org/apache/lucene/index/SlowCompositeReaderWrapper.java Thu Nov 20 04:22:40 2014
@@ -243,21 +243,8 @@ public final class SlowCompositeReaderWr
   }
 
   @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();
-    }
-  }
 }

Modified: lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestAddIndexes.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestAddIndexes.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestAddIndexes.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestAddIndexes.java Thu Nov 20 04:22:40 2014
@@ -1239,7 +1239,7 @@ public class TestAddIndexes extends Luce
     Directory src = newDirectory(), dest = newDirectory();
     RandomIndexWriter w = new RandomIndexWriter(random(), src);
     w.addDocument(new Document());
-    IndexReader allDeletedReader = new AllDeletedFilterReader(w.getReader().leaves().get(0).reader());
+    IndexReader allDeletedReader = new AllDeletedFilterReader(LeafReader2.hack(w.getReader().leaves().get(0).reader()));
     w.close();
     
     w = new RandomIndexWriter(random(), dest);

Modified: lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java (original)
+++ lucene/dev/branches/lucene6065/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java Thu Nov 20 04:22:40 2014
@@ -44,7 +44,7 @@ public class TestIndexReaderClose extend
       DirectoryReader open = DirectoryReader.open(dir);
       final boolean throwOnClose = !rarely();
       LeafReader wrap = SlowCompositeReaderWrapper.wrap(open);
-      FilterLeafReader reader = new FilterLeafReader(wrap) {
+      FilterLeafReader2 reader = new FilterLeafReader2(LeafReader2.hack(wrap)) {
         @Override
         protected void doClose() throws IOException {
           super.doClose();

Modified: lucene/dev/branches/lucene6065/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (original)
+++ lucene/dev/branches/lucene6065/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java Thu Nov 20 04:22:40 2014
@@ -821,11 +821,6 @@ public class MemoryIndex {
       return null;
     }
 
-    @Override
-    public void checkIntegrity() throws IOException {
-      // no-op
-    }
-
     private class MemoryFields extends Fields {
       @Override
       public Iterator<String> iterator() {

Modified: lucene/dev/branches/lucene6065/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java Thu Nov 20 04:22:40 2014
@@ -304,11 +304,6 @@ public class UninvertingReader extends F
   }
 
   @Override
-  public Object getCombinedCoreAndDeletesKey() {
-    return in.getCombinedCoreAndDeletesKey();
-  }
-
-  @Override
   public String toString() {
     return "Uninverting(" + in.toString() + ")";
   }

Modified: lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AllDeletedFilterReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AllDeletedFilterReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AllDeletedFilterReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AllDeletedFilterReader.java Thu Nov 20 04:22:40 2014
@@ -22,10 +22,10 @@ import org.apache.lucene.util.Bits;
 /**
  * Filters the incoming reader and makes all documents appear deleted.
  */
-public class AllDeletedFilterReader extends FilterLeafReader {
+public class AllDeletedFilterReader extends FilterLeafReader2 {
   final Bits liveDocs;
   
-  public AllDeletedFilterReader(LeafReader in) {
+  public AllDeletedFilterReader(LeafReader2 in) {
     super(in);
     liveDocs = new Bits.MatchNoBits(in.maxDoc());
     assert maxDoc() == 0 || hasDeletions();

Modified: lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingDirectoryReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingDirectoryReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingDirectoryReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingDirectoryReader.java Thu Nov 20 04:22:40 2014
@@ -44,9 +44,4 @@ public class AssertingDirectoryReader ex
     return in.getCoreCacheKey();
   }
 
-  @Override
-  public Object getCombinedCoreAndDeletesKey() {
-    return in.getCombinedCoreAndDeletesKey();
-  }
-
 }

Modified: lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java (original)
+++ lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java Thu Nov 20 04:22:40 2014
@@ -814,11 +814,6 @@ public class AssertingLeafReader extends
   public Object getCoreCacheKey() {
     return cacheKey;
   }
-
-  @Override
-  public Object getCombinedCoreAndDeletesKey() {
-    return cacheKey;
-  }
   
   private final Object cacheKey = new Object();
 }

Modified: lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/MockRandomMergePolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/MockRandomMergePolicy.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/MockRandomMergePolicy.java (original)
+++ lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/MockRandomMergePolicy.java Thu Nov 20 04:22:40 2014
@@ -32,21 +32,12 @@ import org.apache.lucene.util.TestUtil;
  */
 public class MockRandomMergePolicy extends MergePolicy {
   private final Random random;
-  boolean doNonBulkMerges = true;
 
   public MockRandomMergePolicy(Random random) {
     // fork a private random, since we are called
     // unpredictably from threads:
     this.random = new Random(random.nextLong());
   }
-  
-  /** 
-   * Set to true if sometimes readers to be merged should be wrapped in a FilterReader
-   * to mixup bulk merging.
-   */
-  public void setDoNonBulkMerges(boolean v) {
-    doNonBulkMerges = v;
-  }
 
   @Override
   public MergeSpecification findMerges(MergeTrigger mergeTrigger, SegmentInfos segmentInfos, IndexWriter writer) {
@@ -73,11 +64,7 @@ public class MockRandomMergePolicy exten
       // TODO: sometimes make more than 1 merge?
       mergeSpec = new MergeSpecification();
       final int segsToMerge = TestUtil.nextInt(random, 1, numSegments);
-      if (doNonBulkMerges) {
-        mergeSpec.add(new MockRandomOneMerge(segments.subList(0, segsToMerge),random.nextLong()));
-      } else {
-        mergeSpec.add(new OneMerge(segments.subList(0, segsToMerge)));
-      }
+      mergeSpec.add(new OneMerge(segments.subList(0, segsToMerge)));
     }
 
     return mergeSpec;
@@ -106,11 +93,7 @@ public class MockRandomMergePolicy exten
       while(upto < eligibleSegments.size()) {
         int max = Math.min(10, eligibleSegments.size()-upto);
         int inc = max <= 2 ? max : TestUtil.nextInt(random, 2, max);
-        if (doNonBulkMerges) {
-          mergeSpec.add(new MockRandomOneMerge(eligibleSegments.subList(upto, upto+inc), random.nextLong()));
-        } else {
-          mergeSpec.add(new OneMerge(eligibleSegments.subList(upto, upto+inc)));
-        }
+        mergeSpec.add(new OneMerge(eligibleSegments.subList(upto, upto+inc)));
         upto += inc;
       }
     }
@@ -135,28 +118,4 @@ public class MockRandomMergePolicy exten
     // 80% of the time we create CFS:
     return random.nextInt(5) != 1;
   }
-  
-  static class MockRandomOneMerge extends OneMerge {
-    final Random r;
-    ArrayList<LeafReader> readers;
-
-    MockRandomOneMerge(List<SegmentCommitInfo> segments, long seed) {
-      super(segments);
-      r = new Random(seed);
-    }
-
-    @Override
-    public List<LeafReader> getMergeReaders() throws IOException {
-      if (readers == null) {
-        readers = new ArrayList<LeafReader>(super.getMergeReaders());
-        for (int i = 0; i < readers.size(); i++) {
-          // wrap it (e.g. prevent bulk merge etc)
-          if (r.nextInt(4) == 0) {
-            readers.set(i, new FilterLeafReader(readers.get(i)));
-          }
-        }
-      }
-      return readers;
-    }
-  }
 }

Modified: lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java (original)
+++ lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/index/ThreadedIndexingAndSearchingTestCase.java Thu Nov 20 04:22:40 2014
@@ -445,9 +445,6 @@ public abstract class ThreadedIndexingAn
     analyzer.setMaxTokenLength(TestUtil.nextInt(random(), 1, IndexWriter.MAX_TERM_LENGTH));
     final IndexWriterConfig conf = newIndexWriterConfig(analyzer).setCommitOnClose(false);
     conf.setInfoStream(new FailOnNonBulkMergesInfoStream());
-    if (conf.getMergePolicy() instanceof MockRandomMergePolicy) {
-      ((MockRandomMergePolicy)conf.getMergePolicy()).setDoNonBulkMerges(false);
-    }
 
     if (LuceneTestCase.TEST_NIGHTLY) {
       // newIWConfig makes smallish max seg size, which

Modified: lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java (original)
+++ lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java Thu Nov 20 04:22:40 2014
@@ -141,11 +141,6 @@ public class QueryUtils {
     public Object getCoreCacheKey() {
       return cacheKey;
     }
-    
-    @Override
-    public Object getCombinedCoreAndDeletesKey() {
-      return cacheKey;
-    }
   }
 
   /**

Modified: lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java (original)
+++ lucene/dev/branches/lucene6065/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java Thu Nov 20 04:22:40 2014
@@ -248,7 +248,6 @@ public final class TestUtil {
     ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
     PrintStream infoStream = new PrintStream(bos, false, IOUtils.UTF_8);
 
-    reader.checkIntegrity();
     CheckIndex.testLiveDocs(reader, infoStream, true);
     CheckIndex.testFieldInfos(reader, infoStream, true);
     CheckIndex.testFieldNorms(reader, infoStream, true);

Modified: lucene/dev/branches/lucene6065/solr/core/src/java/org/apache/solr/search/Insanity.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/solr/core/src/java/org/apache/solr/search/Insanity.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/solr/core/src/java/org/apache/solr/search/Insanity.java (original)
+++ lucene/dev/branches/lucene6065/solr/core/src/java/org/apache/solr/search/Insanity.java Thu Nov 20 04:22:40 2014
@@ -115,16 +115,11 @@ public class Insanity {
       return fieldInfos;
     }
 
-    // important to override these, so fieldcaches are shared on what we wrap
+    // important to override this, so fieldcaches are shared on what we wrap
     
     @Override
     public Object getCoreCacheKey() {
       return in.getCoreCacheKey();
     }
-
-    @Override
-    public Object getCombinedCoreAndDeletesKey() {
-      return in.getCombinedCoreAndDeletesKey();
-    }
   }
 }

Modified: lucene/dev/branches/lucene6065/solr/core/src/test/org/apache/solr/search/TestDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6065/solr/core/src/test/org/apache/solr/search/TestDocSet.java?rev=1640670&r1=1640669&r2=1640670&view=diff
==============================================================================
--- lucene/dev/branches/lucene6065/solr/core/src/test/org/apache/solr/search/TestDocSet.java (original)
+++ lucene/dev/branches/lucene6065/solr/core/src/test/org/apache/solr/search/TestDocSet.java Thu Nov 20 04:22:40 2014
@@ -434,10 +434,6 @@ public class TestDocSet extends LuceneTe
       @Override
       public void document(int doc, StoredFieldVisitor visitor) {
       }
-
-      @Override
-      public void checkIntegrity() throws IOException {
-      }
     };
   }