|
21 | 21 | import org.apache.lucene.index.LiveIndexWriterConfig; |
22 | 22 | import org.apache.lucene.index.MergePolicy; |
23 | 23 | import org.apache.lucene.index.MergeScheduler; |
| 24 | +import org.apache.lucene.index.MergeTrigger; |
24 | 25 | import org.apache.lucene.index.SegmentCommitInfo; |
25 | 26 | import org.apache.lucene.index.SegmentInfos; |
26 | 27 | import org.apache.lucene.index.SoftDeletesRetentionMergePolicy; |
@@ -2549,27 +2550,30 @@ public boolean forceMergeIsNoOp(int maxNumSegments, boolean onlyExpungeDeletes) |
2549 | 2550 | if (onlyExpungeDeletes && maxNumSegments >= 0) { |
2550 | 2551 | throw new IllegalArgumentException("only_expunge_deletes and max_num_segments are mutually exclusive"); |
2551 | 2552 | } |
2552 | | - // TODO: is there a way for us to determine no-op with no max num segments? |
2553 | | - if (maxNumSegments <= 0) { |
2554 | | - return false; |
2555 | | - } |
2556 | 2553 | try (var reader = DirectoryReader.open(indexWriter)) { |
2557 | 2554 | final var segmentCommitInfos = SegmentInfos.readCommit(reader.directory(), reader.getIndexCommit().getSegmentsFileName()); |
2558 | | - final var segmentsToMerge = new HashMap<SegmentCommitInfo, Boolean>(); |
2559 | | - for (int i = 0; i < segmentCommitInfos.size(); i++) { |
2560 | | - final var segmentInfo = segmentCommitInfos.info(i); |
2561 | | - if (onlyExpungeDeletes && segmentInfo.hasDeletions()) { |
2562 | | - return false; |
| 2555 | + final MergePolicy.MergeSpecification mergeSpecification; |
| 2556 | + if (maxNumSegments < 0) { |
| 2557 | + mergeSpecification = indexWriter.getConfig() |
| 2558 | + .getMergePolicy() |
| 2559 | + .findMerges(MergeTrigger.EXPLICIT, segmentCommitInfos, indexWriter); |
| 2560 | + } else { |
| 2561 | + final var segmentsToMerge = new HashMap<SegmentCommitInfo, Boolean>(); |
| 2562 | + for (int i = 0; i < segmentCommitInfos.size(); i++) { |
| 2563 | + final var segmentInfo = segmentCommitInfos.info(i); |
| 2564 | + if (onlyExpungeDeletes && segmentInfo.hasDeletions()) { |
| 2565 | + return false; |
| 2566 | + } |
| 2567 | + segmentsToMerge.put(segmentInfo, Boolean.TRUE); |
2563 | 2568 | } |
2564 | | - segmentsToMerge.put(segmentInfo, Boolean.TRUE); |
2565 | | - } |
2566 | 2569 |
|
2567 | | - if (onlyExpungeDeletes) { |
2568 | | - return true; |
| 2570 | + if (onlyExpungeDeletes) { |
| 2571 | + return true; |
| 2572 | + } |
| 2573 | + mergeSpecification = indexWriter.getConfig() |
| 2574 | + .getMergePolicy() |
| 2575 | + .findForcedMerges(segmentCommitInfos, maxNumSegments, segmentsToMerge, indexWriter); |
2569 | 2576 | } |
2570 | | - final var mergeSpecification = indexWriter.getConfig() |
2571 | | - .getMergePolicy() |
2572 | | - .findForcedMerges(segmentCommitInfos, maxNumSegments, segmentsToMerge, indexWriter); |
2573 | 2577 | return mergeSpecification == null || mergeSpecification.merges.isEmpty(); |
2574 | 2578 | } |
2575 | 2579 | } |
|
0 commit comments