You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/09/21 13:42:20 UTC

[16/16] lucene-solr:master: LUCENE-7407: switch doc values usage to an iterator API, based on DocIdSetIterator, instead of random acces, freeing codecs for future improvements

LUCENE-7407: switch doc values usage to an iterator API, based on DocIdSetIterator, instead of random acces, freeing codecs for future improvements


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

Branch: refs/heads/master
Commit: f7aa200d406dbd05a35d6116198302d90b92cb29
Parents: 93bc88d
Author: Mike McCandless <mi...@apache.org>
Authored: Wed Sep 21 09:41:41 2016 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Wed Sep 21 09:41:41 2016 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |    4 +
 .../collation/TestCollationDocValuesField.java  |    3 +-
 .../TestICUCollationDocValuesField.java         |    3 +-
 .../index/TestBackwardsCompatibility.java       |   61 +-
 .../codecs/memory/DirectDocValuesConsumer.java  |   33 +-
 .../codecs/memory/DirectDocValuesProducer.java  |  100 +-
 .../codecs/memory/MemoryDocValuesConsumer.java  |   45 +-
 .../codecs/memory/MemoryDocValuesProducer.java  |  104 +-
 .../simpletext/SimpleTextDocValuesReader.java   |   64 +-
 .../simpletext/SimpleTextDocValuesWriter.java   |   31 +-
 .../simpletext/SimpleTextNormsFormat.java       |    9 +-
 .../apache/lucene/codecs/DocValuesConsumer.java | 1069 ++++++++----------
 .../apache/lucene/codecs/DocValuesProducer.java |    7 -
 .../lucene/codecs/LegacyDocValuesIterables.java |  514 +++++++++
 .../org/apache/lucene/codecs/NormsConsumer.java |  133 +--
 .../codecs/lucene53/Lucene53NormsConsumer.java  |    8 +-
 .../codecs/lucene53/Lucene53NormsProducer.java  |   47 +-
 .../lucene54/Lucene54DocValuesConsumer.java     |   41 +-
 .../lucene54/Lucene54DocValuesProducer.java     |  345 ++++--
 .../lucene/codecs/lucene54/package-info.java    |    2 +-
 .../perfield/PerFieldDocValuesFormat.java       |   28 +-
 .../lucene/document/BinaryDocValuesField.java   |    1 -
 .../apache/lucene/index/BinaryDocValues.java    |   19 +-
 .../lucene/index/BinaryDocValuesWriter.java     |   80 +-
 .../org/apache/lucene/index/CheckIndex.java     |  178 ++-
 .../org/apache/lucene/index/CodecReader.java    |  151 +--
 .../org/apache/lucene/index/DocIDMerger.java    |   11 +-
 .../java/org/apache/lucene/index/DocValues.java |  327 ++++--
 .../lucene/index/EmptyDocValuesProducer.java    |   71 ++
 .../lucene/index/FilterBinaryDocValues.java     |   61 +
 .../apache/lucene/index/FilterLeafReader.java   |    6 -
 .../lucene/index/FilterNumericDocValues.java    |   59 +
 .../org/apache/lucene/index/LeafReader.java     |   13 +-
 .../lucene/index/LegacyBinaryDocValues.java     |   39 +
 .../index/LegacyBinaryDocValuesWrapper.java     |   82 ++
 .../lucene/index/LegacyNumericDocValues.java    |   38 +
 .../index/LegacyNumericDocValuesWrapper.java    |   92 ++
 .../lucene/index/LegacySortedDocValues.java     |  110 ++
 .../index/LegacySortedDocValuesWrapper.java     |   92 ++
 .../index/LegacySortedNumericDocValues.java     |   49 +
 .../LegacySortedNumericDocValuesWrapper.java    |   88 ++
 .../lucene/index/LegacySortedSetDocValues.java  |  109 ++
 .../index/LegacySortedSetDocValuesWrapper.java  |  102 ++
 .../apache/lucene/index/MergeReaderWrapper.java |   15 -
 .../org/apache/lucene/index/MultiDocValues.java |  642 ++++++++---
 .../org/apache/lucene/index/MultiSorter.java    |  339 +++---
 .../apache/lucene/index/NormValuesWriter.java   |   69 +-
 .../apache/lucene/index/NumericDocValues.java   |    9 +-
 .../index/NumericDocValuesFieldUpdates.java     |    3 +-
 .../lucene/index/NumericDocValuesWriter.java    |   65 +-
 .../apache/lucene/index/ParallelLeafReader.java |    9 +-
 .../apache/lucene/index/RandomAccessOrds.java   |   53 -
 .../apache/lucene/index/ReadersAndUpdates.java  |  216 ++--
 .../lucene/index/SegmentDocValuesProducer.java  |    8 -
 .../org/apache/lucene/index/SegmentReader.java  |   12 +-
 .../index/SingletonSortedNumericDocValues.java  |   55 +-
 .../index/SingletonSortedSetDocValues.java      |   47 +-
 .../lucene/index/SlowCodecReaderWrapper.java    |    7 +-
 .../apache/lucene/index/SortedDocValues.java    |   30 +-
 .../lucene/index/SortedDocValuesWriter.java     |  112 +-
 .../lucene/index/SortedNumericDocValues.java    |   21 +-
 .../index/SortedNumericDocValuesWriter.java     |  103 +-
 .../apache/lucene/index/SortedSetDocValues.java |   22 +-
 .../lucene/index/SortedSetDocValuesWriter.java  |  191 ++--
 .../java/org/apache/lucene/index/Sorter.java    |  204 +++-
 .../apache/lucene/index/SortingLeafReader.java  |  460 ++++++--
 .../lucene/search/DocValuesRewriteMethod.java   |   18 +-
 .../apache/lucene/search/ExactPhraseScorer.java |    2 +-
 .../apache/lucene/search/FieldComparator.java   |  288 ++---
 .../apache/lucene/search/FieldValueQuery.java   |   45 +-
 .../lucene/search/SloppyPhraseScorer.java       |    2 +-
 .../lucene/search/SortedNumericSelector.java    |  101 +-
 .../lucene/search/SortedNumericSortField.java   |    2 +-
 .../apache/lucene/search/SortedSetSelector.java |  249 +++-
 .../lucene/search/SortedSetSortField.java       |    5 +-
 .../org/apache/lucene/search/package-info.java  |    2 +-
 .../search/similarities/BM25Similarity.java     |   31 +-
 .../search/similarities/MultiSimilarity.java    |    4 +-
 .../lucene/search/similarities/Similarity.java  |    4 +-
 .../search/similarities/SimilarityBase.java     |   26 +-
 .../search/similarities/TFIDFSimilarity.java    |   35 +-
 .../src/java/org/apache/lucene/util/Bits.java   |    4 +-
 .../java/org/apache/lucene/util/LongValues.java |   11 +-
 .../apache/lucene/util/packed/PackedInts.java   |    4 +-
 .../lucene54/TestLucene54DocValuesFormat.java   |   82 +-
 .../perfield/TestPerFieldDocValuesFormat.java   |   10 +-
 .../lucene/index/Test2BBinaryDocValues.java     |    6 +-
 .../lucene/index/Test2BNumericDocValues.java    |    3 +-
 .../index/Test2BSortedDocValuesFixedSorted.java |    5 +-
 .../lucene/index/Test2BSortedDocValuesOrds.java |    5 +-
 .../index/TestBinaryDocValuesUpdates.java       |  139 ++-
 .../apache/lucene/index/TestCustomNorms.java    |    3 +-
 .../index/TestDemoParallelLeafReader.java       |   58 +-
 .../lucene/index/TestDirectoryReader.java       |   11 +-
 .../lucene/index/TestDirectoryReaderReopen.java |   23 +-
 .../org/apache/lucene/index/TestDocValues.java  |   11 +-
 .../lucene/index/TestDocValuesIndexing.java     |   28 +-
 .../apache/lucene/index/TestIndexSorting.java   |  171 +--
 .../apache/lucene/index/TestIndexWriter.java    |    4 +-
 .../lucene/index/TestIndexWriterExceptions.java |    8 +-
 .../index/TestIndexingSequenceNumbers.java      |    6 +-
 .../lucene/index/TestMaxTermFrequency.java      |    3 +-
 .../lucene/index/TestMixedDocValuesUpdates.java |   26 +-
 .../apache/lucene/index/TestMultiDocValues.java |  142 ++-
 .../test/org/apache/lucene/index/TestNorms.java |    9 +-
 .../index/TestNumericDocValuesUpdates.java      |  139 ++-
 .../org/apache/lucene/index/TestOmitNorms.java  |   19 +-
 .../org/apache/lucene/index/TestOrdinalMap.java |   10 +-
 .../lucene/index/TestPostingsOffsets.java       |   20 +-
 .../org/apache/lucene/index/TestTermsEnum.java  |    9 +-
 .../lucene/index/TestUniqueTermCount.java       |    3 +-
 .../lucene/search/TestDocValuesScoring.java     |   26 +-
 .../lucene/search/TestElevationComparator.java  |   20 +-
 .../lucene/search/TestMinShouldMatch2.java      |    7 +-
 .../apache/lucene/search/TestPointQueries.java  |   13 +-
 .../lucene/search/TestSimilarityProvider.java   |    4 +-
 .../apache/lucene/search/TestSortRandom.java    |    3 +-
 .../lucene/util/packed/TestDirectPacked.java    |    6 +-
 .../lucene/expressions/SimpleBindings.java      |    2 +-
 .../expressions/js/JavascriptCompiler.java      |    2 +-
 .../expressions/TestExpressionValueSource.java  |    1 +
 .../DefaultSortedSetDocValuesReaderState.java   |    8 +-
 .../SortedSetDocValuesFacetCounts.java          |   54 +-
 .../facet/taxonomy/DocValuesOrdinalsReader.java |   19 +-
 .../facet/taxonomy/FastTaxonomyFacetCounts.java |   35 +-
 .../taxonomy/OrdinalMappingLeafReader.java      |   18 +-
 .../facet/taxonomy/TaxonomyFacetCounts.java     |    2 +-
 .../TaxonomyFacetSumFloatAssociations.java      |   39 +-
 .../TaxonomyFacetSumIntAssociations.java        |   39 +-
 .../lucene/facet/TestMultipleIndexFields.java   |    2 +-
 .../taxonomy/TestOrdinalMappingLeafReader.java  |    6 +-
 .../AbstractFirstPassGroupingCollector.java     |    2 +-
 .../FunctionFirstPassGroupingCollector.java     |    2 +-
 .../term/TermAllGroupHeadsCollector.java        |  170 ++-
 .../grouping/term/TermAllGroupsCollector.java   |   22 +-
 .../term/TermDistinctValuesCollector.java       |   37 +-
 .../term/TermFirstPassGroupingCollector.java    |   16 +-
 .../grouping/term/TermGroupFacetCollector.java  |   61 +-
 .../term/TermSecondPassGroupingCollector.java   |   17 +-
 .../grouping/AllGroupHeadsCollectorTest.java    |   11 +-
 .../lucene/search/grouping/TestGrouping.java    |   41 +-
 .../search/highlight/TermVectorLeafReader.java  |    5 -
 .../highlight/WeightedSpanTermExtractor.java    |    7 +-
 .../search/join/BaseGlobalOrdinalScorer.java    |    6 +-
 .../lucene/search/join/BlockJoinSelector.java   |  196 +++-
 .../search/join/DocValuesTermsCollector.java    |    5 +-
 .../search/join/GenericTermsCollector.java      |   30 +-
 .../search/join/GlobalOrdinalsCollector.java    |   21 +-
 .../lucene/search/join/GlobalOrdinalsQuery.java |   21 +-
 .../join/GlobalOrdinalsWithScoreCollector.java  |   36 +-
 .../join/GlobalOrdinalsWithScoreQuery.java      |   30 +-
 .../org/apache/lucene/search/join/JoinUtil.java |   44 +-
 .../lucene/search/join/TermsCollector.java      |   23 +-
 .../search/join/TermsWithScoreCollector.java    |   89 +-
 .../search/join/ToParentBlockJoinSortField.java |   54 +-
 .../search/join/TestBlockJoinSelector.java      |  197 +++-
 .../search/join/TestBlockJoinSorting.java       |    9 +-
 .../apache/lucene/search/join/TestJoinUtil.java |   51 +-
 .../apache/lucene/index/memory/MemoryIndex.java |   88 +-
 .../lucene/index/memory/TestMemoryIndex.java    |   42 +-
 .../memory/TestMemoryIndexAgainstRAMDir.java    |   58 +-
 .../search/DiversifiedTopDocsCollector.java     |   14 +-
 .../search/TestDiversifiedTopDocsCollector.java |   70 +-
 .../lucene/queries/function/FunctionValues.java |   60 +-
 .../lucene/queries/function/ValueSource.java    |   10 +-
 .../queries/function/ValueSourceScorer.java     |    2 +-
 .../function/docvalues/BoolDocValues.java       |   24 +-
 .../docvalues/DocTermsIndexDocValues.java       |   78 +-
 .../function/docvalues/DoubleDocValues.java     |   32 +-
 .../function/docvalues/FloatDocValues.java      |   22 +-
 .../function/docvalues/IntDocValues.java        |   24 +-
 .../function/docvalues/LongDocValues.java       |   26 +-
 .../function/docvalues/StrDocValues.java        |   12 +-
 .../valuesource/BytesRefFieldSource.java        |   56 +-
 .../valuesource/ComparisonBoolFunction.java     |    8 +-
 .../function/valuesource/DefFunction.java       |   26 +-
 .../function/valuesource/DivFloatFunction.java  |    4 +-
 .../function/valuesource/DoubleFieldSource.java |   43 +-
 .../function/valuesource/DualFloatFunction.java |    8 +-
 .../function/valuesource/EnumFieldSource.java   |   37 +-
 .../function/valuesource/FloatFieldSource.java  |   40 +-
 .../function/valuesource/IfFunction.java        |   24 +-
 .../function/valuesource/IntFieldSource.java    |   40 +-
 .../valuesource/JoinDocFreqValueSource.java     |   27 +-
 .../valuesource/LinearFloatFunction.java        |    6 +-
 .../function/valuesource/LongFieldSource.java   |   56 +-
 .../function/valuesource/MaxFloatFunction.java  |    6 +-
 .../function/valuesource/MinFloatFunction.java  |    6 +-
 .../function/valuesource/MultiBoolFunction.java |    6 +-
 .../valuesource/MultiFloatFunction.java         |   10 +-
 .../function/valuesource/MultiFunction.java     |   13 +-
 .../function/valuesource/NormValueSource.java   |   23 +-
 .../function/valuesource/PowFloatFunction.java  |    4 +-
 .../valuesource/ProductFloatFunction.java       |    4 +-
 .../valuesource/RangeMapFloatFunction.java      |    4 +-
 .../valuesource/ReciprocalFloatFunction.java    |    6 +-
 .../valuesource/ScaleFloatFunction.java         |    6 +-
 .../valuesource/SimpleBoolFunction.java         |    6 +-
 .../valuesource/SimpleFloatFunction.java        |    6 +-
 .../valuesource/SortedSetFieldSource.java       |    6 +-
 .../function/valuesource/SumFloatFunction.java  |    6 +-
 .../function/valuesource/VectorValueSource.java |   33 +-
 .../lucene/queries/TestCustomScoreQuery.java    |   11 +-
 .../queries/function/TestValueSources.java      |    4 +-
 .../document/LatLonPointDistanceComparator.java |   58 +-
 .../lucene/search/DocValuesNumbersQuery.java    |   31 +-
 .../lucene/search/DocValuesRangeQuery.java      |   36 +-
 .../lucene/search/DocValuesTermsQuery.java      |   16 +-
 .../lucene/search/TermAutomatonScorer.java      |    2 +-
 .../search/BaseRangeFieldQueryTestCase.java     |    5 +-
 .../spatial/bbox/BBoxSimilarityValueSource.java |    9 +-
 .../lucene/spatial/bbox/BBoxValueSource.java    |   54 +-
 .../serialized/SerializedDVStrategy.java        |   35 +-
 .../spatial/util/CachingDoubleValueSource.java  |    6 +-
 .../util/DistanceToShapeValueSource.java        |    4 +-
 .../spatial/util/ShapeAreaValueSource.java      |    6 +-
 .../spatial/util/ShapePredicateValueSource.java |    4 +-
 .../spatial/vector/DistanceValueSource.java     |   33 +-
 .../GeoPointTermQueryConstantScoreWrapper.java  |   16 +-
 .../spatial3d/Geo3DPointDistanceComparator.java |   43 +-
 .../Geo3DPointOutsideDistanceComparator.java    |   41 +-
 .../apache/lucene/spatial3d/TestGeo3DPoint.java |    7 +-
 .../search/suggest/DocumentDictionary.java      |   12 +-
 .../suggest/DocumentValueSourceDictionary.java  |    8 +-
 .../analyzing/AnalyzingInfixSuggester.java      |   31 +-
 .../analyzing/BlendedInfixSuggester.java        |   26 +-
 .../document/TestPrefixCompletionQuery.java     |   33 +-
 .../asserting/AssertingDocValuesFormat.java     |  173 ++-
 .../asserting/AssertingLiveDocsFormat.java      |    2 +-
 .../codecs/asserting/AssertingNormsFormat.java  |   22 +-
 .../codecs/cranky/CrankyDocValuesFormat.java    |   21 +-
 .../lucene/codecs/cranky/CrankyNormsFormat.java |    4 +-
 .../apache/lucene/geo/BaseGeoPointTestCase.java |   21 +-
 .../lucene/index/AssertingLeafReader.java       |  356 +++---
 .../index/BaseDocValuesFormatTestCase.java      |  724 ++++++------
 .../index/BaseIndexFileFormatTestCase.java      |  101 +-
 .../lucene/index/BaseNormsFormatTestCase.java   |   14 +-
 .../lucene/index/BasePointsFormatTestCase.java  |   26 +-
 .../index/BaseStoredFieldsFormatTestCase.java   |    3 +-
 .../lucene/index/FieldFilterLeafReader.java     |   13 -
 .../org/apache/lucene/search/QueryUtils.java    |   11 +-
 .../org/apache/lucene/util/LuceneTestCase.java  |   77 +-
 .../java/org/apache/lucene/util/TestUtil.java   |    3 +-
 .../facet/FieldFacetAccumulator.java            |   44 +-
 .../AbstractDelegatingStatsCollector.java       |    2 +-
 .../statistics/MedianStatsCollector.java        |    3 +-
 .../statistics/MinMaxStatsCollector.java        |    2 +-
 .../statistics/NumericStatsCollector.java       |    3 +-
 .../statistics/PercentileStatsCollector.java    |    3 +-
 .../analytics/statistics/StatsCollector.java    |    2 +-
 .../statistics/UniqueStatsCollector.java        |    3 +-
 .../AbsoluteValueDoubleFunction.java            |    4 +-
 .../util/valuesource/AddDoubleFunction.java     |    4 +-
 .../util/valuesource/ConcatStringFunction.java  |    4 +-
 .../util/valuesource/DateFieldSource.java       |   36 +-
 .../util/valuesource/DateMathFunction.java      |    3 +-
 .../util/valuesource/DivDoubleFunction.java     |    4 +-
 .../util/valuesource/DualDoubleFunction.java    |    8 +-
 .../util/valuesource/FilterFieldSource.java     |   22 +-
 .../util/valuesource/LogDoubleFunction.java     |    4 +-
 .../util/valuesource/MultiDateFunction.java     |   10 +-
 .../util/valuesource/MultiDoubleFunction.java   |    8 +-
 .../util/valuesource/MultiStringFunction.java   |   12 +-
 .../valuesource/MultiplyDoubleFunction.java     |    4 +-
 .../util/valuesource/NegateDoubleFunction.java  |    4 +-
 .../util/valuesource/PowDoubleFunction.java     |    4 +-
 .../util/valuesource/ReverseStringFunction.java |    4 +-
 .../util/valuesource/SingleDoubleFunction.java  |    8 +-
 .../util/valuesource/SingleStringFunction.java  |   14 +-
 .../solr/handler/component/ExpandComponent.java |   68 +-
 .../solr/handler/component/FieldFacetStats.java |   22 +-
 .../solr/handler/component/StatsValues.java     |    2 +-
 .../handler/component/StatsValuesFactory.java   |    8 +-
 .../solr/index/SlowCompositeReaderWrapper.java  |   39 +-
 .../apache/solr/request/DocValuesFacets.java    |   70 +-
 .../org/apache/solr/request/DocValuesStats.java |   48 +-
 .../org/apache/solr/request/IntervalFacets.java |   58 +-
 .../org/apache/solr/request/NumericFacets.java  |   31 +-
 .../request/PerSegmentSingleValuedFaceting.java |   40 +-
 .../solr/response/SortingResponseWriter.java    |  151 ++-
 .../transform/ValueSourceAugmenter.java         |    8 +-
 .../java/org/apache/solr/schema/BoolField.java  |   24 +-
 .../org/apache/solr/schema/CurrencyField.java   |   32 +-
 .../java/org/apache/solr/schema/LatLonType.java |    2 +-
 .../schema/RptWithGeometrySpatialField.java     |   10 +-
 .../org/apache/solr/schema/StrFieldSource.java  |    8 +-
 .../org/apache/solr/schema/TrieDoubleField.java |   48 +-
 .../org/apache/solr/schema/TrieFloatField.java  |   49 +-
 .../org/apache/solr/schema/TrieIntField.java    |   49 +-
 .../org/apache/solr/schema/TrieLongField.java   |   49 +-
 .../solr/search/CollapsingQParserPlugin.java    |  227 +++-
 .../apache/solr/search/HashQParserPlugin.java   |   29 +-
 .../solr/search/IGainTermsQParserPlugin.java    |   13 +-
 .../apache/solr/search/SolrIndexSearcher.java   |   55 +-
 .../TextLogisticRegressionQParserPlugin.java    |   11 +-
 .../apache/solr/search/ValueSourceParser.java   |   78 +-
 .../facet/FacetFieldProcessorByArrayDV.java     |   78 +-
 .../facet/FacetFieldProcessorByHashDV.java      |   19 +-
 .../org/apache/solr/search/facet/HLLAgg.java    |   13 +-
 .../apache/solr/search/facet/PercentileAgg.java |    2 +-
 .../org/apache/solr/search/facet/SlotAcc.java   |   12 +-
 .../org/apache/solr/search/facet/UniqueAgg.java |   12 +-
 .../solr/search/facet/UniqueMultiDvSlotAcc.java |   35 +-
 .../search/facet/UniqueSinglevaluedSlotAcc.java |   24 +-
 .../solr/search/function/OrdFieldSource.java    |   33 +-
 .../search/function/ReverseOrdFieldSource.java  |   13 +-
 .../function/SolrComparisonBoolFunction.java    |    4 +-
 .../function/distance/GeohashFunction.java      |    4 +-
 .../distance/GeohashHaversineFunction.java      |    6 +-
 .../distance/HaversineConstFunction.java        |    4 +-
 .../function/distance/HaversineFunction.java    |    6 +-
 .../distance/SquaredEuclideanFunction.java      |    4 +-
 .../distance/StringDistanceFunction.java        |    6 +-
 .../distance/VectorDistanceFunction.java        |    6 +-
 .../join/BlockJoinFieldFacetAccumulator.java    |   31 +-
 .../solr/search/join/GraphTermsCollector.java   |   20 +-
 .../apache/solr/uninverting/DocTermOrds.java    |    6 +-
 .../org/apache/solr/uninverting/FieldCache.java |   15 +-
 .../apache/solr/uninverting/FieldCacheImpl.java |  320 ++++--
 .../solr/uninverting/UninvertingReader.java     |   64 +-
 .../apache/solr/schema/DocValuesMultiTest.java  |   10 +-
 .../org/apache/solr/schema/DocValuesTest.java   |   48 +-
 .../test/org/apache/solr/search/TestDocSet.java |    5 -
 .../apache/solr/search/TestRankQueryPlugin.java |   14 +-
 .../search/function/NvlValueSourceParser.java   |    6 +-
 .../solr/uninverting/TestDocTermOrds.java       |   44 +-
 .../apache/solr/uninverting/TestFieldCache.java |  211 ++--
 .../solr/uninverting/TestFieldCacheReopen.java  |   10 +-
 .../TestFieldCacheSanityChecker.java            |   18 +-
 .../uninverting/TestFieldCacheSortRandom.java   |    3 +-
 .../uninverting/TestFieldCacheVsDocValues.java  |   55 +-
 .../uninverting/TestFieldCacheWithThreads.java  |   60 +-
 .../solr/uninverting/TestLegacyFieldCache.java  |  147 +--
 .../solr/uninverting/TestUninvertingReader.java |   16 +-
 .../apache/solr/update/DocumentBuilderTest.java |    9 +-
 335 files changed, 10597 insertions(+), 5844 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 7c60d2c..c7d71a2 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -18,6 +18,10 @@ API Changes
 * LUCENE-7355: AnalyzingQueryParser has been removed as its functionality has
   been folded into the classic QueryParser. (Adrien Grand)
 
