blob: e30432e0da3560b569df52a51d1f52d130dc420f [file] [log] [blame]
Index: java/org/apache/lucene/index/SegmentMerger.java
===================================================================
--- java/org/apache/lucene/index/SegmentMerger.java (revision 483428)
+++ java/org/apache/lucene/index/SegmentMerger.java (working copy)
@@ -407,6 +407,7 @@
}
private void mergeNorms() throws IOException {
+ byte[] normBuffer = null;
for (int i = 0; i < fieldInfos.size(); i++) {
FieldInfo fi = fieldInfos.fieldInfo(i);
if (fi.isIndexed && !fi.omitNorms) {
@@ -415,11 +416,21 @@
for (int j = 0; j < readers.size(); j++) {
IndexReader reader = (IndexReader) readers.elementAt(j);
int maxDoc = reader.maxDoc();
- byte[] input = new byte[maxDoc];
- reader.norms(fi.name, input, 0);
- for (int k = 0; k < maxDoc; k++) {
- if (!reader.isDeleted(k)) {
- output.writeByte(input[k]);
+ if (normBuffer == null || normBuffer.length < maxDoc) {
+ // the buffer is too small for the current segment
+ normBuffer = new byte[maxDoc];
+ }
+ reader.norms(fi.name, normBuffer, 0);
+ if (!reader.hasDeletions()) {
+ //optimized case for segments without deleted docs
+ output.writeBytes(normBuffer, maxDoc);
+ } else {
+ // this segment has deleted docs, so we have to
+ // check for every doc if it is deleted or not
+ for (int k = 0; k < maxDoc; k++) {
+ if (!reader.isDeleted(k)) {
+ output.writeByte(normBuffer[k]);
+ }
}
}
}