Github user dweiss commented on a diff in the pull request:
https://github.com/apache/lucene-solr/pull/502#discussion_r235063127
--- Diff: lucene/core/src/java/org/apache/lucene/index/IndexWriter.java ---
@@ -4398,42 +4426,41 @@ private int mergeMiddle(MergePolicy.OneMerge merge,
MergePolicy mergePolicy) thr
// Let the merge wrap readers
List<CodecReader> mergeReaders = new ArrayList<>();
- int softDeleteCount = 0;
+ Counter softDeleteCount = Counter.newCounter(false);
for (int r = 0; r < merge.readers.size(); r++) {
SegmentReader reader = merge.readers.get(r);
CodecReader wrappedReader = merge.wrapForMerge(reader);
validateMergeReader(wrappedReader);
if (softDeletesEnabled) {
+
if (reader != wrappedReader) { // if we don't have a wrapped
reader we won't preserve any soft-deletes
Bits hardLiveDocs = merge.hardLiveDocs.get(r);
- Bits wrappedLiveDocs = wrappedReader.getLiveDocs();
- int hardDeleteCount = 0;
- DocIdSetIterator softDeletedDocs =
DocValuesFieldExistsQuery.getDocValuesDocIdSetIterator(config.getSoftDeletesField(),
wrappedReader);
- if (softDeletedDocs != null) {
- int docId;
- while ((docId = softDeletedDocs.nextDoc()) !=
DocIdSetIterator.NO_MORE_DOCS) {
- if (wrappedLiveDocs == null || wrappedLiveDocs.get(docId))
{
- if (hardLiveDocs == null || hardLiveDocs.get(docId)) {
- softDeleteCount++;
- } else {
- hardDeleteCount++;
+ if (hardLiveDocs != null) { // we only need to do this
accounting if we have mixed deletes
+ Bits wrappedLiveDocs = wrappedReader.getLiveDocs();
+ int hardDeleteCount = countSoftDeletes(wrappedReader,
wrappedLiveDocs, hardLiveDocs, softDeleteCount);
--- End diff --
hardDeleteCount var, yet countSoftDeletes() method looks odd. Maybe you
could just pass two args (two counters) instead. It's not as pretty, but at
least more intuitive?
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]