From 9e353584f93a1be86131cee5511f72fcc5055f90 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Thu, 7 Jul 2011 12:33:47 +0000 Subject: [PATCH] separated docvalues merging from terms merging git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1143795 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/lucene/index/SegmentMerger.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/lucene/src/java/org/apache/lucene/index/SegmentMerger.java b/lucene/src/java/org/apache/lucene/index/SegmentMerger.java index 30e02f11db4..f6f411e5ce3 100644 --- a/lucene/src/java/org/apache/lucene/index/SegmentMerger.java +++ b/lucene/src/java/org/apache/lucene/index/SegmentMerger.java @@ -115,6 +115,7 @@ final class SegmentMerger { mergedDocs = mergeFields(); mergeTerms(); + mergePerDoc(); mergeNorms(); if (fieldInfos.hasVectors()) @@ -481,18 +482,11 @@ final class SegmentMerger { // the new segment: int docBase = 0; - + final List fields = new ArrayList(); - final List slices = new ArrayList(); final List bits = new ArrayList(); final List bitsStarts = new ArrayList(); - - // TODO: move this into its own method - this merges currently only docvalues - final List perDocProducers = new ArrayList(); - final List perDocSlices = new ArrayList(); - final List perDocBits = new ArrayList(); - final List perDocBitsStarts = new ArrayList(); for(IndexReader r : readers) { final Fields f = r.fields(); @@ -503,18 +497,10 @@ final class SegmentMerger { bits.add(r.getLiveDocs()); bitsStarts.add(docBase); } - final PerDocValues producer = r.perDocValues(); - if (producer != null) { - perDocSlices.add(new ReaderUtil.Slice(docBase, maxDoc, fields.size())); - perDocProducers.add(producer); - perDocBits.add(r.getLiveDocs()); - perDocBitsStarts.add(docBase); - } docBase += maxDoc; } bitsStarts.add(docBase); - perDocBitsStarts.add(docBase); // we may gather more readers than mergeState.readerCount mergeState = new MergeState(); @@ -580,6 +566,26 @@ final class SegmentMerger { } finally { consumer.close(); } + } + + private void mergePerDoc() throws IOException { + final List perDocProducers = new ArrayList(); + final List perDocSlices = new ArrayList(); + final List perDocBits = new ArrayList(); + final List perDocBitsStarts = new ArrayList(); + int docBase = 0; + for(IndexReader r : readers) { + final int maxDoc = r.maxDoc(); + final PerDocValues producer = r.perDocValues(); + if (producer != null) { + perDocSlices.add(new ReaderUtil.Slice(docBase, maxDoc, perDocProducers.size())); + perDocProducers.add(producer); + perDocBits.add(r.getLiveDocs()); + perDocBitsStarts.add(docBase); + } + docBase += maxDoc; + } + perDocBitsStarts.add(docBase); if (!perDocSlices.isEmpty()) { mergeState.multiLiveDocs = new MultiBits(perDocBits, perDocBitsStarts, true); final PerDocConsumer docsConsumer = codec