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:20:36 UTC
lucene-solr:branch_7x: LUCENE-8082: Fix NPE in TopFieldCollectors
that don't track total hit count
Repository: lucene-solr
Updated Branches:
refs/heads/branch_7x b4d5ea33a -> 8d1201ec9
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/8d1201ec
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/8d1201ec
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/8d1201ec
Branch: refs/heads/branch_7x
Commit: 8d1201ec957a5699bf11ef1000cf4395252d9694
Parents: b4d5ea3
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:09:39 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/8d1201ec/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/8d1201ec/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 {