You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2016/10/07 09:04:17 UTC

lucene-solr:master: LUCENE-7479: SimpleText should directly implement the new doc values APIs.

Repository: lucene-solr
Updated Branches:
  refs/heads/master 87bad0956 -> fb088817e


LUCENE-7479: SimpleText should directly implement the new doc values APIs.


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

Branch: refs/heads/master
Commit: fb088817eb12df4c76c4369f98629003f1ab307c
Parents: 87bad09
Author: Adrien Grand <jp...@gmail.com>
Authored: Fri Oct 7 10:59:11 2016 +0200
Committer: Adrien Grand <jp...@gmail.com>
Committed: Fri Oct 7 10:59:11 2016 +0200

----------------------------------------------------------------------
 .../lucene54/Lucene54DocValuesProducer.java     |   2 +-
 .../codecs/lucene53/Lucene53NormsConsumer.java  |   2 +-
 .../index/TestBackwardsCompatibility.java       |   2 +-
 .../simpletext/SimpleTextDocValuesReader.java   | 394 +++++++++++++------
 .../simpletext/SimpleTextDocValuesWriter.java   | 184 +++++----
 .../simpletext/SimpleTextNormsFormat.java       |  12 +-
 .../apache/lucene/codecs/DocValuesConsumer.java |   8 +-
 .../lucene/codecs/LegacyDocValuesIterables.java |  27 +-
 .../lucene70/Lucene70DocValuesProducer.java     |   2 +-
 .../apache/lucene/index/BinaryDocValues.java    |   8 +-
 .../lucene/index/FilterBinaryDocValues.java     |   2 +-
 .../org/apache/lucene/index/MultiDocValues.java |   6 +-
 .../index/SingletonSortedSetDocValues.java      |   4 +-
 .../apache/lucene/index/SortedDocValues.java    |   8 +-
 .../apache/lucene/index/SortedSetDocValues.java |   4 +-
 .../apache/lucene/index/SortingLeafReader.java  |   4 +-
 .../apache/lucene/search/FieldComparator.java   |   2 +-
 .../lucene/search/LeafFieldComparator.java      |   2 +-
 .../apache/lucene/search/SortedSetSelector.java |  16 +-
 .../apache/lucene/search/TopFieldCollector.java |   2 +-
 .../index/TestBinaryDocValuesUpdates.java       |   2 +-
 .../SortedSetDocValuesFacetCounts.java          |   4 +-
 .../AbstractFirstPassGroupingCollector.java     |   4 +-
 .../search/grouping/BlockGroupingCollector.java |   2 +-
 .../grouping/term/TermGroupFacetCollector.java  |   2 +-
 .../grouping/DistinctValuesCollectorTest.java   |   2 +-
 .../lucene/search/grouping/TestGrouping.java    |   2 +-
 .../lucene/search/join/BlockJoinSelector.java   |   2 +-
 .../search/join/GenericTermsCollector.java      |   2 +-
 .../search/TestDiversifiedTopDocsCollector.java |   2 +-
 .../lucene/index/AssertingLeafReader.java       |  12 +-
 .../org/apache/solr/request/IntervalFacets.java |   4 +-
 .../facet/FacetFieldProcessorByHashDV.java      |   8 +-
 .../solr/search/facet/UniqueMultiDvSlotAcc.java |   2 +-
 .../search/facet/UniqueSinglevaluedSlotAcc.java |   2 +-
 .../apache/solr/search/grouping/Command.java    |   2 +-
 .../command/SearchGroupsFieldCommand.java       |   2 +-
 .../search/join/BlockJoinFacetAccsHolder.java   |   2 +-
 .../join/BlockJoinFieldFacetAccumulator.java    |   2 +-
 39 files changed, 477 insertions(+), 274 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
index 9356aed..25f4b5e 100644
--- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
+++ b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
@@ -919,7 +919,7 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
       }
 
       @Override
