You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ji...@apache.org on 2017/12/07 13:21:14 UTC
lucene-solr:branch_7_2: LUCENE-8082: Fix NPE in TopFieldCollectors
that don't track total hit count
Repository: lucene-solr
Updated Branches:
refs/heads/branch_7_2 034daf424 -> bb789f06a
LUCENE-8082: Fix NPE in TopFieldCollectors that don't track total hit count
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/bb789f06
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/bb789f06
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/bb789f06
Branch: refs/heads/branch_7_2
Commit: bb789f06ae8344c4c0744fcc6737b14258070c9e
Parents: 034daf4
Author: Jim Ferenczi <ji...@apache.org>
Authored: Thu Dec 7 14:08:46 2017 +0100
Committer: Jim Ferenczi <ji...@apache.org>
Committed: Thu Dec 7 14:21:03 2017 +0100
----------------------------------------------------------------------
.../apache/lucene/search/TopFieldCollector.java | 12 +++++++---
.../lucene/search/TestTopFieldCollector.java | 25 ++++++++++++++++++++
2 files changed, 34 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bb789f06/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
index 0c5b38f..066c2c3 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
@@ -121,9 +121,11 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
final LeafFieldComparator[] comparators = queue.getComparators(context);
final int[] reverseMul = queue.getReverseMul();
+ final Sort indexSort = context.reader().getMetaData().getSort();
final boolean canEarlyTerminate = trackTotalHits == false &&
trackMaxScore == false &&
- canEarlyTerminate(sort, context.reader().getMetaData().getSort());
+ indexSort != null &&
+ canEarlyTerminate(sort, indexSort);
final int initialTotalHits = totalHits;
return new MultiComparatorLeafCollector(comparators, reverseMul, mayNeedScoresTwice) {
@@ -212,7 +214,9 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
this.trackTotalHits = trackTotalHits;
// Must set maxScore to NEG_INF, or otherwise Math.max always returns NaN.
- maxScore = Float.NEGATIVE_INFINITY;
+ if (trackMaxScore) {
+ maxScore = Float.NEGATIVE_INFINITY;
+ }
FieldComparator<?>[] comparators = queue.comparators;
// Tell all comparators their top value:
@@ -227,9 +231,11 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
docBase = context.docBase;
final int afterDoc = after.doc - docBase;
+ final Sort indexSort = context.reader().getMetaData().getSort();
final boolean canEarlyTerminate = trackTotalHits == false &&
trackMaxScore == false &&
- canEarlyTerminate(sort, context.reader().getMetaData().getSort());
+ indexSort != null &&
+ canEarlyTerminate(sort, indexSort);
final int initialTotalHits = totalHits;
return new MultiComparatorLeafCollector(queue.getComparators(context), queue.getReverseMul(), mayNeedScoresTwice) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bb789f06/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
index d9be584..be8ab46 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
@@ -102,6 +102,31 @@ public class TestTopFieldCollector extends LuceneTestCase {
assertTrue(Float.isNaN(td.getMaxScore()));
}
}
+
+ public void testSortWithoutTotalHitTracking() throws Exception {
+ Sort sort = new Sort(SortField.FIELD_DOC);
+ for(int i = 0; i < 2; i++) {
+ Query q = new MatchAllDocsQuery();
+ // check that setting trackTotalHits to false does not throw an NPE because
+ // the index is not sorted
+ TopDocsCollector<Entry> tdc;
+ if (i % 2 == 0) {
+ tdc = TopFieldCollector.create(sort, 10, true, false, false, false);
+ } else {
+ FieldDoc fieldDoc = new FieldDoc(1, Float.NaN, new Object[] { 1 });
+ tdc = TopFieldCollector.create(sort, 10, fieldDoc, true, false, false, false);
+ }
+
+ is.search(q, tdc);
+
+ TopDocs td = tdc.topDocs();
+ ScoreDoc[] sd = td.scoreDocs;
+ for(int j = 0; j < sd.length; j++) {
+ assertTrue(Float.isNaN(sd[j].score));
+ }
+ assertTrue(Float.isNaN(td.getMaxScore()));
+ }
+ }
public void testSortWithScoreNoMaxScoreTracking() throws Exception {