lucene-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cpoersc...@apache.org
Subject [lucene-solr] 01/02: LUCENE-8996: maxScore was sometimes missing from distributed grouped responses. (Julien Massenet, Diego Ceccarelli, Munendra S N, Christine Poerschke)
Date Mon, 09 Dec 2019 14:56:57 GMT
This is an automated email from the ASF dual-hosted git repository.

cpoerschke pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 540f617cbb7d465aff356221dba55ad631c52528
Author: Christine Poerschke <cpoerschke@apache.org>
AuthorDate: Mon Dec 9 13:09:44 2019 +0000

    LUCENE-8996: maxScore was sometimes missing from distributed grouped responses.
    (Julien Massenet, Diego Ceccarelli, Munendra S N, Christine Poerschke)
    
    Resolved Conflicts:
    	lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
---
 lucene/CHANGES.txt                                  |  3 +++
 .../apache/lucene/search/grouping/TopGroups.java    | 21 +++++++++++++++++----
 .../lucene/search/grouping/TopGroupsTest.java       | 10 +++-------
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index adb0133..4686cf7 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -76,6 +76,9 @@ Bug Fixes
 
 * LUCENE-9031: UnsupportedOperationException on MatchesIterator.getQuery() (Alan Woodward,
Mikhail Khludnev)
 
+* LUCENE-8996: maxScore was sometimes missing from distributed grouped responses.
+  (Julien Massenet, Diego Ceccarelli, Munendra S N, Christine Poerschke)
+
 Other
 
 * LUCENE-8979: Code Cleanup: Use entryset for map iteration wherever possible. - Part 2 (Koen
De Groote)
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
index 71338f9..cb84400 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
@@ -80,6 +80,19 @@ public class TopGroups<T> {
     Avg,
   }
 
+  /**
+   * If either value is NaN then return the other value, otherwise
+   * return the greater of the two values by calling Math.max.
+   * @param a - one value
+   * @param b - another value
+   * @return ignoring any NaN return the greater of a and b
+   */
+  private static float nonNANmax(float a, float b) {
+    if (Float.isNaN(a)) return b;
+    if (Float.isNaN(b)) return a;
+    return Math.max(a, b);
+  }
+
   /** Merges an array of TopGroups, for example obtained
    *  from the second-pass collector across multiple
    *  shards.  Each TopGroups must have been sorted by the
@@ -135,12 +148,12 @@ public class TopGroups<T> {
     } else {
       shardTopDocs = new TopFieldDocs[shardGroups.length];
     }
-    float totalMaxScore = Float.MIN_VALUE;
+    float totalMaxScore = Float.NaN;
 
     for(int groupIDX=0;groupIDX<numGroups;groupIDX++) {
       final T groupValue = shardGroups[0].groups[groupIDX].groupValue;
       //System.out.println("  merge groupValue=" + groupValue + " sortValues=" + Arrays.toString(shardGroups[0].groups[groupIDX].groupSortValues));
-      float maxScore = Float.MIN_VALUE;
+      float maxScore = Float.NaN;
       int totalHits = 0;
       double scoreSum = 0.0;
       for(int shardIDX=0;shardIDX<shardGroups.length;shardIDX++) {
@@ -169,7 +182,7 @@ public class TopGroups<T> {
               shardGroupDocs.scoreDocs,
               docSort.getSort());
         }
-        maxScore = Math.max(maxScore, shardGroupDocs.maxScore);
+        maxScore =  nonNANmax(maxScore, shardGroupDocs.maxScore);
         assert shardGroupDocs.totalHits.relation == Relation.EQUAL_TO;
         totalHits += shardGroupDocs.totalHits.value;
         scoreSum += shardGroupDocs.score;
@@ -223,7 +236,7 @@ public class TopGroups<T> {
                                                    mergedScoreDocs,
                                                    groupValue,
                                                    shardGroups[0].groups[groupIDX].groupSortValues);
-      totalMaxScore = Math.max(totalMaxScore, maxScore);
+      totalMaxScore = nonNANmax(totalMaxScore, maxScore);
     }
 
     if (totalGroupCount != null) {
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TopGroupsTest.java
b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TopGroupsTest.java
index 8fb661d..e27fc07 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TopGroupsTest.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TopGroupsTest.java
@@ -21,16 +21,12 @@ import org.apache.lucene.search.Sort;
 import org.apache.lucene.search.TotalHits;
 import org.apache.lucene.util.LuceneTestCase;
 
-import org.junit.Ignore;
-
 public class TopGroupsTest extends LuceneTestCase {
 
-  @Ignore // https://issues.apache.org/jira/browse/LUCENE-8996
   public void testAllGroupsEmptyInSecondPass() {
     narrativeMergeTestImplementation(false, false, false, false);
   }
 
-  @Ignore // https://issues.apache.org/jira/browse/LUCENE-8996
   public void testSomeGroupsEmptyInSecondPass() {
     narrativeMergeTestImplementation(false, false, false, true);
     narrativeMergeTestImplementation(false, false, true, false);
@@ -166,13 +162,13 @@ public class TopGroupsTest extends LuceneTestCase {
     {
       assertEquals(blueGroupValue, mergedTopGroups.groups[0].groupValue);
       final float expectedBlueMaxScore =
-          (haveBlueWhale ? blueWhaleScore : (haveBlueDragonfly ? blueDragonflyScore : Float.MIN_VALUE));
+          (haveBlueWhale ? blueWhaleScore : (haveBlueDragonfly ? blueDragonflyScore : Float.NaN));
       checkMaxScore(expectedBlueMaxScore, mergedTopGroups.groups[0].maxScore);
     }
     {
       assertEquals(redGroupValue, mergedTopGroups.groups[1].groupValue);
       final float expectedRedMaxScore =
-          (haveRedSquirrel ? redSquirrelScore : (haveRedAnt ? redAntScore : Float.MIN_VALUE));
+          (haveRedSquirrel ? redSquirrelScore : (haveRedAnt ? redAntScore : Float.NaN));
       checkMaxScore(expectedRedMaxScore, mergedTopGroups.groups[1].maxScore);
     }
 
@@ -181,7 +177,7 @@ public class TopGroupsTest extends LuceneTestCase {
             : (haveRedSquirrel ? redSquirrelScore
                 : (haveBlueDragonfly ? blueDragonflyScore
                     : (haveRedAnt ? redAntScore
-                        : Float.MIN_VALUE))));
+                        : Float.NaN))));
     checkMaxScore(expectedMaxScore, mergedTopGroups.maxScore);
   }
 


Mime
View raw message