-      public int lookupTerm(BytesRef key) {
+      public int lookupTerm(BytesRef key) throws IOException {
         if (binary instanceof CompressedBinaryDocValues) {
           return (int) ((CompressedBinaryDocValues)binary).lookupTerm(key);
         } else {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java
index ddb968c..833500c 100644
--- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java
+++ b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java
@@ -58,7 +58,7 @@ class Lucene53NormsConsumer extends NormsConsumer {
 
   @Override
   public void addNormsField(FieldInfo field, NormsProducer normsProducer) throws IOException {
-    addNormsField(field, LegacyDocValuesIterables.normsIterable(field, normsProducer, maxDoc, true));
+    addNormsField(field, LegacyDocValuesIterables.normsIterable(field, normsProducer, maxDoc));
   }
 
   private void addNormsField(FieldInfo field, Iterable<Number> values) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
index 6c56cec..2371b01 100644
--- a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
+++ b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
@@ -1481,7 +1481,7 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
     }
   }
   
-  static long getValue(BinaryDocValues bdv) {
+  static long getValue(BinaryDocValues bdv) throws IOException {
     BytesRef term = bdv.binaryValue();
     int idx = term.offset;
     byte b = term.bytes[idx++];

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
index b01924a..adf5e42 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesReader.java
@@ -27,14 +27,15 @@ import java.text.ParseException;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.function.IntFunction;
 
 import org.apache.lucene.codecs.DocValuesProducer;
 import org.apache.lucene.index.*;
 import org.apache.lucene.index.NumericDocValues;
+import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.store.BufferedChecksumIndexInput;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.IndexInput;
-import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRefBuilder;
 import org.apache.lucene.util.RamUsageEstimator;
@@ -139,15 +140,42 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
 
   @Override
   public NumericDocValues getNumeric(FieldInfo fieldInfo) throws IOException {
-    LegacyNumericDocValues values = getNumericNonIterator(fieldInfo);
+    IntFunction<Long> values = getNumericNonIterator(fieldInfo);
     if (values == null) {
       return null;
     } else {
-      return new LegacyNumericDocValuesWrapper(getNumericDocsWithField(fieldInfo), values);
+      DocIdSetIterator docsWithField = getNumericDocsWithField(fieldInfo);
+      return new NumericDocValues() {
+        
+        @Override
+        public int nextDoc() throws IOException {
+          return docsWithField.nextDoc();
+        }
+        
+        @Override
+        public int docID() {
+          return docsWithField.docID();
+        }
+        
+        @Override
+        public long cost() {
+          return docsWithField.cost();
+        }
+        
+        @Override
+        public int advance(int target) throws IOException {
+          return docsWithField.advance(target);
+        }
+        
+        @Override
+        public long longValue() throws IOException {
+          return values.apply(docsWithField.docID());
+        }
+      };
     }
   }
   
-  LegacyNumericDocValues getNumericNonIterator(FieldInfo fieldInfo) throws IOException {
+  IntFunction<Long> getNumericNonIterator(FieldInfo fieldInfo) throws IOException {
     final OneField field = fields.get(fieldInfo.name);
     assert field != null;
 
@@ -161,9 +189,9 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
 
     decoder.setParseBigDecimal(true);
 
-    return new LegacyNumericDocValues() {
+    return new IntFunction<Long>() {
       @Override
-      public long get(int docID) {
+      public Long apply(int docID) {
         try {
           //System.out.println(Thread.currentThread().getName() + ": get docID=" + docID + " in=" + in);
           if (docID < 0 || docID >= maxDoc) {
@@ -187,31 +215,46 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     };
   }
   
-  public Bits getNumericDocsWithField(FieldInfo fieldInfo) throws IOException {
+  private DocIdSetIterator getNumericDocsWithField(FieldInfo fieldInfo) throws IOException {
     final OneField field = fields.get(fieldInfo.name);
     final IndexInput in = data.clone();
     final BytesRefBuilder scratch = new BytesRefBuilder();
-    return new Bits() {
+    return new DocIdSetIterator() {
+      
+      int doc = -1;
+      
       @Override
-      public boolean get(int index) {
-        try {
-          in.seek(field.dataStartFilePointer + (1+field.pattern.length()+2)*index);
-          SimpleTextUtil.readLine(in, scratch); // data
-          SimpleTextUtil.readLine(in, scratch); // 'T' or 'F'
-          return scratch.byteAt(0) == (byte) 'T';
-        } catch (IOException e) {
-          throw new RuntimeException(e);
-        }
+      public int nextDoc() throws IOException {
+        return advance(docID() + 1);
       }
-
+      
+      @Override
+      public int docID() {
+        return doc;
+      }
+      
       @Override
-      public int length() {
+      public long cost() {
         return maxDoc;
       }
+      
+      @Override
+      public int advance(int target) throws IOException {
+        for (int i = target; i < maxDoc; ++i) {
+          in.seek(field.dataStartFilePointer + (1+field.pattern.length()+2)*i);
+          SimpleTextUtil.readLine(in, scratch); // data
+          SimpleTextUtil.readLine(in, scratch); // 'T' or 'F'
+          if (scratch.byteAt(0) == (byte) 'T') {
+            return doc = i;
+          }
+        }
+        return doc = NO_MORE_DOCS;
+      }
     };
   }
-
-  private LegacyBinaryDocValues getLegacyBinary(FieldInfo fieldInfo) throws IOException {
+  
+  @Override
+  public synchronized BinaryDocValues getBinary(FieldInfo fieldInfo) throws IOException {
     final OneField field = fields.get(fieldInfo.name);
 
     // SegmentCoreReaders already verifies this field is
@@ -222,11 +265,13 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     final BytesRefBuilder scratch = new BytesRefBuilder();
     final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
 
-    return new LegacyBinaryDocValues() {
+    DocIdSetIterator docsWithField = getBinaryDocsWithField(fieldInfo);
+    
+    IntFunction<BytesRef> values = new IntFunction<BytesRef>() {
       final BytesRefBuilder term = new BytesRefBuilder();
 
       @Override
-      public BytesRef get(int docID) {
+      public BytesRef apply(int docID) {
         try {
           if (docID < 0 || docID >= maxDoc) {
             throw new IndexOutOfBoundsException("docID must be 0 .. " + (maxDoc-1) + "; got " + docID);
@@ -249,24 +294,64 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
         }
       }
     };
-  }
-  
-  @Override
-  public synchronized BinaryDocValues getBinary(FieldInfo field) throws IOException {
-    return new LegacyBinaryDocValuesWrapper(getBinaryDocsWithField(field), getLegacyBinary(field));
+    return new BinaryDocValues() {
+      
+      @Override
+      public int nextDoc() throws IOException {
+        return docsWithField.nextDoc();
+      }
+      
+      @Override
+      public int docID() {
+        return docsWithField.docID();
+      }
+      
+      @Override
+      public long cost() {
+        return docsWithField.cost();
+      }
+      
+      @Override
+      public int advance(int target) throws IOException {
+        return docsWithField.advance(target);
+      }
+      
+      @Override
+      public BytesRef binaryValue() throws IOException {
+        return values.apply(docsWithField.docID());
+      }
+    };
   }
 
-  private Bits getBinaryDocsWithField(FieldInfo fieldInfo) throws IOException {
+  private DocIdSetIterator getBinaryDocsWithField(FieldInfo fieldInfo) throws IOException {
     final OneField field = fields.get(fieldInfo.name);
     final IndexInput in = data.clone();
     final BytesRefBuilder scratch = new BytesRefBuilder();
     final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
 
-    return new Bits() {
+    return new DocIdSetIterator() {
+      
+      int doc = -1;
+      
       @Override
-      public boolean get(int index) {
-        try {
-          in.seek(field.dataStartFilePointer + (9+field.pattern.length() + field.maxLength+2)*index);
+      public int nextDoc() throws IOException {
+        return advance(docID() + 1);
+      }
+      
+      @Override
+      public int docID() {
+        return doc;
+      }
+      
+      @Override
+      public long cost() {
+        return maxDoc;
+      }
+      
+      @Override
+      public int advance(int target) throws IOException {
+        for (int i = target; i < maxDoc; ++i) {
+          in.seek(field.dataStartFilePointer + (9+field.pattern.length() + field.maxLength+2)*i);
           SimpleTextUtil.readLine(in, scratch);
           assert StringHelper.startsWith(scratch.get(), LENGTH);
           int len;
@@ -280,15 +365,11 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
           in.readBytes(bytes, 0, len);
           SimpleTextUtil.readLine(in, scratch); // newline
           SimpleTextUtil.readLine(in, scratch); // 'T' or 'F'
-          return scratch.byteAt(0) == (byte) 'T';
-        } catch (IOException ioe) {
-          throw new RuntimeException(ioe);
+          if (scratch.byteAt(0) == (byte) 'T') {
+            return doc = i;
+          }
         }
-      }
-
-      @Override
-      public int length() {
-        return maxDoc;
+        return doc = NO_MORE_DOCS;
       }
     };
   }
@@ -306,67 +387,115 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
     final DecimalFormat ordDecoder = new DecimalFormat(field.ordPattern, new DecimalFormatSymbols(Locale.ROOT));
 
-    return new LegacySortedDocValuesWrapper(new LegacySortedDocValues() {
-      final BytesRefBuilder term = new BytesRefBuilder();
+    return new SortedDocValues() {
+
+      int doc = -1;
 
       @Override
-      public int getOrd(int docID) {
-        if (docID < 0 || docID >= maxDoc) {
-          throw new IndexOutOfBoundsException("docID must be 0 .. " + (maxDoc-1) + "; got " + docID);
-        }
-        try {
-          in.seek(field.dataStartFilePointer + field.numValues * (9 + field.pattern.length() + field.maxLength) + docID * (1 + field.ordPattern.length()));
+      public int nextDoc() throws IOException {
+        return advance(docID() + 1);
+      }
+      
+      @Override
+      public int docID() {
+        return doc;
+      }
+      
+      @Override
+      public long cost() {
+        return maxDoc;
+      }
+
+      int ord;
+
+      @Override
+      public int advance(int target) throws IOException {
+        for (int i = target; i < maxDoc; ++i) {
+          in.seek(field.dataStartFilePointer + field.numValues * (9 + field.pattern.length() + field.maxLength) + i * (1 + field.ordPattern.length()));
           SimpleTextUtil.readLine(in, scratch);
           try {
-            return (int) ordDecoder.parse(scratch.get().utf8ToString()).longValue()-1;
+            ord = (int) ordDecoder.parse(scratch.get().utf8ToString()).longValue()-1;
           } catch (ParseException pe) {
             throw new CorruptIndexException("failed to parse ord", in, pe);
           }
-        } catch (IOException ioe) {
-          throw new RuntimeException(ioe);
+          if (ord >= 0) {
+            return doc = i;
+          }
         }
+        return doc = NO_MORE_DOCS;
       }
-
+      
+      @Override
+      public int ordValue() {
+        return ord;
+      }
+      
+      final BytesRefBuilder term = new BytesRefBuilder();
+      
       @Override
-      public BytesRef lookupOrd(int ord) {
+      public BytesRef lookupOrd(int ord) throws IOException {
+        if (ord < 0 || ord >= field.numValues) {
+          throw new IndexOutOfBoundsException("ord must be 0 .. " + (field.numValues-1) + "; got " + ord);
+        }
+        in.seek(field.dataStartFilePointer + ord * (9 + field.pattern.length() + field.maxLength));
+        SimpleTextUtil.readLine(in, scratch);
+        assert StringHelper.startsWith(scratch.get(), LENGTH): "got " + scratch.get().utf8ToString() + " in=" + in;
+        int len;
         try {
-          if (ord < 0 || ord >= field.numValues) {
-            throw new IndexOutOfBoundsException("ord must be 0 .. " + (field.numValues-1) + "; got " + ord);
-          }
-          in.seek(field.dataStartFilePointer + ord * (9 + field.pattern.length() + field.maxLength));
-          SimpleTextUtil.readLine(in, scratch);
-          assert StringHelper.startsWith(scratch.get(), LENGTH): "got " + scratch.get().utf8ToString() + " in=" + in;
-          int len;
-          try {
-            len = decoder.parse(new String(scratch.bytes(), LENGTH.length, scratch.length() - LENGTH.length, StandardCharsets.UTF_8)).intValue();
-          } catch (ParseException pe) {
-            throw new CorruptIndexException("failed to parse int length", in, pe);
-          }
-          term.grow(len);
-          term.setLength(len);
-          in.readBytes(term.bytes(), 0, len);
-          return term.get();
-        } catch (IOException ioe) {
-          throw new RuntimeException(ioe);
+          len = decoder.parse(new String(scratch.bytes(), LENGTH.length, scratch.length() - LENGTH.length, StandardCharsets.UTF_8)).intValue();
+        } catch (ParseException pe) {
+          throw new CorruptIndexException("failed to parse int length", in, pe);
         }
+        term.grow(len);
+        term.setLength(len);
+        in.readBytes(term.bytes(), 0, len);
+        return term.get();
       }
-
+      
       @Override
       public int getValueCount() {
         return (int)field.numValues;
       }
-    }, maxDoc);
+    };
   }
   
   @Override
   public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOException {
-    final LegacyBinaryDocValues binary = getLegacyBinary(field);
-    return new LegacySortedNumericDocValuesWrapper(new LegacySortedNumericDocValues() {
-      long values[];
-
+    final BinaryDocValues binary = getBinary(field);
+    return new SortedNumericDocValues() {
+      
       @Override
-      public void setDocument(int doc) {
-        String csv = binary.get(doc).utf8ToString();
+      public int nextDoc() throws IOException {
+        int doc = binary.nextDoc();
+        setCurrentDoc();
+        return doc;
+      }
+      
+      @Override
+      public int docID() {
+        return binary.docID();
+      }
+      
+      @Override
+      public long cost() {
+        return binary.cost();
+      }
+      
+      @Override
+      public int advance(int target) throws IOException {
+        int doc = binary.advance(target);
+        setCurrentDoc();
+        return doc;
+      }
+      
+      long values[];
+      int index;
+      
+      private void setCurrentDoc() throws IOException {
+        if (docID() == NO_MORE_DOCS) {
+          return;
+        }
+        String csv = binary.binaryValue().utf8ToString();
         if (csv.length() == 0) {
           values = new long[0];
         } else {
@@ -376,18 +505,19 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
             values[i] = Long.parseLong(s[i]);
           }
         }
+        index = 0;
       }
-
+      
       @Override
-      public long valueAt(int index) {
-        return values[index];
+      public long nextValue() throws IOException {
+        return values[index++];
       }
-
+      
       @Override
-      public int count() {
+      public int docValueCount() {
         return values.length;
       }
-      }, maxDoc);
+    };
   }
 
   @Override
@@ -402,69 +532,77 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     final BytesRefBuilder scratch = new BytesRefBuilder();
     final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
     
-    return new LegacySortedSetDocValuesWrapper(new LegacySortedSetDocValues() {
+    return new SortedSetDocValues() {
+      
       String[] currentOrds = new String[0];
       int currentIndex = 0;
       final BytesRefBuilder term = new BytesRefBuilder();
+      int doc = -1;
       
       @Override
-      public long nextOrd() {
-        if (currentIndex == currentOrds.length) {
-          return NO_MORE_ORDS;
-        } else {
-          return Long.parseLong(currentOrds[currentIndex++]);
-        }
+      public int nextDoc() throws IOException {
+        return advance(doc + 1);
       }
-
+      
       @Override
-      public void setDocument(int docID) {
-        if (docID < 0 || docID >= maxDoc) {
-          throw new IndexOutOfBoundsException("docID must be 0 .. " + (maxDoc-1) + "; got " + docID);
-        }
-        try {
-          in.seek(field.dataStartFilePointer + field.numValues * (9 + field.pattern.length() + field.maxLength) + docID * (1 + field.ordPattern.length()));
+      public int docID() {
+        return doc;
+      }
+      
+      @Override
+      public long cost() {
+        return maxDoc;
+      }
+      
+      @Override
+      public int advance(int target) throws IOException {
+        for (int i = target; i < maxDoc; ++i) {
+          in.seek(field.dataStartFilePointer + field.numValues * (9 + field.pattern.length() + field.maxLength) + i * (1 + field.ordPattern.length()));
           SimpleTextUtil.readLine(in, scratch);
           String ordList = scratch.get().utf8ToString().trim();
-          if (ordList.isEmpty()) {
-            currentOrds = new String[0];
-          } else {
+          if (ordList.isEmpty() == false) {
             currentOrds = ordList.split(",");
+            currentIndex = 0;
+            return doc = i;
           }
-          currentIndex = 0;
-        } catch (IOException ioe) {
-          throw new RuntimeException(ioe);
         }
+        return doc = NO_MORE_DOCS;
       }
-
+      
+      @Override
+      public long nextOrd() throws IOException {
+        if (currentIndex == currentOrds.length) {
+          return NO_MORE_ORDS;
+        } else {
+          return Long.parseLong(currentOrds[currentIndex++]);
+        }
+      }
+      
       @Override
-      public BytesRef lookupOrd(long ord) {
+      public BytesRef lookupOrd(long ord) throws IOException {
+        if (ord < 0 || ord >= field.numValues) {
+          throw new IndexOutOfBoundsException("ord must be 0 .. " + (field.numValues-1) + "; got " + ord);
+        }
+        in.seek(field.dataStartFilePointer + ord * (9 + field.pattern.length() + field.maxLength));
+        SimpleTextUtil.readLine(in, scratch);
+        assert StringHelper.startsWith(scratch.get(), LENGTH): "got " + scratch.get().utf8ToString() + " in=" + in;
+        int len;
         try {
-          if (ord < 0 || ord >= field.numValues) {
-            throw new IndexOutOfBoundsException("ord must be 0 .. " + (field.numValues-1) + "; got " + ord);
-          }
-          in.seek(field.dataStartFilePointer + ord * (9 + field.pattern.length() + field.maxLength));
-          SimpleTextUtil.readLine(in, scratch);
-          assert StringHelper.startsWith(scratch.get(), LENGTH): "got " + scratch.get().utf8ToString() + " in=" + in;
-          int len;
-          try {
-            len = decoder.parse(new String(scratch.bytes(), LENGTH.length, scratch.length() - LENGTH.length, StandardCharsets.UTF_8)).intValue();
-          } catch (ParseException pe) {
-            throw new CorruptIndexException("failed to parse int length", in, pe);
-          }
-          term.grow(len);
-          term.setLength(len);
-          in.readBytes(term.bytes(), 0, len);
-          return term.get();
-        } catch (IOException ioe) {
-          throw new RuntimeException(ioe);
+          len = decoder.parse(new String(scratch.bytes(), LENGTH.length, scratch.length() - LENGTH.length, StandardCharsets.UTF_8)).intValue();
+        } catch (ParseException pe) {
+          throw new CorruptIndexException("failed to parse int length", in, pe);
         }
+        term.grow(len);
+        term.setLength(len);
+        in.readBytes(term.bytes(), 0, len);
+        return term.get();
       }
-
+      
       @Override
       public long getValueCount() {
         return field.numValues;
       }
-      }, maxDoc);
+    };
   }
   
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
index 379942e..2649ae6 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextDocValuesWriter.java
@@ -22,17 +22,23 @@ import java.math.BigInteger;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Locale;
 import java.util.Set;
 
 import org.apache.lucene.codecs.DocValuesConsumer;
 import org.apache.lucene.codecs.DocValuesProducer;
-import org.apache.lucene.codecs.LegacyDocValuesIterables;
+import org.apache.lucene.index.BinaryDocValues;
 import org.apache.lucene.index.DocValuesType;
+import org.apache.lucene.index.EmptyDocValuesProducer;
 import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.IndexFileNames;
+import org.apache.lucene.index.NumericDocValues;
 import org.apache.lucene.index.SegmentWriteState;
+import org.apache.lucene.index.SortedDocValues;
+import org.apache.lucene.index.SortedNumericDocValues;
+import org.apache.lucene.index.SortedSetDocValues;
+import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRefBuilder;
@@ -72,11 +78,6 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
 
   @Override
   public void addNumericField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
-    addNumericField(field, LegacyDocValuesIterables.numericIterable(field, valuesProducer, numDocs));
-  }
-
-  void addNumericField(FieldInfo field, Iterable<Number> values) throws IOException {
-
     assert fieldSeen(field.name);
     assert field.getDocValuesType() == DocValuesType.NUMERIC || field.hasNorms();
     writeFieldEntry(field, DocValuesType.NUMERIC);
@@ -84,10 +85,17 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
     // first pass to find min/max
     long minValue = Long.MAX_VALUE;
     long maxValue = Long.MIN_VALUE;
-    for(Number n : values) {
-      long v = n == null ? 0 : n.longValue();
+    NumericDocValues values = valuesProducer.getNumeric(field);
+    int numValues = 0;
+    for (int doc = values.nextDoc(); doc != DocIdSetIterator.NO_MORE_DOCS; doc = values.nextDoc()) {
+      long v = values.longValue();
       minValue = Math.min(minValue, v);
       maxValue = Math.max(maxValue, v);
+      numValues++;
+    }
+    if (numValues != numDocs) {
+      minValue = Math.min(minValue, 0);
+      maxValue = Math.max(maxValue, 0);
     }
     
     // write our minimum value to the .dat, all entries are deltas from that
@@ -118,15 +126,20 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
     int numDocsWritten = 0;
 
     // second pass to write the values
-    for(Number n : values) {
-      long value = n == null ? 0 : n.longValue();
+    values = valuesProducer.getNumeric(field);
+    for (int i = 0; i < numDocs; ++i) {
+      if (values.docID() < i) {
+        values.nextDoc();
+        assert values.docID() >= i;
+      }
+      long value = values.docID() != i ? 0 : values.longValue();
       assert value >= minValue;
       Number delta = BigInteger.valueOf(value).subtract(BigInteger.valueOf(minValue));
       String s = encoder.format(delta);
       assert s.length() == patternString.length();
       SimpleTextUtil.write(data, s, scratch);
       SimpleTextUtil.writeNewline(data);
-      if (n == null) {
+      if (values.docID() != i) {
         SimpleTextUtil.write(data, "F", scratch);
       } else {
         SimpleTextUtil.write(data, "T", scratch);
@@ -143,14 +156,14 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
   public void addBinaryField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
     assert fieldSeen(field.name);
     assert field.getDocValuesType() == DocValuesType.BINARY;
-    doAddBinary(field, LegacyDocValuesIterables.binaryIterable(field, valuesProducer, numDocs));
+    doAddBinaryField(field, valuesProducer);
   }
-    
-  private void doAddBinary(FieldInfo field, Iterable<BytesRef> values) throws IOException {
+
+  private void doAddBinaryField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
     int maxLength = 0;
-    for(BytesRef value : values) {
-      final int length = value == null ? 0 : value.length;
-      maxLength = Math.max(maxLength, length);
+    BinaryDocValues values = valuesProducer.getBinary(field);
+    for (int doc = values.nextDoc(); doc != DocIdSetIterator.NO_MORE_DOCS; doc = values.nextDoc()) {
+      maxLength = Math.max(maxLength, values.binaryValue().length);
     }
     writeFieldEntry(field, DocValuesType.BINARY);
 
@@ -170,26 +183,32 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
     SimpleTextUtil.writeNewline(data);
     final DecimalFormat encoder = new DecimalFormat(sb.toString(), new DecimalFormatSymbols(Locale.ROOT));
 
+    values = valuesProducer.getBinary(field);
     int numDocsWritten = 0;
-    for(BytesRef value : values) {
+    for (int i = 0; i < numDocs; ++i) {
+      if (values.docID() < i) {
+        values.nextDoc();
+        assert values.docID() >= i;
+      }
       // write length
-      final int length = value == null ? 0 : value.length;
+      final int length = values.docID() != i ? 0 : values.binaryValue().length;
       SimpleTextUtil.write(data, LENGTH);
       SimpleTextUtil.write(data, encoder.format(length), scratch);
       SimpleTextUtil.writeNewline(data);
         
       // write bytes -- don't use SimpleText.write
       // because it escapes:
-      if (value != null) {
+      if (values.docID() == i) {
+        BytesRef value = values.binaryValue();
         data.writeBytes(value.bytes, value.offset, value.length);
       }
 
       // pad to fit
-      for (int i = length; i < maxLength; i++) {
+      for (int j = length; j < maxLength; j++) {
         data.writeByte((byte)' ');
       }
       SimpleTextUtil.writeNewline(data);
-      if (value == null) {
+      if (values.docID() != i) {
         SimpleTextUtil.write(data, "F", scratch);
       } else {
         SimpleTextUtil.write(data, "T", scratch);
@@ -203,16 +222,14 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
   
   @Override
   public void addSortedField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
-    Iterable<BytesRef> values = LegacyDocValuesIterables.valuesIterable(valuesProducer.getSorted(field));
-    Iterable<Number> docToOrd = LegacyDocValuesIterables.sortedOrdIterable(valuesProducer, field, numDocs);
-    
     assert fieldSeen(field.name);
     assert field.getDocValuesType() == DocValuesType.SORTED;
     writeFieldEntry(field, DocValuesType.SORTED);
 
     int valueCount = 0;
     int maxLength = -1;
-    for(BytesRef value : values) {
+    TermsEnum terms = valuesProducer.getSorted(field).termsEnum();
+    for(BytesRef value = terms.next(); value != null; value = terms.next()) {
       maxLength = Math.max(maxLength, value.length);
       valueCount++;
     }
@@ -254,7 +271,8 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
     // for asserts:
     int valuesSeen = 0;
 
-    for(BytesRef value : values) {
+    terms = valuesProducer.getSorted(field).termsEnum();
+    for(BytesRef value = terms.next(); value != null; value = terms.next()) {
       // write length
       SimpleTextUtil.write(data, LENGTH);
       SimpleTextUtil.write(data, encoder.format(value.length), scratch);
@@ -275,52 +293,75 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
 
     assert valuesSeen == valueCount;
 
-    for(Number ord : docToOrd) {
-      SimpleTextUtil.write(data, ordEncoder.format(ord.longValue()+1), scratch);
+    SortedDocValues values = valuesProducer.getSorted(field);
+    for (int i = 0; i < numDocs; ++i) {
+      if (values.docID() < i) {
+        values.nextDoc();
+        assert values.docID() >= i;
+      }
+      int ord = -1;
+      if (values.docID() == i) {
+        ord = values.ordValue();
+      }
+      SimpleTextUtil.write(data, ordEncoder.format(ord+1L), scratch);
       SimpleTextUtil.writeNewline(data);
     }
   }
 
   @Override
   public void addSortedNumericField(FieldInfo field, final DocValuesProducer valuesProducer) throws IOException {
-
-    final Iterable<Number> docToValueCount = LegacyDocValuesIterables.sortedNumericToDocCount(valuesProducer, field, numDocs);
-    final Iterable<Number> values = LegacyDocValuesIterables.sortedNumericToValues(valuesProducer, field);
-
     assert fieldSeen(field.name);
     assert field.getDocValuesType() == DocValuesType.SORTED_NUMERIC;
-    doAddBinary(field, new Iterable<BytesRef>() {     
+    doAddBinaryField(field, new EmptyDocValuesProducer() {
       @Override
-      public Iterator<BytesRef> iterator() {
-        final StringBuilder builder = new StringBuilder();
-        final BytesRefBuilder scratch = new BytesRefBuilder();
-        final Iterator<Number> counts = docToValueCount.iterator();
-        final Iterator<Number> numbers = values.iterator();
-        
-        return new Iterator<BytesRef>() {
+      public BinaryDocValues getBinary(FieldInfo field) throws IOException {
+        SortedNumericDocValues values = valuesProducer.getSortedNumeric(field);
+        return new BinaryDocValues() {
 
           @Override
-          public boolean hasNext() {
-            return counts.hasNext();
+          public int nextDoc() throws IOException {
+            int doc = values.nextDoc();
+            setCurrentDoc();
+            return doc;
           }
 
           @Override
-          public BytesRef next() {
+          public int docID() {
+            return values.docID();
+          }
+
+          @Override
+          public long cost() {
+            return values.cost();
+          }
+
+          @Override
+          public int advance(int target) throws IOException {
+            int doc = values.advance(target);
+            setCurrentDoc();
+            return doc;
+          }
+
+          final StringBuilder builder = new StringBuilder();
+          BytesRef binaryValue;
+
+          private void setCurrentDoc() throws IOException {
+            if (docID() == NO_MORE_DOCS) {
+              return;
+            }
             builder.setLength(0);
-            long count = counts.next().longValue();
-            for (int i = 0; i < count; i++) {
+            for (int i = 0, count = values.docValueCount(); i < count; ++i) {
               if (i > 0) {
                 builder.append(',');
               }
-              builder.append(Long.toString(numbers.next().longValue()));
+              builder.append(Long.toString(values.nextValue()));
             }
-            scratch.copyChars(builder);
-            return scratch.get();
+            binaryValue = new BytesRef(builder.toString());
           }
 
           @Override
-          public void remove() {
-            throw new UnsupportedOperationException();
+          public BytesRef binaryValue() throws IOException {
+            return binaryValue;
           }
         };
       }
@@ -329,16 +370,14 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
 
   @Override
   public void addSortedSetField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
-    Iterable<BytesRef> values = LegacyDocValuesIterables.valuesIterable(valuesProducer.getSortedSet(field));
-    Iterable<Number> docToOrdCount = LegacyDocValuesIterables.sortedSetOrdCountIterable(valuesProducer, field, numDocs);
-    Iterable<Number> ords = LegacyDocValuesIterables.sortedSetOrdsIterable(valuesProducer, field);
     assert fieldSeen(field.name);
     assert field.getDocValuesType() == DocValuesType.SORTED_SET;
     writeFieldEntry(field, DocValuesType.SORTED_SET);
 
     long valueCount = 0;
     int maxLength = 0;
-    for(BytesRef value : values) {
+    TermsEnum terms = valuesProducer.getSortedSet(field).termsEnum();
+    for(BytesRef value = terms.next(); value != null; value = terms.next()) {
       maxLength = Math.max(maxLength, value.length);
       valueCount++;
     }
@@ -368,12 +407,10 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
     // compute ord pattern: this is funny, we encode all values for all docs to find the maximum length
     int maxOrdListLength = 0;
     StringBuilder sb2 = new StringBuilder();
-    Iterator<Number> ordStream = ords.iterator();
-    for (Number n : docToOrdCount) {
+    SortedSetDocValues values = valuesProducer.getSortedSet(field);
+    for (int doc = values.nextDoc(); doc != DocIdSetIterator.NO_MORE_DOCS; doc = values.nextDoc()) {
       sb2.setLength(0);
-      int count = n.intValue();
-      for (int i = 0; i < count; i++) {
-        long ord = ordStream.next().longValue();
+      for (long ord = values.nextOrd(); ord != SortedSetDocValues.NO_MORE_ORDS; ord = values.nextOrd()) {
         if (sb2.length() > 0) {
           sb2.append(",");
         }
@@ -395,7 +432,8 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
     // for asserts:
     long valuesSeen = 0;
 
-    for(BytesRef value : values) {
+    terms = valuesProducer.getSortedSet(field).termsEnum();
+    for(BytesRef value = terms.next(); value != null; value = terms.next()) {
       // write length
       SimpleTextUtil.write(data, LENGTH);
       SimpleTextUtil.write(data, encoder.format(value.length), scratch);
@@ -416,22 +454,26 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
 
     assert valuesSeen == valueCount;
 
-    ordStream = ords.iterator();
+    values = valuesProducer.getSortedSet(field);
     
     // write the ords for each doc comma-separated
-    for(Number n : docToOrdCount) {
+    for (int i = 0; i < numDocs; ++i) {
+      if (values.docID() < i) {
+        values.nextDoc();
+        assert values.docID() >= i;
+      }
       sb2.setLength(0);
-      int count = n.intValue();
-      for (int i = 0; i < count; i++) {
-        long ord = ordStream.next().longValue();
-        if (sb2.length() > 0) {
-          sb2.append(",");
+      if (values.docID() == i) {
+        for (long ord = values.nextOrd(); ord != SortedSetDocValues.NO_MORE_ORDS; ord = values.nextOrd()) {
+          if (sb2.length() > 0) {
+            sb2.append(",");
+          }
+          sb2.append(Long.toString(ord));
         }
-        sb2.append(Long.toString(ord));
       }
       // now pad to fit: these are numbers so spaces work well. reader calls trim()
       int numPadding = maxOrdListLength - sb2.length();
-      for (int i = 0; i < numPadding; i++) {
+      for (int j = 0; j < numPadding; j++) {
         sb2.append(' ');
       }
       SimpleTextUtil.write(data, sb2.toString(), scratch);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextNormsFormat.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextNormsFormat.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextNormsFormat.java
index 26b00ec..d9c9fbf 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextNormsFormat.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextNormsFormat.java
@@ -20,12 +20,11 @@ package org.apache.lucene.codecs.simpletext;
 import java.io.IOException;
 import java.util.Collection;
 
-import org.apache.lucene.codecs.LegacyDocValuesIterables;
 import org.apache.lucene.codecs.NormsConsumer;
 import org.apache.lucene.codecs.NormsFormat;
 import org.apache.lucene.codecs.NormsProducer;
+import org.apache.lucene.index.EmptyDocValuesProducer;
 import org.apache.lucene.index.FieldInfo;
-import org.apache.lucene.index.LegacyNumericDocValuesWrapper;
 import org.apache.lucene.index.NumericDocValues;
 import org.apache.lucene.index.SegmentReadState;
 import org.apache.lucene.index.SegmentWriteState;
@@ -69,7 +68,7 @@ public class SimpleTextNormsFormat extends NormsFormat {
     
     @Override
     public NumericDocValues getNorms(FieldInfo field) throws IOException {
-      return new LegacyNumericDocValuesWrapper(impl.getNumericDocsWithField(field), impl.getNumericNonIterator(field));
+      return impl.getNumeric(field);
     }
     
     @Override
@@ -116,7 +115,12 @@ public class SimpleTextNormsFormat extends NormsFormat {
     
     @Override
     public void addNormsField(FieldInfo field, NormsProducer normsProducer) throws IOException {
-      impl.addNumericField(field, LegacyDocValuesIterables.normsIterable(field, normsProducer, impl.numDocs, false));
+      impl.addNumericField(field, new EmptyDocValuesProducer() {
+        @Override
+        public NumericDocValues getNumeric(FieldInfo field) throws IOException {
+          return normsProducer.getNorms(field);
+        }
+      });
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java b/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
index 35aa100..a07cc3d 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/DocValuesConsumer.java
@@ -325,7 +325,7 @@ public abstract class DocValuesConsumer implements Closeable {
                          }
 
                          @Override
-                         public BytesRef binaryValue() {
+                         public BytesRef binaryValue() throws IOException {
                            return current.values.binaryValue();
                          }
                        };
@@ -573,7 +573,7 @@ public abstract class DocValuesConsumer implements Closeable {
                          public int nextDoc() throws IOException {
                            SortedDocValuesSub sub = docIDMerger.next();
                            if (sub == null) {
-                             return NO_MORE_DOCS;
+                             return docID = NO_MORE_DOCS;
                            }
                            int subOrd = sub.values.ordValue();
                            assert subOrd != -1;
@@ -603,7 +603,7 @@ public abstract class DocValuesConsumer implements Closeable {
                          }
                          
                          @Override
-                         public BytesRef lookupOrd(int ord) {
+                         public BytesRef lookupOrd(int ord) throws IOException {
                            int segmentNumber = map.getFirstSegmentNumber(ord);
                            int segmentOrd = (int) map.getFirstSegmentOrd(ord);
                            return dvs[segmentNumber].lookupOrd(segmentOrd);
@@ -773,7 +773,7 @@ public abstract class DocValuesConsumer implements Closeable {
                             }
 
                             @Override
-                            public BytesRef lookupOrd(long ord) {
+                            public BytesRef lookupOrd(long ord) throws IOException {
                               int segmentNumber = map.getFirstSegmentNumber(ord);
                               long segmentOrd = map.getFirstSegmentOrd(ord);
                               return toMerge.get(segmentNumber).lookupOrd(segmentOrd);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/codecs/LegacyDocValuesIterables.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/LegacyDocValuesIterables.java b/lucene/core/src/java/org/apache/lucene/codecs/LegacyDocValuesIterables.java
index 74c2d80..717bbab 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/LegacyDocValuesIterables.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/LegacyDocValuesIterables.java
@@ -57,7 +57,11 @@ public class LegacyDocValuesIterables {
 
           @Override
           public BytesRef next() {
-            return values.lookupOrd(nextOrd++);
+            try {
+              return values.lookupOrd(nextOrd++);
+            } catch (IOException e) {
+              throw new RuntimeException(e);
+            }
           }
         };
       }
@@ -82,7 +86,11 @@ public class LegacyDocValuesIterables {
 
           @Override
           public BytesRef next() {
-            return values.lookupOrd(nextOrd++);
+            try {
+              return values.lookupOrd(nextOrd++);
+            } catch (IOException e) {
+              throw new RuntimeException(e);
+            }
           }
         };
       }
@@ -274,7 +282,6 @@ public class LegacyDocValuesIterables {
 
         return new Iterator<Number>() {
           private int nextDocID;
-          private int nextCount;
 
           @Override
           public boolean hasNext() {
@@ -373,7 +380,7 @@ public class LegacyDocValuesIterables {
    * @deprecated Consume {@link NumericDocValues} instead. */
   @Deprecated
   public static Iterable<Number> normsIterable(final FieldInfo field,
-      final NormsProducer normsProducer, final int maxDoc, boolean missingAsZero) {
+      final NormsProducer normsProducer, final int maxDoc) {
 
     return new Iterable<Number>() {
 
@@ -412,11 +419,9 @@ public class LegacyDocValuesIterables {
               } catch (IOException ioe) {
                 throw new RuntimeException(ioe);
               }
-            } else if (missingAsZero) {
-              // Unlike NumericDocValues, norms should return for missing values:
-              result = 0;
             } else {
-              result = null;
+              // Unlike NumericDocValues, norms used to return 0 for missing values:
+              result = 0;
             }
             return result;
           }
@@ -461,7 +466,11 @@ public class LegacyDocValuesIterables {
             }
             BytesRef result;
             if (docIDUpto == values.docID()) {
-              result = values.binaryValue();
+              try {
+                result = values.binaryValue();
+              } catch (IOException e) {
+                throw new RuntimeException(e);
+              }
             } else {
               result = null;
             }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
index 4f80266..e806ea5 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
@@ -974,7 +974,7 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
       }
 
       @Override
-      public int lookupTerm(BytesRef key) {
+      public int lookupTerm(BytesRef key) throws IOException {
         if (binary instanceof CompressedBinaryDocValues) {
           return (int) ((CompressedBinaryDocValues)binary).lookupTerm(key);
         } else {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java b/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
index f9da94f..66397e4 100644
--- a/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/BinaryDocValues.java
@@ -17,6 +17,8 @@
 
 package org.apache.lucene.index;
 
+import java.io.IOException;
+
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.util.BytesRef;
 
@@ -30,8 +32,8 @@ public abstract class BinaryDocValues extends DocIdSetIterator {
   protected BinaryDocValues() {}
 
   /**
-   * Returns the numeric value for the current document ID.
-   * @return numeric value
+   * Returns the binary value for the current document ID.
+   * @return binary value
    */
-  public abstract BytesRef binaryValue();
+  public abstract BytesRef binaryValue() throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java b/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
index 26eb12b..66c4323 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FilterBinaryDocValues.java
@@ -55,7 +55,7 @@ public abstract class FilterBinaryDocValues extends BinaryDocValues {
   }
 
   @Override
-  public BytesRef binaryValue() {
+  public BytesRef binaryValue() throws IOException {
     return in.binaryValue();
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/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 6ed257e..aeb49c5 100644
--- a/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/MultiDocValues.java
@@ -348,7 +348,7 @@ public class MultiDocValues {
       }
 
       @Override
-      public BytesRef binaryValue() {
+      public BytesRef binaryValue() throws IOException {
         return currentValues.binaryValue();
       }
 
@@ -928,7 +928,7 @@ public class MultiDocValues {
     }
  
     @Override
-    public BytesRef lookupOrd(int ord) {
+    public BytesRef lookupOrd(int ord) throws IOException {
       int subIndex = mapping.getFirstSegmentNumber(ord);
       int segmentOrd = (int) mapping.getFirstSegmentOrd(ord);
       return values[subIndex].lookupOrd(segmentOrd);
@@ -1039,7 +1039,7 @@ public class MultiDocValues {
     }
 
     @Override
-    public BytesRef lookupOrd(long ord) {
+    public BytesRef lookupOrd(long ord) throws IOException {
       int subIndex = mapping.getFirstSegmentNumber(ord);
       long segmentOrd = mapping.getFirstSegmentOrd(ord);
       return values[subIndex].lookupOrd(segmentOrd);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
index 88f8f32..225b6a6 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SingletonSortedSetDocValues.java
@@ -79,7 +79,7 @@ final class SingletonSortedSetDocValues extends SortedSetDocValues {
   }
 
   @Override
-  public BytesRef lookupOrd(long ord) {
+  public BytesRef lookupOrd(long ord) throws IOException {
     // cast is ok: single-valued cannot exceed Integer.MAX_VALUE
     return in.lookupOrd((int) ord);
   }
@@ -90,7 +90,7 @@ final class SingletonSortedSetDocValues extends SortedSetDocValues {
   }
 
   @Override
-  public long lookupTerm(BytesRef key) {
+  public long lookupTerm(BytesRef key) throws IOException {
     return in.lookupTerm(key);
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
index d97dbbf..ee70a64 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
@@ -17,6 +17,8 @@
 package org.apache.lucene.index;
 
 
+import java.io.IOException;
+
 import org.apache.lucene.util.BytesRef;
 
 /**
@@ -50,12 +52,12 @@ public abstract class SortedDocValues extends BinaryDocValues {
    * @param ord ordinal to lookup (must be &gt;= 0 and &lt; {@link #getValueCount()})
    * @see #ordValue() 
    */
-  public abstract BytesRef lookupOrd(int ord);
+  public abstract BytesRef lookupOrd(int ord) throws IOException;
 
   private final BytesRef empty = new BytesRef();
 
   @Override
-  public BytesRef binaryValue() {
+  public BytesRef binaryValue() throws IOException {
     int ord = ordValue();
     if (ord == -1) {
       return empty;
@@ -77,7 +79,7 @@ public abstract class SortedDocValues extends BinaryDocValues {
    *
    *  @param key Key to look up
    **/
-  public int lookupTerm(BytesRef key) {
+  public int lookupTerm(BytesRef key) throws IOException {
     int low = 0;
     int high = getValueCount()-1;
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java b/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
index c442c5f..e53a0e7 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortedSetDocValues.java
@@ -58,7 +58,7 @@ public abstract class SortedSetDocValues extends DocIdSetIterator {
    * @param ord ordinal to lookup
    * @see #nextOrd
    */
-  public abstract BytesRef lookupOrd(long ord);
+  public abstract BytesRef lookupOrd(long ord) throws IOException;
 
   /**
    * Returns the number of unique values.
@@ -73,7 +73,7 @@ public abstract class SortedSetDocValues extends DocIdSetIterator {
    *
    *  @param key Key to look up
    **/
-  public long lookupTerm(BytesRef key) {
+  public long lookupTerm(BytesRef key) throws IOException {
     long low = 0;
     long high = getValueCount()-1;
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java b/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
index 3e34436..b207432 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortingLeafReader.java
@@ -406,7 +406,7 @@ class SortingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public BytesRef lookupOrd(int ord) {
+    public BytesRef lookupOrd(int ord) throws IOException {
       return in.lookupOrd(ord);
     }
 
@@ -483,7 +483,7 @@ class SortingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public BytesRef lookupOrd(long ord) {
+    public BytesRef lookupOrd(long ord) throws IOException {
       return in.lookupOrd(ord);
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java b/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
index b638a29..b6c17c0 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
@@ -759,7 +759,7 @@ public abstract class FieldComparator<T> {
     }
     
     @Override
-    public void setBottom(final int bottom) {
+    public void setBottom(final int bottom) throws IOException {
       bottomSlot = bottom;
 
       bottomValue = values[bottomSlot];

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java b/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
index 7f84953..6019376 100644
--- a/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
@@ -61,7 +61,7 @@ public interface LeafFieldComparator {
    * 
    * @param slot the currently weakest (sorted last) slot in the queue
    */
-  void setBottom(final int slot);
+  void setBottom(final int slot) throws IOException;
 
   /**
    * Compare the bottom of the queue with this doc.  This will

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java b/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
index 25fa8d3..f10dbf7 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SortedSetSelector.java
@@ -128,7 +128,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public BytesRef lookupOrd(int ord) {
+    public BytesRef lookupOrd(int ord) throws IOException {
       return in.lookupOrd(ord);
     }
 
@@ -138,7 +138,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public int lookupTerm(BytesRef key) {
+    public int lookupTerm(BytesRef key) throws IOException {
       return (int) in.lookupTerm(key);
     }
 
@@ -190,7 +190,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public BytesRef lookupOrd(int ord) {
+    public BytesRef lookupOrd(int ord) throws IOException {
       return in.lookupOrd(ord);
     }
 
@@ -200,7 +200,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public int lookupTerm(BytesRef key) {
+    public int lookupTerm(BytesRef key) throws IOException {
       return (int) in.lookupTerm(key);
     }
 
@@ -259,7 +259,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public BytesRef lookupOrd(int ord) {
+    public BytesRef lookupOrd(int ord) throws IOException {
       return in.lookupOrd(ord);
     }
 
@@ -269,7 +269,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public int lookupTerm(BytesRef key) {
+    public int lookupTerm(BytesRef key) throws IOException {
       return (int) in.lookupTerm(key);
     }
 
@@ -340,7 +340,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public BytesRef lookupOrd(int ord) {
+    public BytesRef lookupOrd(int ord) throws IOException {
       return in.lookupOrd(ord);
     }
 
@@ -350,7 +350,7 @@ public class SortedSetSelector {
     }
 
     @Override
-    public int lookupTerm(BytesRef key) {
+    public int lookupTerm(BytesRef key) throws IOException {
       return (int) in.lookupTerm(key);
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
index 7ecb9f6..c7274d5 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
@@ -99,7 +99,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
       }
     }
 
-    protected final void setBottom(int slot) {
+    protected final void setBottom(int slot) throws IOException {
       for (LeafFieldComparator comparator : comparators) {
         comparator.setBottom(slot);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/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 f552ae9..ed2b66f 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
@@ -51,7 +51,7 @@ import static org.apache.lucene.search.DocIdSetIterator.NO_MORE_DOCS;
 
 public class TestBinaryDocValuesUpdates extends LuceneTestCase {
 
-  static long getValue(BinaryDocValues bdv) {
+  static long getValue(BinaryDocValues bdv) throws IOException {
     BytesRef term = bdv.binaryValue();
     int idx = term.offset;
     assert term.length > 0;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java b/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
index 38fb174..1219494 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/sortedset/SortedSetDocValuesFacetCounts.java
@@ -92,7 +92,7 @@ public class SortedSetDocValuesFacetCounts extends Facets {
     return getDim(dim, ordRange, topN);
   }
 
-  private final FacetResult getDim(String dim, OrdRange ordRange, int topN) {
+  private final FacetResult getDim(String dim, OrdRange ordRange, int topN) throws IOException {
 
     TopOrdAndIntQueue q = null;
 
@@ -262,7 +262,7 @@ public class SortedSetDocValuesFacetCounts extends Facets {
   }
 
   @Override
-  public Number getSpecificValue(String dim, String... path) {
+  public Number getSpecificValue(String dim, String... path) throws IOException {
     if (path.length != 1) {
       throw new IllegalArgumentException("path must be length=1");
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractFirstPassGroupingCollector.java
----------------------------------------------------------------------
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractFirstPassGroupingCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractFirstPassGroupingCollector.java
index 312a3e2..4de04f0 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractFirstPassGroupingCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractFirstPassGroupingCollector.java
@@ -102,7 +102,7 @@ abstract public class AbstractFirstPassGroupingCollector<GROUP_VALUE_TYPE> exten
    * @param fillFields Whether to fill to {@link SearchGroup#sortValues}
    * @return top groups, starting from offset
    */
-  public Collection<SearchGroup<GROUP_VALUE_TYPE>> getTopGroups(int groupOffset, boolean fillFields) {
+  public Collection<SearchGroup<GROUP_VALUE_TYPE>> getTopGroups(int groupOffset, boolean fillFields) throws IOException {
 
     //System.out.println("FP.getTopGroups groupOffset=" + groupOffset + " fillFields=" + fillFields + " groupMap.size()=" + groupMap.size());
 
@@ -299,7 +299,7 @@ abstract public class AbstractFirstPassGroupingCollector<GROUP_VALUE_TYPE> exten
     }
   }
 
-  private void buildSortedSet() {
+  private void buildSortedSet() throws IOException {
     final Comparator<CollectedSearchGroup<?>> comparator = new Comparator<CollectedSearchGroup<?>>() {
       @Override
       public int compare(CollectedSearchGroup<?> o1, CollectedSearchGroup<?> o2) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
----------------------------------------------------------------------
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
index 6601336..8d1781e 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
@@ -135,7 +135,7 @@ public class BlockGroupingCollector extends SimpleCollector {
 
   // Called when we transition to another group; if the
   // group is competitive we insert into the group queue
-  private void processGroup() {
+  private void processGroup() throws IOException {
     totalGroupCount++;
     //System.out.println("    processGroup ord=" + lastGroupOrd + " competes=" + groupCompetes + " count=" + subDocUpto + " groupDoc=" + topGroupDoc);
     if (groupCompetes) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java
----------------------------------------------------------------------
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java
index a48df03..efa75d6 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java
@@ -273,7 +273,7 @@ public abstract class TermGroupFacetCollector extends AbstractGroupFacetCollecto
       }
     }
     
-    private void process(int groupOrd, int facetOrd) {
+    private void process(int groupOrd, int facetOrd) throws IOException {
       if (facetOrd < startFacetOrd || facetOrd >= endFacetOrd) {
         return;
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/grouping/src/test/org/apache/lucene/search/grouping/DistinctValuesCollectorTest.java
----------------------------------------------------------------------
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/DistinctValuesCollectorTest.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/DistinctValuesCollectorTest.java
index 6a7d9ca..313e92f 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/DistinctValuesCollectorTest.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/DistinctValuesCollectorTest.java
@@ -352,7 +352,7 @@ public class DistinctValuesCollectorTest extends AbstractGroupingTestCase {
   @SuppressWarnings({"unchecked","rawtypes"})
   private <T extends Comparable> AbstractDistinctValuesCollector<AbstractDistinctValuesCollector.GroupCount<T>> createDistinctCountCollector(AbstractFirstPassGroupingCollector<T> firstPassGroupingCollector,
                                                                       String groupField,
-                                                                      String countField) {
+                                                                      String countField) throws IOException {
     Random random = random();
     Collection<SearchGroup<T>> searchGroups = firstPassGroupingCollector.getTopGroups(0, false);
     if (FunctionFirstPassGroupingCollector.class.isAssignableFrom(firstPassGroupingCollector.getClass())) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
----------------------------------------------------------------------
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
index 4a59632..6e2422c 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
@@ -305,7 +305,7 @@ public class TestGrouping extends LuceneTestCase {
     }
   }
 
-  private Collection<SearchGroup<BytesRef>> getSearchGroups(AbstractFirstPassGroupingCollector<?> c, int groupOffset, boolean fillFields) {
+  private Collection<SearchGroup<BytesRef>> getSearchGroups(AbstractFirstPassGroupingCollector<?> c, int groupOffset, boolean fillFields) throws IOException {
     if (TermFirstPassGroupingCollector.class.isAssignableFrom(c.getClass())) {
       return ((TermFirstPassGroupingCollector) c).getTopGroups(groupOffset, fillFields);
     } else if (FunctionFirstPassGroupingCollector.class.isAssignableFrom(c.getClass())) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
----------------------------------------------------------------------
diff --git a/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java b/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
index 212d75b..26b416d 100644
--- a/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
+++ b/lucene/join/src/java/org/apache/lucene/search/join/BlockJoinSelector.java
@@ -172,7 +172,7 @@ public class BlockJoinSelector {
       }
 
       @Override
-      public BytesRef lookupOrd(int ord) {
+      public BytesRef lookupOrd(int ord) throws IOException {
         return values.lookupOrd(ord);
       }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java b/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
index 3a630a1..3ad0fe3 100644
--- a/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
+++ b/lucene/join/src/java/org/apache/lucene/search/join/GenericTermsCollector.java
@@ -84,7 +84,7 @@ interface GenericTermsCollector extends Collector {
         }
         
         @Override
-        public BytesRef lookupOrd(long ord) {
+        public BytesRef lookupOrd(long ord) throws IOException {
           final BytesRef val = target.lookupOrd(ord);
           out.println(val.toString()+", ");
           return val;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java b/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
index 185b7ab..b64afc5 100644
--- a/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
+++ b/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
@@ -191,7 +191,7 @@ public class TestDiversifiedTopDocsCollector extends LuceneTestCase {
           return vals.cost();
         }
         @Override
-        public long longValue() {
+        public long longValue() throws IOException {
           return vals == null ? -1 : vals.binaryValue().hashCode();
         }
       };

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java b/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
index 3cc9023..d450600 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/AssertingLeafReader.java
@@ -505,7 +505,7 @@ public class AssertingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public BytesRef binaryValue() {
+    public BytesRef binaryValue() throws IOException {
       assertThread("Binary doc values", creationThread);
       assert in.docID() != -1;
       assert in.docID() != NO_MORE_DOCS;
@@ -579,7 +579,7 @@ public class AssertingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public BytesRef lookupOrd(int ord) {
+    public BytesRef lookupOrd(int ord) throws IOException {
       assertThread("Sorted doc values", creationThread);
       assert ord >= 0 && ord < valueCount;
       final BytesRef result = in.lookupOrd(ord);
@@ -596,7 +596,7 @@ public class AssertingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public BytesRef binaryValue() {
+    public BytesRef binaryValue() throws IOException {
       assertThread("Sorted doc values", creationThread);
       final BytesRef result = in.binaryValue();
       assert result.isValid();
@@ -604,7 +604,7 @@ public class AssertingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public int lookupTerm(BytesRef key) {
+    public int lookupTerm(BytesRef key) throws IOException {
       assertThread("Sorted doc values", creationThread);
       assert key.isValid();
       int result = in.lookupTerm(key);
@@ -750,7 +750,7 @@ public class AssertingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public BytesRef lookupOrd(long ord) {
+    public BytesRef lookupOrd(long ord) throws IOException {
       assertThread("Sorted set doc values", creationThread);
       assert ord >= 0 && ord < valueCount;
       final BytesRef result = in.lookupOrd(ord);
@@ -767,7 +767,7 @@ public class AssertingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public long lookupTerm(BytesRef key) {
+    public long lookupTerm(BytesRef key) throws IOException {
       assertThread("Sorted set doc values", creationThread);
       assert key.isValid();
       long result = in.lookupTerm(key);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
index 2cf24e5..dfe0f77 100644
--- a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
@@ -626,7 +626,7 @@ public class IntervalFacets implements Iterable<FacetInterval> {
      *
      * @param sdv DocValues for the current reader
      */
-    public void updateContext(SortedDocValues sdv) {
+    public void updateContext(SortedDocValues sdv) throws IOException {
       if (start == null) {
         /*
          * Unset start. All ordinals will be greater than -1.
@@ -689,7 +689,7 @@ public class IntervalFacets implements Iterable<FacetInterval> {
      *
      * @param sdv DocValues for the current reader
      */
-    public void updateContext(SortedSetDocValues sdv) {
+    public void updateContext(SortedSetDocValues sdv) throws IOException {
       if (start == null) {
         /*
          * Unset start. All ordinals will be greater than -1.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
index f1b5333..cf3971c 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java
@@ -332,7 +332,13 @@ class FacetFieldProcessorByHashDV extends FacetFieldProcessor {
 
       // TODO support SortedSetDocValues
       SortedDocValues globalDocValues = FieldUtil.getSortedDocValues(fcontext.qcontext, sf, null);
-      ((TermOrdCalc)calc).lookupOrdFunction = globalDocValues::lookupOrd;
+      ((TermOrdCalc)calc).lookupOrdFunction = ord -> {
+        try {
+          return globalDocValues.lookupOrd(ord);
+        } catch (IOException e) {
+          throw new RuntimeException(e);
+        }
+      };
 
       DocSetUtil.collectSortedDocSet(fcontext.base, fcontext.searcher.getIndexReader(), new SimpleCollector() {
           SortedDocValues docValues = globalDocValues; // this segment/leaf. NN

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
index c52df36..72a88ca 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/UniqueMultiDvSlotAcc.java
@@ -49,7 +49,7 @@ class UniqueMultiDvSlotAcc extends UniqueSlotAcc {
   }
 
   @Override
-  protected BytesRef lookupOrd(int ord) {
+  protected BytesRef lookupOrd(int ord) throws IOException {
     return topLevel.lookupOrd(ord);
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
index 870b894..e0a1852 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/UniqueSinglevaluedSlotAcc.java
@@ -49,7 +49,7 @@ class UniqueSinglevaluedSlotAcc extends UniqueSlotAcc {
   }
 
   @Override
-  protected BytesRef lookupOrd(int ord) {
+  protected BytesRef lookupOrd(int ord) throws IOException {
     return topLevel.lookupOrd(ord);
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/search/grouping/Command.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/Command.java b/solr/core/src/java/org/apache/solr/search/grouping/Command.java
index d719218..55e2d96 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/Command.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/Command.java
@@ -45,7 +45,7 @@ public interface Command<T> {
    *
    * @return The results of the collectors
    */
-  T result();
+  T result() throws IOException;
 
   /**
    * @return The key of this command to uniquely identify itself

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java
index 55106ec..fc04599 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java
@@ -117,7 +117,7 @@ public class SearchGroupsFieldCommand implements Command<SearchGroupsFieldComman
   }
 
   @Override
-  public SearchGroupsFieldCommandResult result() {
+  public SearchGroupsFieldCommandResult result() throws IOException {
     final Collection<SearchGroup<BytesRef>> topGroups;
     if (firstPassGroupingCollector != null) {
       if (field.getType().getNumericType() != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/search/join/BlockJoinFacetAccsHolder.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/join/BlockJoinFacetAccsHolder.java b/solr/core/src/java/org/apache/solr/search/join/BlockJoinFacetAccsHolder.java
index bf7f7b2..00b3ac4 100644
--- a/solr/core/src/java/org/apache/solr/search/join/BlockJoinFacetAccsHolder.java
+++ b/solr/core/src/java/org/apache/solr/search/join/BlockJoinFacetAccsHolder.java
@@ -85,7 +85,7 @@ class BlockJoinFacetAccsHolder {
     }
   }
   
-  NamedList getFacets() {
+  NamedList getFacets() throws IOException {
     NamedList<NamedList<Integer>> facets = new NamedList<>(blockJoinFieldFacetAccumulators.length);
     for (BlockJoinFieldFacetAccumulator state : blockJoinFieldFacetAccumulators) {
       facets.add(state.getFieldName(), state.getFacetValue());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fb088817/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java b/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
index fb4a30c..141b095 100644
--- a/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
+++ b/solr/core/src/java/org/apache/solr/search/join/BlockJoinFieldFacetAccumulator.java
@@ -171,7 +171,7 @@ class BlockJoinFieldFacetAccumulator {
   }
   
   /** copy paste from {@link DocValuesFacets} */
-  NamedList<Integer> getFacetValue() {
+  NamedList<Integer> getFacetValue() throws IOException {
     NamedList<Integer> facetValue = new NamedList<>();
     final CharsRefBuilder charsRef = new CharsRefBuilder(); // if there is no globs, take segment's ones
     for (int i = 1; i< (globalCounts!=null ? globalCounts.length: segmentAccums.length); i++) {