You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2024/01/11 13:44:16 UTC
(lucene) branch main updated: Copy collected acc(maxFreqs) into empty acc, rather than merge them. (#12846)
This is an automated email from the ASF dual-hosted git repository.
jpountz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git
The following commit(s) were added to refs/heads/main by this push:
new 4b1180372e1 Copy collected acc(maxFreqs) into empty acc, rather than merge them. (#12846)
4b1180372e1 is described below
commit 4b1180372e1c9278039a6f62fb5c5bcc7b35cf75
Author: zhouhui <vs...@163.com>
AuthorDate: Thu Jan 11 21:44:11 2024 +0800
Copy collected acc(maxFreqs) into empty acc, rather than merge them. (#12846)
---
.../codecs/CompetitiveImpactAccumulator.java | 12 ++++
.../lucene/codecs/lucene99/Lucene99SkipWriter.java | 2 +-
.../codecs/TestCompetitiveFreqNormAccumulator.java | 65 ++++++++++++++++++++++
3 files changed, 78 insertions(+), 1 deletion(-)
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<Impact> getCompetitiveFreqNormPairs() {
List<Impact> 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();