separated docvalues merging from terms merging

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1143795 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Simon Willnauer 2011-07-07 12:33:47 +00:00
parent fc0ecb9bb1
commit 9e353584f9
1 changed files with 22 additions and 16 deletions

View File

@ -115,6 +115,7 @@ final class SegmentMerger {
mergedDocs = mergeFields(); mergedDocs = mergeFields();
mergeTerms(); mergeTerms();
mergePerDoc();
mergeNorms(); mergeNorms();
if (fieldInfos.hasVectors()) if (fieldInfos.hasVectors())
@ -481,18 +482,11 @@ final class SegmentMerger {
// the new segment: // the new segment:
int docBase = 0; int docBase = 0;
final List<Fields> fields = new ArrayList<Fields>(); final List<Fields> fields = new ArrayList<Fields>();
final List<ReaderUtil.Slice> slices = new ArrayList<ReaderUtil.Slice>(); final List<ReaderUtil.Slice> slices = new ArrayList<ReaderUtil.Slice>();
final List<Bits> bits = new ArrayList<Bits>(); final List<Bits> bits = new ArrayList<Bits>();
final List<Integer> bitsStarts = new ArrayList<Integer>(); final List<Integer> bitsStarts = new ArrayList<Integer>();
// TODO: move this into its own method - this merges currently only docvalues
final List<PerDocValues> perDocProducers = new ArrayList<PerDocValues>();
final List<ReaderUtil.Slice> perDocSlices = new ArrayList<ReaderUtil.Slice>();
final List<Bits> perDocBits = new ArrayList<Bits>();
final List<Integer> perDocBitsStarts = new ArrayList<Integer>();
for(IndexReader r : readers) { for(IndexReader r : readers) {
final Fields f = r.fields(); final Fields f = r.fields();
@ -503,18 +497,10 @@ final class SegmentMerger {
bits.add(r.getLiveDocs()); bits.add(r.getLiveDocs());
bitsStarts.add(docBase); 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; docBase += maxDoc;
} }
bitsStarts.add(docBase); bitsStarts.add(docBase);
perDocBitsStarts.add(docBase);
// we may gather more readers than mergeState.readerCount // we may gather more readers than mergeState.readerCount
mergeState = new MergeState(); mergeState = new MergeState();
@ -580,6 +566,26 @@ final class SegmentMerger {
} finally { } finally {
consumer.close(); consumer.close();
} }
}
private void mergePerDoc() throws IOException {
final List<PerDocValues> perDocProducers = new ArrayList<PerDocValues>();
final List<ReaderUtil.Slice> perDocSlices = new ArrayList<ReaderUtil.Slice>();
final List<Bits> perDocBits = new ArrayList<Bits>();
final List<Integer> perDocBitsStarts = new ArrayList<Integer>();
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()) { if (!perDocSlices.isEmpty()) {
mergeState.multiLiveDocs = new MultiBits(perDocBits, perDocBitsStarts, true); mergeState.multiLiveDocs = new MultiBits(perDocBits, perDocBitsStarts, true);
final PerDocConsumer docsConsumer = codec final PerDocConsumer docsConsumer = codec