+* LUCENE-7407: Doc values APIs have been switched from random access
+  to iterators, enabling future codec compression improvements. (Mike
+  McCandless)
+
 Bug Fixes
 
 Improvements

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/lucene/analysis/common/src/test/org/apache/lucene/collation/TestCollationDocValuesField.java
----------------------------------------------------------------------
diff --git a/lucene/analysis/common/src/test/org/apache/lucene/collation/TestCollationDocValuesField.java b/lucene/analysis/common/src/test/org/apache/lucene/collation/TestCollationDocValuesField.java
index 3a81ba4..018422f 100644
--- a/lucene/analysis/common/src/test/org/apache/lucene/collation/TestCollationDocValuesField.java
+++ b/lucene/analysis/common/src/test/org/apache/lucene/collation/TestCollationDocValuesField.java
@@ -120,7 +120,8 @@ public class TestCollationDocValuesField extends LuceneTestCase {
       Document doc = is.doc(docID);
       String s = doc.getField("field").stringValue();
       boolean collatorAccepts = collate(collator, s, startPoint) >= 0 && collate(collator, s, endPoint) <= 0;
-      BytesRef br = dvs.get(docID);
+      assertEquals(docID, dvs.nextDoc());
+      BytesRef br = dvs.binaryValue();
       boolean luceneAccepts = br.compareTo(startBR) >= 0 && br.compareTo(endBR) <= 0;
       assertEquals(startPoint + " <= " + s + " <= " + endPoint, collatorAccepts, luceneAccepts);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/lucene/analysis/icu/src/test/org/apache/lucene/collation/TestICUCollationDocValuesField.java
----------------------------------------------------------------------
diff --git a/lucene/analysis/icu/src/test/org/apache/lucene/collation/TestICUCollationDocValuesField.java b/lucene/analysis/icu/src/test/org/apache/lucene/collation/TestICUCollationDocValuesField.java
index 28fdd43..24862c4 100644
--- a/lucene/analysis/icu/src/test/org/apache/lucene/collation/TestICUCollationDocValuesField.java
+++ b/lucene/analysis/icu/src/test/org/apache/lucene/collation/TestICUCollationDocValuesField.java
@@ -117,7 +117,8 @@ public class TestICUCollationDocValuesField extends LuceneTestCase {
       Document doc = is.doc(docID);
       String s = doc.getField("field").stringValue();
       boolean collatorAccepts = collator.compare(s, startPoint) >= 0 && collator.compare(s, endPoint) <= 0;
-      BytesRef br = dvs.get(docID);
+      assertEquals(docID, dvs.nextDoc());
+      BytesRef br = dvs.binaryValue();
       boolean luceneAccepts = br.compareTo(startBR) >= 0 && br.compareTo(endBR) <= 0;
       assertEquals(collatorAccepts, luceneAccepts);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/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 62cd9cf..6c56cec 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
@@ -778,43 +778,56 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
       
       for (int i=0;i<35;i++) {
         int id = Integer.parseInt(reader.document(i).get("id"));
-        assertEquals(id, dvByte.get(i));
+        assertEquals(i, dvByte.nextDoc());
+        assertEquals(id, dvByte.longValue());
         
         byte bytes[] = new byte[] {
             (byte)(id >>> 24), (byte)(id >>> 16),(byte)(id >>> 8),(byte)id
         };
         BytesRef expectedRef = new BytesRef(bytes);
         
-        BytesRef term = dvBytesDerefFixed.get(i);
+        assertEquals(i, dvBytesDerefFixed.nextDoc());
+        BytesRef term = dvBytesDerefFixed.binaryValue();
         assertEquals(expectedRef, term);
-        term = dvBytesDerefVar.get(i);
+        assertEquals(i, dvBytesDerefVar.nextDoc());
+        term = dvBytesDerefVar.binaryValue();
         assertEquals(expectedRef, term);
-        term = dvBytesSortedFixed.get(i);
+        assertEquals(i, dvBytesSortedFixed.nextDoc());
+        term = dvBytesSortedFixed.binaryValue();
         assertEquals(expectedRef, term);
-        term = dvBytesSortedVar.get(i);
+        assertEquals(i, dvBytesSortedVar.nextDoc());
+        term = dvBytesSortedVar.binaryValue();
         assertEquals(expectedRef, term);
-        term = dvBytesStraightFixed.get(i);
+        assertEquals(i, dvBytesStraightFixed.nextDoc());
+        term = dvBytesStraightFixed.binaryValue();
         assertEquals(expectedRef, term);
-        term = dvBytesStraightVar.get(i);
+        assertEquals(i, dvBytesStraightVar.nextDoc());
+        term = dvBytesStraightVar.binaryValue();
         assertEquals(expectedRef, term);
         
-        assertEquals((double)id, Double.longBitsToDouble(dvDouble.get(i)), 0D);
-        assertEquals((float)id, Float.intBitsToFloat((int)dvFloat.get(i)), 0F);
-        assertEquals(id, dvInt.get(i));
-        assertEquals(id, dvLong.get(i));
-        assertEquals(id, dvPacked.get(i));
-        assertEquals(id, dvShort.get(i));
+        assertEquals(i, dvDouble.nextDoc());
+        assertEquals((double)id, Double.longBitsToDouble(dvDouble.longValue()), 0D);
+        assertEquals(i, dvFloat.nextDoc());
+        assertEquals((float)id, Float.intBitsToFloat((int)dvFloat.longValue()), 0F);
+        assertEquals(i, dvInt.nextDoc());
+        assertEquals(id, dvInt.longValue());
+        assertEquals(i, dvLong.nextDoc());
+        assertEquals(id, dvLong.longValue());
+        assertEquals(i, dvPacked.nextDoc());
+        assertEquals(id, dvPacked.longValue());
+        assertEquals(i, dvShort.nextDoc());
+        assertEquals(id, dvShort.longValue());
         if (is42Index) {
-          dvSortedSet.setDocument(i);
+          assertEquals(i, dvSortedSet.nextDoc());
           long ord = dvSortedSet.nextOrd();
           assertEquals(SortedSetDocValues.NO_MORE_ORDS, dvSortedSet.nextOrd());
           term = dvSortedSet.lookupOrd(ord);
           assertEquals(expectedRef, term);
         }
         if (is49Index) {
-          dvSortedNumeric.setDocument(i);
-          assertEquals(1, dvSortedNumeric.count());
-          assertEquals(id, dvSortedNumeric.valueAt(0));
+          assertEquals(i, dvSortedNumeric.nextDoc());
+          assertEquals(1, dvSortedNumeric.docValueCount());
+          assertEquals(id, dvSortedNumeric.nextValue());
         }
       }
     }
@@ -1378,7 +1391,9 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
     NumericDocValues ndvf = r.getNumericDocValues(f);
     NumericDocValues ndvcf = r.getNumericDocValues(cf);
     for (int i = 0; i < r.maxDoc(); i++) {
-      assertEquals(ndvcf.get(i), ndvf.get(i)*2);
+      assertEquals(i, ndvcf.nextDoc());
+      assertEquals(i, ndvf.nextDoc());
+      assertEquals(ndvcf.longValue(), ndvf.longValue()*2);
     }
   }
   
