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 {