diff --git a/lucene/core/src/java/org/apache/lucene/codecs/CompetitiveImpactAccumulator.java b/lucene/core/src/java/org/apache/lucene/codecs/CompetitiveImpactAccumulator.java index 1209a8a2fa2..37b9fc8bd20 100644 --- a/lucene/core/src/java/org/apache/lucene/codecs/CompetitiveImpactAccumulator.java +++ b/lucene/core/src/java/org/apache/lucene/codecs/CompetitiveImpactAccumulator.java @@ -93,6 +93,18 @@ public final class CompetitiveImpactAccumulator { assert assertConsistent(); } + /** Replace the content of this {@code acc} with the provided {@code acc}. */ + public void copy(CompetitiveImpactAccumulator acc) { + int[] maxFreqs = this.maxFreqs; + int[] otherMaxFreqs = acc.maxFreqs; + + System.arraycopy(otherMaxFreqs, 0, maxFreqs, 0, maxFreqs.length); + otherFreqNormPairs.clear(); + otherFreqNormPairs.addAll(acc.otherFreqNormPairs); + + assert assertConsistent(); + } + /** Get the set of competitive freq and norm pairs, ordered by increasing freq and norm. */ public Collection getCompetitiveFreqNormPairs() { List impacts = new ArrayList<>(); diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99SkipWriter.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99SkipWriter.java index ec50e5e5c16..93efda8b0da 100644 --- a/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99SkipWriter.java +++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99SkipWriter.java @@ -166,7 +166,7 @@ public final class Lucene99SkipWriter extends MultiLevelSkipListWriter { this.curPayPointer = payFP; this.curPosBufferUpto = posBufferUpto; this.curPayloadByteUpto = payloadByteUpto; - this.curCompetitiveFreqNorms[0].addAll(competitiveFreqNorms); + this.curCompetitiveFreqNorms[0].copy(competitiveFreqNorms); bufferSkip(numDocs); } diff --git a/lucene/core/src/test/org/apache/lucene/codecs/TestCompetitiveFreqNormAccumulator.java b/lucene/core/src/test/org/apache/lucene/codecs/TestCompetitiveFreqNormAccumulator.java index 6a7e165cedd..2f3fa20124c 100644 --- a/lucene/core/src/test/org/apache/lucene/codecs/TestCompetitiveFreqNormAccumulator.java +++ b/lucene/core/src/test/org/apache/lucene/codecs/TestCompetitiveFreqNormAccumulator.java @@ -83,6 +83,71 @@ public class TestCompetitiveFreqNormAccumulator extends LuceneTestCase { assertEquals(List.copyOf(expected), List.copyOf(acc.getCompetitiveFreqNormPairs())); } + public void testCopy() { + CompetitiveImpactAccumulator acc = new CompetitiveImpactAccumulator(); + CompetitiveImpactAccumulator copiedAcc = new CompetitiveImpactAccumulator(); + CompetitiveImpactAccumulator mergedAcc = new CompetitiveImpactAccumulator(); + + acc.add(3, 5); + copiedAcc.copy(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(acc.getCompetitiveFreqNormPairs())); + + mergedAcc.addAll(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(mergedAcc.getCompetitiveFreqNormPairs())); + + acc.add(10, 10000); + copiedAcc.copy(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(acc.getCompetitiveFreqNormPairs())); + + mergedAcc.clear(); + mergedAcc.addAll(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(mergedAcc.getCompetitiveFreqNormPairs())); + + acc.add(5, 200); + copiedAcc.copy(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(acc.getCompetitiveFreqNormPairs())); + + mergedAcc.clear(); + mergedAcc.addAll(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(mergedAcc.getCompetitiveFreqNormPairs())); + + acc.add(20, -100); + copiedAcc.copy(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(acc.getCompetitiveFreqNormPairs())); + + mergedAcc.clear(); + mergedAcc.addAll(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(mergedAcc.getCompetitiveFreqNormPairs())); + + acc.add(30, -3); + copiedAcc.copy(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(acc.getCompetitiveFreqNormPairs())); + + mergedAcc.clear(); + mergedAcc.addAll(acc); + assertEquals( + List.copyOf(copiedAcc.getCompetitiveFreqNormPairs()), + List.copyOf(mergedAcc.getCompetitiveFreqNormPairs())); + } + public void testOmitFreqs() { CompetitiveImpactAccumulator acc = new CompetitiveImpactAccumulator();