message("commitMerge " + merge.segString(directory));
// Carefully merge deletes that occurred after we
// started merging:
BitVector deletes = null;
int docUpto = 0;
final int numSegmentsToMerge = sourceSegments.size();
for(int i=0;i<numSegmentsToMerge;i++) {
final SegmentInfo previousInfo = sourceSegmentsClone.info(i);
final SegmentInfo currentInfo = sourceSegments.info(i);
assert currentInfo.docCount == previousInfo.docCount;
final int docCount = currentInfo.docCount;
if (previousInfo.hasDeletions()) {
// There were deletes on this segment when the merge
// started. The merge has collapsed away those
// deletes, but, if new deletes were flushed since
// the merge started, we must now carefully keep any
// newly flushed deletes but mapping them to the new
// docIDs.
assert currentInfo.hasDeletions();
// Load deletes present @ start of merge, for this segment:
BitVector previousDeletes = new BitVector(previousInfo.dir, previousInfo.getDelFileName());
if (!currentInfo.getDelFileName().equals(previousInfo.getDelFileName())) {
// This means this segment has had new deletes
// committed since we started the merge, so we
// must merge them:
if (deletes == null)
deletes = new BitVector(merge.info.docCount);
BitVector currentDeletes = new BitVector(currentInfo.dir, currentInfo.getDelFileName());
for(int j=0;j<docCount;j++) {
if (previousDeletes.get(j))
assert currentDeletes.get(j);
else {
if (currentDeletes.get(j))
deletes.set(docUpto);
docUpto++;
}
}
} else
docUpto += docCount - previousDeletes.count();
} else if (currentInfo.hasDeletions()) {
// This segment had no deletes before but now it
// does:
if (deletes == null)
deletes = new BitVector(merge.info.docCount);
BitVector currentDeletes = new BitVector(directory, currentInfo.getDelFileName());
for(int j=0;j<docCount;j++) {
if (currentDeletes.get(j))
deletes.set(docUpto);
docUpto++;
}
} else