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();