You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by vo...@apache.org on 2024/06/21 09:18:44 UTC

(lucene) branch main updated: Fix NPE in StringValueFacetCounts over empty match-set (#13494)

This is an automated email from the ASF dual-hosted git repository.

voditas 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 c7f4b8dee20 Fix NPE in StringValueFacetCounts over empty match-set (#13494)
c7f4b8dee20 is described below

commit c7f4b8dee20c694ccfb8f26d8884edcbff5f4210
Author: yadda yadda yadda <gr...@dfdx.me>
AuthorDate: Fri Jun 21 11:18:39 2024 +0200

    Fix NPE in StringValueFacetCounts over empty match-set (#13494)
---
 lucene/CHANGES.txt                                 |  3 ++
 .../lucene/facet/StringValueFacetCounts.java       | 12 +++++--
 .../lucene/facet/TestStringValueFacetCounts.java   | 37 ++++++++++++++++++++++
 3 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index baa53ed5d90..3053955144d 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -283,6 +283,9 @@ Bug Fixes
 * GITHUB#13463: Address bug in MultiLeafKnnCollector causing #minCompetitiveSimilarity to stay artificially low in
   some corner cases. (Greg Miller)
 
+* GITHUB#13493: StringValueFacetCunts stops throwing NPE when faceting over an empty match-set. (Grebennikov Roman,
+  Stefan Vodita)
+
 Other
 --------------------
 (No changes)
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/StringValueFacetCounts.java b/lucene/facet/src/java/org/apache/lucene/facet/StringValueFacetCounts.java
index 67ce953067f..9e63043f3fa 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/StringValueFacetCounts.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/StringValueFacetCounts.java
@@ -154,7 +154,7 @@ public class StringValueFacetCounts extends Facets {
         final BytesRef term = docValues.lookupOrd(sparseCount.key);
         labelValues.add(new LabelAndValue(term.utf8ToString(), count));
       }
-    } else {
+    } else if (denseCounts != null) {
       for (int i = 0; i < denseCounts.length; i++) {
         int count = denseCounts[i];
         if (count != 0) {
@@ -206,7 +206,7 @@ public class StringValueFacetCounts extends Facets {
           }
         }
       }
-    } else {
+    } else if (denseCounts != null) {
       for (int i = 0; i < denseCounts.length; i++) {
         int count = denseCounts[i];
         if (count != 0) {
@@ -256,7 +256,13 @@ public class StringValueFacetCounts extends Facets {
       return -1;
     }
 
-    return sparseCounts != null ? sparseCounts.get(ord) : denseCounts[ord];
+    if (sparseCounts != null) {
+      return sparseCounts.get(ord);
+    }
+    if (denseCounts != null) {
+      return denseCounts[ord];
+    }
+    return 0;
   }
 
   @Override
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/TestStringValueFacetCounts.java b/lucene/facet/src/test/org/apache/lucene/facet/TestStringValueFacetCounts.java
index 45e48c5abc7..5c9a1eea7b4 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/TestStringValueFacetCounts.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/TestStringValueFacetCounts.java
@@ -34,6 +34,7 @@ import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.MatchNoDocsQuery;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.tests.index.RandomIndexWriter;
 import org.apache.lucene.tests.util.LuceneTestCase;
@@ -80,6 +81,42 @@ public class TestStringValueFacetCounts extends FacetTestCase {
     IOUtils.close(searcher.getIndexReader(), dir);
   }
 
+  private void assertEmptyFacetResult(FacetResult result) {
+    assertEquals(0, result.path.length);
+    assertEquals(0, result.value);
+    assertEquals(0, result.childCount);
+    assertEquals(0, result.labelValues.length);
+  }
+
+  public void testEmptyMatchset() throws Exception {
+    Directory dir = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+
+    Document doc = new Document();
+    doc.add(new SortedSetDocValuesField("field", new BytesRef("foo")));
+    writer.addDocument(doc);
+
+    IndexSearcher searcher = newSearcher(writer.getReader());
+    writer.close();
+
+    FacetsCollector facetsCollector =
+        searcher.search(new MatchNoDocsQuery(), new FacetsCollectorManager());
+    StringDocValuesReaderState state =
+        new StringDocValuesReaderState(searcher.getIndexReader(), "field");
+
+    StringValueFacetCounts counts = new StringValueFacetCounts(state, facetsCollector);
+
+    FacetResult top = counts.getTopChildren(10, "field");
+    assertEmptyFacetResult(top);
+
+    FacetResult all = counts.getAllChildren("field");
+    assertEmptyFacetResult(all);
+
+    assertEquals(0, counts.getSpecificValue("field", "foo"));
+
+    IOUtils.close(searcher.getIndexReader(), dir);
+  }
+
   // See: LUCENE-10070
   public void testCountAll() throws Exception {