@@ -1386,7 +1401,9 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
     BinaryDocValues bdvf = r.getBinaryDocValues(f);
     BinaryDocValues bdvcf = r.getBinaryDocValues(cf);
     for (int i = 0; i < r.maxDoc(); i++) {
-      assertEquals(getValue(bdvcf, i), getValue(bdvf, i)*2);
+      assertEquals(i, bdvf.nextDoc());
+      assertEquals(i, bdvcf.nextDoc());
+      assertEquals(getValue(bdvcf), getValue(bdvf)*2);
     }
   }
   
@@ -1464,9 +1481,9 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
     }
   }
   
-  static long getValue(BinaryDocValues bdv, int idx) {
-    BytesRef term = bdv.get(idx);
-    idx = term.offset;
+  static long getValue(BinaryDocValues bdv) {
+    BytesRef term = bdv.binaryValue();
+    int idx = term.offset;
     byte b = term.bytes[idx++];
     long value = b & 0x7FL;
     for (int shift = 7; (b & 0x80L) != 0; shift += 7) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesConsumer.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesConsumer.java b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesConsumer.java
index 4260745..7d096a4 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesConsumer.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesConsumer.java
@@ -22,6 +22,8 @@ import java.util.Iterator;
 
 import org.apache.lucene.codecs.CodecUtil;
 import org.apache.lucene.codecs.DocValuesConsumer;
+import org.apache.lucene.codecs.DocValuesProducer;
+import org.apache.lucene.codecs.LegacyDocValuesIterables;
 import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.SegmentWriteState;
@@ -29,14 +31,14 @@ import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.IOUtils;
 
-import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.VERSION_CURRENT;
 import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.BYTES;
+import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.NUMBER;
 import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.SORTED;
 import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.SORTED_NUMERIC;
 import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.SORTED_NUMERIC_SINGLETON;
 import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.SORTED_SET;
 import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.SORTED_SET_SINGLETON;
-import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.NUMBER;
+import static org.apache.lucene.codecs.memory.DirectDocValuesProducer.VERSION_CURRENT;
 
 /**
  * Writer for {@link DirectDocValuesFormat}
@@ -65,10 +67,10 @@ class DirectDocValuesConsumer extends DocValuesConsumer {
   }
 
   @Override
-  public void addNumericField(FieldInfo field, Iterable<Number> values) throws IOException {
+  public void addNumericField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
     meta.writeVInt(field.number);
     meta.writeByte(NUMBER);
-    addNumericFieldValues(field, values);
+    addNumericFieldValues(field, LegacyDocValuesIterables.numericIterable(field, valuesProducer, maxDoc));
   }
 
   private void addNumericFieldValues(FieldInfo field, Iterable<Number> values) throws IOException {
@@ -162,10 +164,10 @@ class DirectDocValuesConsumer extends DocValuesConsumer {
   }
 
   @Override
-  public void addBinaryField(FieldInfo field, final Iterable<BytesRef> values) throws IOException {
+  public void addBinaryField(FieldInfo field, final DocValuesProducer valuesProducer) throws IOException {
     meta.writeVInt(field.number);
     meta.writeByte(BYTES);
-    addBinaryFieldValues(field, values);
+    addBinaryFieldValues(field, LegacyDocValuesIterables.binaryIterable(field, valuesProducer, maxDoc));
   }
 
   private void addBinaryFieldValues(FieldInfo field, final Iterable<BytesRef> values) throws IOException {
@@ -231,19 +233,22 @@ class DirectDocValuesConsumer extends DocValuesConsumer {
   }
 
   @Override
-  public void addSortedField(FieldInfo field, Iterable<BytesRef> values, Iterable<Number> docToOrd) throws IOException {
+  public void addSortedField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
     meta.writeVInt(field.number);
     meta.writeByte(SORTED);
 
     // write the ordinals as numerics
-    addNumericFieldValues(field, docToOrd);
-    
+    addNumericFieldValues(field, LegacyDocValuesIterables.sortedOrdIterable(valuesProducer, field, maxDoc));
     // write the values as binary
-    addBinaryFieldValues(field, values);
+    addBinaryFieldValues(field, LegacyDocValuesIterables.valuesIterable(valuesProducer.getSorted(field)));
   }
   
   @Override
-  public void addSortedNumericField(FieldInfo field, Iterable<Number> docToValueCount, Iterable<Number> values) throws IOException {
+  public void addSortedNumericField(FieldInfo field, final DocValuesProducer valuesProducer) throws IOException {
+
+    final Iterable<Number> docToValueCount = LegacyDocValuesIterables.sortedNumericToDocCount(valuesProducer, field, maxDoc);
+    final Iterable<Number> values = LegacyDocValuesIterables.sortedNumericToValues(valuesProducer, field);
+
     meta.writeVInt(field.number);
     if (isSingleValued(docToValueCount)) {
       meta.writeByte(SORTED_NUMERIC_SINGLETON);
@@ -264,7 +269,11 @@ class DirectDocValuesConsumer extends DocValuesConsumer {
 
   // note: this might not be the most efficient... but it's fairly simple
   @Override
-  public void addSortedSetField(FieldInfo field, Iterable<BytesRef> values, final Iterable<Number> docToOrdCount, final Iterable<Number> ords) throws IOException {
+  public void addSortedSetField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
+    Iterable<BytesRef> values = LegacyDocValuesIterables.valuesIterable(valuesProducer.getSortedSet(field));
+    Iterable<Number> docToOrdCount = LegacyDocValuesIterables.sortedSetOrdCountIterable(valuesProducer, field, maxDoc);
+    Iterable<Number> ords = LegacyDocValuesIterables.sortedSetOrdsIterable(valuesProducer, field);
+    
     meta.writeVInt(field.number);
     
     if (isSingleValued(docToOrdCount)) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesProducer.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesProducer.java b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesProducer.java
index 1dfd2f2..fe6c8f6 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesProducer.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectDocValuesProducer.java
@@ -28,18 +28,8 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.lucene.codecs.CodecUtil;
 import org.apache.lucene.codecs.DocValuesProducer;
-import org.apache.lucene.index.BinaryDocValues;
-import org.apache.lucene.index.CorruptIndexException;
-import org.apache.lucene.index.DocValues;
-import org.apache.lucene.index.FieldInfo;
-import org.apache.lucene.index.FieldInfos;
-import org.apache.lucene.index.IndexFileNames;
-import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.index.RandomAccessOrds;
-import org.apache.lucene.index.SegmentReadState;
+import org.apache.lucene.index.*;
 import org.apache.lucene.index.SortedDocValues;
-import org.apache.lucene.index.SortedNumericDocValues;
-import org.apache.lucene.index.SortedSetDocValues;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.util.Accountable;
@@ -284,15 +274,16 @@ class DirectDocValuesProducer extends DocValuesProducer {
   @Override
   public synchronized NumericDocValues getNumeric(FieldInfo field) throws IOException {
     NumericRawValues instance = numericInstances.get(field.name);
+    NumericEntry ne = numerics.get(field.name);
     if (instance == null) {
       // Lazy load
-      instance = loadNumeric(numerics.get(field.name));
+      instance = loadNumeric(ne);
       if (!merging) {
         numericInstances.put(field.name, instance);
         ramBytesUsed.addAndGet(instance.ramBytesUsed());
       }
     }
-    return instance.numerics;
+    return new LegacyNumericDocValuesWrapper(getMissingBits(field, ne.missingOffset, ne.missingBytes), instance.numerics);
   }
   
   private NumericRawValues loadNumeric(NumericEntry entry) throws IOException {
@@ -305,7 +296,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
         final byte[] values = new byte[entry.count];
         data.readBytes(values, 0, entry.count);
         ret.bytesUsed = RamUsageEstimator.sizeOf(values);
-        ret.numerics = new NumericDocValues() {
+        ret.numerics = new LegacyNumericDocValues() {
           @Override
           public long get(int idx) {
             return values[idx];
@@ -321,7 +312,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
           values[i] = data.readShort();
         }
         ret.bytesUsed = RamUsageEstimator.sizeOf(values);
-        ret.numerics = new NumericDocValues() {
+        ret.numerics = new LegacyNumericDocValues() {
           @Override
           public long get(int idx) {
             return values[idx];
@@ -337,7 +328,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
           values[i] = data.readInt();
         }
         ret.bytesUsed = RamUsageEstimator.sizeOf(values);
-        ret.numerics = new NumericDocValues() {
+        ret.numerics = new LegacyNumericDocValues() {
           @Override
           public long get(int idx) {
             return values[idx];
@@ -353,7 +344,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
           values[i] = data.readLong();
         }
         ret.bytesUsed = RamUsageEstimator.sizeOf(values);
-        ret.numerics = new NumericDocValues() {
+        ret.numerics = new LegacyNumericDocValues() {
           @Override
           public long get(int idx) {
             return values[idx];
@@ -367,8 +358,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
     }
   }
 
-  @Override
-  public synchronized BinaryDocValues getBinary(FieldInfo field) throws IOException {
+  private synchronized LegacyBinaryDocValues getLegacyBinary(FieldInfo field) throws IOException {
     BinaryRawValues instance = binaryInstances.get(field.name);
     if (instance == null) {
       // Lazy load
@@ -381,7 +371,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
     final byte[] bytes = instance.bytes;
     final int[] address = instance.address;
 
-    return new BinaryDocValues() {
+    return new LegacyBinaryDocValues() {
       final BytesRef term = new BytesRef();
 
       @Override
@@ -394,6 +384,12 @@ class DirectDocValuesProducer extends DocValuesProducer {
     };
   }
   
+  @Override
+  public synchronized BinaryDocValues getBinary(FieldInfo field) throws IOException {
+    BinaryEntry be = binaries.get(field.name);
+    return new LegacyBinaryDocValuesWrapper(getMissingBits(field, be.missingOffset, be.missingBytes), getLegacyBinary(field));
+  }
+  
   private BinaryRawValues loadBinary(BinaryEntry entry) throws IOException {
     IndexInput data = this.data.clone();
     data.seek(entry.offset);
@@ -428,11 +424,11 @@ class DirectDocValuesProducer extends DocValuesProducer {
         }
       }
     }
-    return newSortedInstance(instance.docToOrd.numerics, getBinary(field), entry.values.count);
+    return new LegacySortedDocValuesWrapper(newSortedInstance(instance.docToOrd.numerics, getLegacyBinary(field), entry.values.count), maxDoc);
   }
   
-  private SortedDocValues newSortedInstance(final NumericDocValues docToOrd, final BinaryDocValues values, final int count) {
-    return new SortedDocValues() {
+  private LegacySortedDocValues newSortedInstance(final LegacyNumericDocValues docToOrd, final LegacyBinaryDocValues values, final int count) {
+    return new LegacySortedDocValues() {
 
       @Override
       public int getOrd(int docID) {
@@ -477,14 +473,14 @@ class DirectDocValuesProducer extends DocValuesProducer {
     }
     
     if (entry.docToAddress == null) {
-      final NumericDocValues single = instance.values.numerics;
+      final LegacyNumericDocValues single = instance.values.numerics;
       final Bits docsWithField = getMissingBits(field, entry.values.missingOffset, entry.values.missingBytes);
-      return DocValues.singleton(single, docsWithField);
+      return DocValues.singleton(new LegacyNumericDocValuesWrapper(docsWithField, single));
     } else {
-      final NumericDocValues docToAddress = instance.docToAddress.numerics;
-      final NumericDocValues values = instance.values.numerics;
+      final LegacyNumericDocValues docToAddress = instance.docToAddress.numerics;
+      final LegacyNumericDocValues values = instance.values.numerics;
       
-      return new SortedNumericDocValues() {
+      return new LegacySortedNumericDocValuesWrapper(new LegacySortedNumericDocValues() {
         int valueStart;
         int valueLimit;
         
@@ -503,7 +499,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
         public int count() {
           return valueLimit - valueStart;
         }
-      };
+        }, maxDoc);
     }
   }
   
@@ -530,15 +526,15 @@ class DirectDocValuesProducer extends DocValuesProducer {
     }
 
     if (instance.docToOrdAddress == null) {
-      SortedDocValues sorted = newSortedInstance(instance.ords.numerics, getBinary(field), entry.values.count);
-      return DocValues.singleton(sorted);
+      LegacySortedDocValues sorted = newSortedInstance(instance.ords.numerics, getLegacyBinary(field), entry.values.count);
+      return DocValues.singleton(new LegacySortedDocValuesWrapper(sorted, maxDoc));
     } else {
-      final NumericDocValues docToOrdAddress = instance.docToOrdAddress.numerics;
-      final NumericDocValues ords = instance.ords.numerics;
-      final BinaryDocValues values = getBinary(field);
+      final LegacyNumericDocValues docToOrdAddress = instance.docToOrdAddress.numerics;
+      final LegacyNumericDocValues ords = instance.ords.numerics;
+      final LegacyBinaryDocValues values = getLegacyBinary(field);
       
       // Must make a new instance since the iterator has state:
-      return new RandomAccessOrds() {
+      return new LegacySortedSetDocValuesWrapper(new LegacySortedSetDocValues() {
         int ordStart;
         int ordUpto;
         int ordLimit;
@@ -568,20 +564,10 @@ class DirectDocValuesProducer extends DocValuesProducer {
           return entry.values.count;
         }
         
-        @Override
-        public long ordAt(int index) {
-          return ords.get(ordStart + index);
-        }
-        
-        @Override
-        public int cardinality() {
-          return ordLimit - ordStart;
-        }
-        
         // Leave lookupTerm to super's binary search
         
         // Leave termsEnum to super
-      };
+        }, maxDoc);
     }
   }
   
@@ -621,26 +607,6 @@ class DirectDocValuesProducer extends DocValuesProducer {
   }
   
   @Override
-  public Bits getDocsWithField(FieldInfo field) throws IOException {
-    switch(field.getDocValuesType()) {
-      case SORTED_SET:
-        return DocValues.docsWithValue(getSortedSet(field), maxDoc);
-      case SORTED_NUMERIC:
-        return DocValues.docsWithValue(getSortedNumeric(field), maxDoc);
-      case SORTED:
-        return DocValues.docsWithValue(getSorted(field), maxDoc);
-      case BINARY:
-        BinaryEntry be = binaries.get(field.name);
-        return getMissingBits(field, be.missingOffset, be.missingBytes);
-      case NUMERIC:
-        NumericEntry ne = numerics.get(field.name);
-        return getMissingBits(field, ne.missingOffset, ne.missingBytes);
-      default: 
-        throw new AssertionError();
-    }
-  }
-
-  @Override
   public synchronized DocValuesProducer getMergeInstance() throws IOException {
     return new DirectDocValuesProducer(this);
   }
@@ -680,7 +646,7 @@ class DirectDocValuesProducer extends DocValuesProducer {
   }
   
   static class NumericRawValues implements Accountable {
-    NumericDocValues numerics;
+    LegacyNumericDocValues numerics;
     long bytesUsed;
     
     @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesConsumer.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesConsumer.java b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesConsumer.java
index 44ffdf9..eb7d096 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesConsumer.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesConsumer.java
@@ -25,6 +25,8 @@ import java.util.NoSuchElementException;
 
 import org.apache.lucene.codecs.CodecUtil;
 import org.apache.lucene.codecs.DocValuesConsumer;
+import org.apache.lucene.codecs.DocValuesProducer;
+import org.apache.lucene.codecs.LegacyDocValuesIterables;
 import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.SegmentWriteState;
@@ -45,19 +47,19 @@ import org.apache.lucene.util.packed.MonotonicBlockPackedWriter;
 import org.apache.lucene.util.packed.PackedInts.FormatAndBits;
 import org.apache.lucene.util.packed.PackedInts;
 
-import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.VERSION_CURRENT;
+import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.BLOCK_COMPRESSED;
 import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.BLOCK_SIZE;
 import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.BYTES;
-import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.NUMBER;
+import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.DELTA_COMPRESSED;
 import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.FST;
-import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.SORTED_SET;
-import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.SORTED_SET_SINGLETON;
+import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.GCD_COMPRESSED;
+import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.NUMBER;
 import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.SORTED_NUMERIC;
 import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.SORTED_NUMERIC_SINGLETON;
-import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.DELTA_COMPRESSED;
-import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.BLOCK_COMPRESSED;
-import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.GCD_COMPRESSED;
+import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.SORTED_SET;
+import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.SORTED_SET_SINGLETON;
 import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.TABLE_COMPRESSED;
+import static org.apache.lucene.codecs.memory.MemoryDocValuesProducer.VERSION_CURRENT;
 
 /**
  * Writer for {@link MemoryDocValuesFormat}
@@ -87,8 +89,8 @@ class MemoryDocValuesConsumer extends DocValuesConsumer {
   }
 
   @Override
-  public void addNumericField(FieldInfo field, Iterable<Number> values) throws IOException {
-    addNumericField(field, values, true);
+  public void addNumericField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
+    addNumericField(field, LegacyDocValuesIterables.numericIterable(field, valuesProducer, maxDoc), true);
   }
 
   void addNumericField(FieldInfo field, Iterable<Number> values, boolean optimizeStorage) throws IOException {
@@ -297,7 +299,11 @@ class MemoryDocValuesConsumer extends DocValuesConsumer {
   }
 
   @Override
-  public void addBinaryField(FieldInfo field, final Iterable<BytesRef> values) throws IOException {
+  public void addBinaryField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
+    addBinaryField(field, LegacyDocValuesIterables.binaryIterable(field, valuesProducer, maxDoc));
+  }
+
+  private void addBinaryField(FieldInfo field, final Iterable<BytesRef> values) throws IOException {
     // write the byte[] data
     meta.writeVInt(field.number);
     meta.writeByte(BYTES);
@@ -396,7 +402,13 @@ class MemoryDocValuesConsumer extends DocValuesConsumer {
   }
 
   @Override
-  public void addSortedField(FieldInfo field, Iterable<BytesRef> values, Iterable<Number> docToOrd) throws IOException {
+  public void addSortedField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
+    addSortedField(field,
+                   LegacyDocValuesIterables.valuesIterable(valuesProducer.getSorted(field)),
+                   LegacyDocValuesIterables.sortedOrdIterable(valuesProducer, field, maxDoc));
+  }
+  
+  private void addSortedField(FieldInfo field, Iterable<BytesRef> values, Iterable<Number> docToOrd) throws IOException {
     // write the ordinals as numerics
     addNumericField(field, docToOrd, false);
     
@@ -405,7 +417,11 @@ class MemoryDocValuesConsumer extends DocValuesConsumer {
   }
   
   @Override
-  public void addSortedNumericField(FieldInfo field, Iterable<Number> docToValueCount, Iterable<Number> values) throws IOException {
+  public void addSortedNumericField(FieldInfo field, final DocValuesProducer valuesProducer) throws IOException {
+
+    final Iterable<Number> docToValueCount = LegacyDocValuesIterables.sortedNumericToDocCount(valuesProducer, field, maxDoc);
+    final Iterable<Number> values = LegacyDocValuesIterables.sortedNumericToValues(valuesProducer, field);
+
     meta.writeVInt(field.number);
     
     if (isSingleValued(docToValueCount)) {
@@ -436,7 +452,10 @@ class MemoryDocValuesConsumer extends DocValuesConsumer {
 
   // note: this might not be the most efficient... but it's fairly simple
   @Override
-  public void addSortedSetField(FieldInfo field, Iterable<BytesRef> values, final Iterable<Number> docToOrdCount, final Iterable<Number> ords) throws IOException {
+  public void addSortedSetField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
+    Iterable<BytesRef> values = LegacyDocValuesIterables.valuesIterable(valuesProducer.getSortedSet(field));
+    Iterable<Number> docToOrdCount = LegacyDocValuesIterables.sortedSetOrdCountIterable(valuesProducer, field, maxDoc);
+    Iterable<Number> ords = LegacyDocValuesIterables.sortedSetOrdsIterable(valuesProducer, field);
     meta.writeVInt(field.number);
     
     if (isSingleValued(docToOrdCount)) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesProducer.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesProducer.java b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesProducer.java
index 46cf3e5..bff8c2d 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesProducer.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/memory/MemoryDocValuesProducer.java
@@ -28,19 +28,8 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.lucene.codecs.CodecUtil;
 import org.apache.lucene.codecs.DocValuesProducer;
-import org.apache.lucene.index.BinaryDocValues;
-import org.apache.lucene.index.CorruptIndexException;
-import org.apache.lucene.index.DocValues;
-import org.apache.lucene.index.PostingsEnum;
-import org.apache.lucene.index.FieldInfo;
-import org.apache.lucene.index.FieldInfos;
-import org.apache.lucene.index.IndexFileNames;
-import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.index.SegmentReadState;
+import org.apache.lucene.index.*;
 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.store.ByteArrayDataInput;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.IndexInput;
@@ -56,11 +45,11 @@ import org.apache.lucene.util.IntsRefBuilder;
 import org.apache.lucene.util.LongValues;
 import org.apache.lucene.util.PagedBytes;
 import org.apache.lucene.util.RamUsageEstimator;
-import org.apache.lucene.util.fst.BytesRefFSTEnum;
 import org.apache.lucene.util.fst.BytesRefFSTEnum.InputOutput;
-import org.apache.lucene.util.fst.FST;
+import org.apache.lucene.util.fst.BytesRefFSTEnum;
 import org.apache.lucene.util.fst.FST.Arc;
 import org.apache.lucene.util.fst.FST.BytesReader;
+import org.apache.lucene.util.fst.FST;
 import org.apache.lucene.util.fst.PositiveIntOutputs;
 import org.apache.lucene.util.fst.Util;
 import org.apache.lucene.util.packed.BlockPackedReader;
@@ -80,7 +69,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
   private final IndexInput data;
   
   // ram instances we have already loaded
-  private final Map<String,NumericDocValues> numericInstances = new HashMap<>();
+  private final Map<String,LegacyNumericDocValues> numericInstances = new HashMap<>();
   private final Map<String,BytesAndAddresses> pagedBytesInstances = new HashMap<>();
   private final Map<String,FST<Long>> fstInstances = new HashMap<>();
   private final Map<String,FixedBitSet> docsWithFieldInstances = new HashMap<>();
@@ -280,7 +269,19 @@ class MemoryDocValuesProducer extends DocValuesProducer {
 
   @Override
   public synchronized NumericDocValues getNumeric(FieldInfo field) throws IOException {
-    NumericDocValues instance = numericInstances.get(field.name);
+    LegacyNumericDocValues instance = numericInstances.get(field.name);
+    if (instance == null) {
+      instance = loadNumeric(field);
+      if (!merging) {
+        numericInstances.put(field.name, instance);
+      }
+    }
+    NumericEntry ne = numerics.get(field.name);
+    return new LegacyNumericDocValuesWrapper(getMissingBits(field, ne.missingOffset, ne.missingBytes), instance);
+  }
+
+  private synchronized LegacyNumericDocValues getNumericNonIterator(FieldInfo field) throws IOException {
+    LegacyNumericDocValues instance = numericInstances.get(field.name);
     if (instance == null) {
       instance = loadNumeric(field);
       if (!merging) {
@@ -321,7 +322,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
     return getClass().getSimpleName() + "(entries=" + numEntries + ")";
   }
 
-  private NumericDocValues loadNumeric(FieldInfo field) throws IOException {
+  private LegacyNumericDocValues loadNumeric(FieldInfo field) throws IOException {
     NumericEntry entry = numerics.get(field.name);
     IndexInput data = this.data.clone();
     data.seek(entry.offset + entry.missingBytes);
@@ -342,7 +343,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
           ramBytesUsed.addAndGet(RamUsageEstimator.sizeOf(decode) + ordsReader.ramBytesUsed());
           numericInfo.put(field.name, Accountables.namedAccountable("table compressed", ordsReader));
         }
-        return new NumericDocValues() {
+        return new LegacyNumericDocValues() {
           @Override
           public long get(int docID) {
             return decode[(int)ordsReader.get(docID)];
@@ -357,7 +358,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
           ramBytesUsed.addAndGet(deltaReader.ramBytesUsed());
           numericInfo.put(field.name, Accountables.namedAccountable("delta compressed", deltaReader));
         }
-        return new NumericDocValues() {
+        return new LegacyNumericDocValues() {
           @Override
           public long get(int docID) {
             return minDelta + deltaReader.get(docID);
@@ -381,7 +382,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
           ramBytesUsed.addAndGet(quotientReader.ramBytesUsed());
           numericInfo.put(field.name, Accountables.namedAccountable("gcd compressed", quotientReader));
         }
-        return new NumericDocValues() {
+        return new LegacyNumericDocValues() {
           @Override
           public long get(int docID) {
             return min + mult * quotientReader.get(docID);
@@ -392,8 +393,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
     }
   }
 
-  @Override
-  public BinaryDocValues getBinary(FieldInfo field) throws IOException {
+  private LegacyBinaryDocValues getLegacyBinary(FieldInfo field) throws IOException {
     BinaryEntry entry = binaries.get(field.name);
 
     BytesAndAddresses instance;
@@ -412,7 +412,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
     if (addresses == null) {
       assert entry.minLength == entry.maxLength;
       final int fixedLength = entry.minLength;
-      return new BinaryDocValues() {
+      return new LegacyBinaryDocValues() {
         final BytesRef term = new BytesRef();
 
         @Override
@@ -422,7 +422,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
         }
       };
     } else {
-      return new BinaryDocValues() {
+      return new LegacyBinaryDocValues() {
         final BytesRef term = new BytesRef();
 
         @Override
@@ -436,6 +436,12 @@ class MemoryDocValuesProducer extends DocValuesProducer {
     }
   }
   
+  @Override
+  public synchronized BinaryDocValues getBinary(FieldInfo field) throws IOException {
+    BinaryEntry be = binaries.get(field.name);
+    return new LegacyBinaryDocValuesWrapper(getMissingBits(field, be.missingOffset, be.missingBytes), getLegacyBinary(field));
+  }
+
   private BytesAndAddresses loadBinary(FieldInfo field) throws IOException {
     BytesAndAddresses bytesAndAddresses = new BytesAndAddresses();
     BinaryEntry entry = binaries.get(field.name);
@@ -459,9 +465,13 @@ class MemoryDocValuesProducer extends DocValuesProducer {
   
   @Override
   public SortedDocValues getSorted(FieldInfo field) throws IOException {
+    return new LegacySortedDocValuesWrapper(getSortedNonIterator(field), maxDoc);
+  }
+  
+  private LegacySortedDocValues getSortedNonIterator(FieldInfo field) throws IOException {
     final FSTEntry entry = fsts.get(field.name);
     if (entry.numOrds == 0) {
-      return DocValues.emptySorted();
+      return DocValues.emptyLegacySorted();
     }
     FST<Long> instance;
     synchronized(this) {
@@ -476,7 +486,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
         }
       }
     }
-    final NumericDocValues docToOrd = getNumeric(field);
+    final LegacyNumericDocValues docToOrd = getNumericNonIterator(field);
     final FST<Long> fst = instance;
     
     // per-thread resources
@@ -486,7 +496,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
     final IntsRefBuilder scratchInts = new IntsRefBuilder();
     final BytesRefFSTEnum<Long> fstEnum = new BytesRefFSTEnum<>(fst);
     
-    return new SortedDocValues() {
+    return new LegacySortedDocValues() {
       final BytesRefBuilder term = new BytesRefBuilder();
 
       @Override
@@ -538,12 +548,12 @@ class MemoryDocValuesProducer extends DocValuesProducer {
   public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOException {
     SortedNumericEntry entry = sortedNumerics.get(field.name);
     if (entry.singleton) {
-      NumericDocValues values = getNumeric(field);
+      LegacyNumericDocValues values = getNumericNonIterator(field);
       NumericEntry ne = numerics.get(field.name);
       Bits docsWithField = getMissingBits(field, ne.missingOffset, ne.missingBytes);
-      return DocValues.singleton(values, docsWithField);
+      return DocValues.singleton(new LegacyNumericDocValuesWrapper(docsWithField, values));
     } else {
-      final NumericDocValues values = getNumeric(field);
+      final LegacyNumericDocValues values = getNumericNonIterator(field);
       final MonotonicBlockPackedReader addr;
       synchronized (this) {
         MonotonicBlockPackedReader res = addresses.get(field.name);
@@ -561,7 +571,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
       if (values instanceof LongValues) {
         // probably not the greatest codec choice for this situation, but we support it
         final LongValues longValues = (LongValues) values;
-        return new SortedNumericDocValues() {
+        return new LegacySortedNumericDocValuesWrapper(new LegacySortedNumericDocValues() {
           long startOffset;
           long endOffset;
           
@@ -580,9 +590,9 @@ class MemoryDocValuesProducer extends DocValuesProducer {
           public int count() {
             return (int) (endOffset - startOffset);
           }
-        };
+          }, maxDoc);
       } else {
-        return new SortedNumericDocValues() {
+        return new LegacySortedNumericDocValuesWrapper(new LegacySortedNumericDocValues() {
           int startOffset;
           int endOffset;
         
@@ -601,7 +611,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
           public int count() {
             return (endOffset - startOffset);
           }
-        };
+          }, maxDoc);
       }
     }
   }
@@ -630,7 +640,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
         }
       }
     }
-    final BinaryDocValues docToOrds = getBinary(field);
+    final LegacyBinaryDocValues docToOrds = getLegacyBinary(field);
     final FST<Long> fst = instance;
     
     // per-thread resources
@@ -640,7 +650,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
     final IntsRefBuilder scratchInts = new IntsRefBuilder();
     final BytesRefFSTEnum<Long> fstEnum = new BytesRefFSTEnum<>(fst);
     final ByteArrayDataInput input = new ByteArrayDataInput();
-    return new SortedSetDocValues() {
+    return new LegacySortedSetDocValuesWrapper(new LegacySortedSetDocValues() {
       final BytesRefBuilder term = new BytesRefBuilder();
       BytesRef ref;
       long currentOrd;
@@ -699,7 +709,7 @@ class MemoryDocValuesProducer extends DocValuesProducer {
       public TermsEnum termsEnum() {
         return new FSTTermsEnum(fst);
       }
-    };
+      }, maxDoc);
   }
   
   private Bits getMissingBits(FieldInfo field, final long offset, final long length) throws IOException {
@@ -729,26 +739,6 @@ class MemoryDocValuesProducer extends DocValuesProducer {
   }
   
   @Override
-  public Bits getDocsWithField(FieldInfo field) throws IOException {
-    switch(field.getDocValuesType()) {
-      case SORTED_SET:
-        return DocValues.docsWithValue(getSortedSet(field), maxDoc);
-      case SORTED_NUMERIC:
-        return DocValues.docsWithValue(getSortedNumeric(field), maxDoc);
-      case SORTED:
-        return DocValues.docsWithValue(getSorted(field), maxDoc);
-      case BINARY:
-        BinaryEntry be = binaries.get(field.name);
-        return getMissingBits(field, be.missingOffset, be.missingBytes);
-      case NUMERIC:
-        NumericEntry ne = numerics.get(field.name);
-        return getMissingBits(field, ne.missingOffset, ne.missingBytes);
-      default: 
-        throw new AssertionError();
-    }
-  }
-
-  @Override
   public void close() throws IOException {
     data.close();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/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 8b97128..c0b88cc 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
@@ -29,17 +29,8 @@ import java.util.Locale;
 import java.util.Map;
 
 import org.apache.lucene.codecs.DocValuesProducer;
-import org.apache.lucene.index.BinaryDocValues;
-import org.apache.lucene.index.CorruptIndexException;
-import org.apache.lucene.index.DocValues;
-import org.apache.lucene.index.DocValuesType;
-import org.apache.lucene.index.FieldInfo;
-import org.apache.lucene.index.IndexFileNames;
+import org.apache.lucene.index.*;
 import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.index.SegmentReadState;
-import org.apache.lucene.index.SortedDocValues;
-import org.apache.lucene.index.SortedNumericDocValues;
-import org.apache.lucene.index.SortedSetDocValues;
 import org.apache.lucene.store.BufferedChecksumIndexInput;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.IndexInput;
@@ -148,6 +139,15 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
 
   @Override
   public NumericDocValues getNumeric(FieldInfo fieldInfo) throws IOException {
+    LegacyNumericDocValues values = getNumericNonIterator(fieldInfo);
+    if (values == null) {
+      return null;
+    } else {
+      return new LegacyNumericDocValuesWrapper(getNumericDocsWithField(fieldInfo), values);
+    }
+  }
+  
+  LegacyNumericDocValues getNumericNonIterator(FieldInfo fieldInfo) throws IOException {
     final OneField field = fields.get(fieldInfo.name);
     assert field != null;
 
@@ -161,7 +161,7 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
 
     decoder.setParseBigDecimal(true);
 
-    return new NumericDocValues() {
+    return new LegacyNumericDocValues() {
       @Override
       public long get(int docID) {
         try {
@@ -211,8 +211,7 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     };
   }
 
-  @Override
-  public BinaryDocValues getBinary(FieldInfo fieldInfo) throws IOException {
+  private LegacyBinaryDocValues getLegacyBinary(FieldInfo fieldInfo) throws IOException {
     final OneField field = fields.get(fieldInfo.name);
 
     // SegmentCoreReaders already verifies this field is
@@ -223,7 +222,7 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     final BytesRefBuilder scratch = new BytesRefBuilder();
     final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
 
-    return new BinaryDocValues() {
+    return new LegacyBinaryDocValues() {
       final BytesRefBuilder term = new BytesRefBuilder();
 
       @Override
@@ -252,6 +251,11 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     };
   }
   
+  @Override
+  public synchronized BinaryDocValues getBinary(FieldInfo field) throws IOException {
+    return new LegacyBinaryDocValuesWrapper(getBinaryDocsWithField(field), getLegacyBinary(field));
+  }
+
   private Bits getBinaryDocsWithField(FieldInfo fieldInfo) throws IOException {
     final OneField field = fields.get(fieldInfo.name);
     final IndexInput in = data.clone();
@@ -302,7 +306,7 @@ 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 SortedDocValues() {
+    return new LegacySortedDocValuesWrapper(new LegacySortedDocValues() {
       final BytesRefBuilder term = new BytesRefBuilder();
 
       @Override
@@ -351,13 +355,13 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
       public int getValueCount() {
         return (int)field.numValues;
       }
-    };
+    }, maxDoc);
   }
   
   @Override
   public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOException {
-    final BinaryDocValues binary = getBinary(field);
-    return new SortedNumericDocValues() {
+    final LegacyBinaryDocValues binary = getLegacyBinary(field);
+    return new LegacySortedNumericDocValuesWrapper(new LegacySortedNumericDocValues() {
       long values[];
 
       @Override
@@ -383,7 +387,7 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
       public int count() {
         return values.length;
       }
-    };
+      }, maxDoc);
   }
 
   @Override
@@ -398,7 +402,7 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
     final BytesRefBuilder scratch = new BytesRefBuilder();
     final DecimalFormat decoder = new DecimalFormat(field.pattern, new DecimalFormatSymbols(Locale.ROOT));
     
-    return new SortedSetDocValues() {
+    return new LegacySortedSetDocValuesWrapper(new LegacySortedSetDocValues() {
       String[] currentOrds = new String[0];
       int currentIndex = 0;
       final BytesRefBuilder term = new BytesRefBuilder();
@@ -460,28 +464,10 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
       public long getValueCount() {
         return field.numValues;
       }
-    };
+      }, maxDoc);
   }
   
   @Override
-  public Bits getDocsWithField(FieldInfo field) throws IOException {
-    switch (field.getDocValuesType()) {
-      case SORTED_SET:
-        return DocValues.docsWithValue(getSortedSet(field), maxDoc);
-      case SORTED_NUMERIC:
-        return DocValues.docsWithValue(getSortedNumeric(field), maxDoc);
-      case SORTED:
-        return DocValues.docsWithValue(getSorted(field), maxDoc);
-      case BINARY:
-        return getBinaryDocsWithField(field);
-      case NUMERIC:
-        return getNumericDocsWithField(field);
-      default:
-        throw new AssertionError();
-    }
-  }
-
-  @Override
   public void close() throws IOException {
     data.close();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/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 0d28479..379942e 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
@@ -27,10 +27,12 @@ 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.DocValuesType;
 import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.SegmentWriteState;
-import org.apache.lucene.index.DocValuesType;
 import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRefBuilder;
@@ -69,7 +71,12 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
   }
 
   @Override
-  public void addNumericField(FieldInfo field, Iterable<Number> values) throws IOException {
+  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);
@@ -133,10 +140,10 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
   }
 
   @Override
-  public void addBinaryField(FieldInfo field, Iterable<BytesRef> values) throws IOException {
+  public void addBinaryField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException {
     assert fieldSeen(field.name);
     assert field.getDocValuesType() == DocValuesType.BINARY;
-    doAddBinary(field, values);
+    doAddBinary(field, LegacyDocValuesIterables.binaryIterable(field, valuesProducer, numDocs));
   }
     
   private void doAddBinary(FieldInfo field, Iterable<BytesRef> values) throws IOException {
@@ -195,7 +202,10 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
   }
   
   @Override
-  public void addSortedField(FieldInfo field, Iterable<BytesRef> values, Iterable<Number> docToOrd) throws IOException {
+  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);
@@ -272,7 +282,11 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
   }
 
   @Override
-  public void addSortedNumericField(FieldInfo field, final Iterable<Number> docToValueCount, final Iterable<Number> values) throws IOException {
+  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>() {     
@@ -314,7 +328,10 @@ class SimpleTextDocValuesWriter extends DocValuesConsumer {
   }
 
   @Override
-  public void addSortedSetField(FieldInfo field, Iterable<BytesRef> values, Iterable<Number> docToOrdCount, Iterable<Number> ords) throws IOException {
+  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);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f7aa200d/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 53e9b87..faa50b7 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,14 +20,17 @@ 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.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;
 import org.apache.lucene.util.Accountable;
+import org.apache.lucene.util.Bits;
 
 /**
  * plain-text norms format.
@@ -67,7 +70,7 @@ public class SimpleTextNormsFormat extends NormsFormat {
     
     @Override
     public NumericDocValues getNorms(FieldInfo field) throws IOException {
-      return impl.getNumeric(field);
+      return new LegacyNumericDocValuesWrapper(new Bits.MatchAllBits(impl.maxDoc), impl.getNumericNonIterator(field));
     }
     
     @Override
@@ -113,8 +116,8 @@ public class SimpleTextNormsFormat extends NormsFormat {
     }
     
     @Override
-    public void addNormsField(FieldInfo field, Iterable<Number> values) throws IOException {
-      impl.addNumericField(field, values);
+    public void addNormsField(FieldInfo field, NormsProducer normsProducer) throws IOException {
+      impl.addNumericField(field, LegacyDocValuesIterables.normsIterable(field, normsProducer, impl.numDocs));
     }
 
     @Override