You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mv...@apache.org on 2012/03/20 18:05:06 UTC

svn commit: r1303002 - in /lucene/dev/trunk: lucene/contrib/CHANGES.txt modules/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java

Author: mvg
Date: Tue Mar 20 17:05:05 2012
New Revision: 1303002

URL: http://svn.apache.org/viewvc?rev=1303002&view=rev
Log:
LUCENE-3890: Fixed NPE for grouped faceting on multi-valued fields

Modified:
    lucene/dev/trunk/lucene/contrib/CHANGES.txt
    lucene/dev/trunk/modules/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java

Modified: lucene/dev/trunk/lucene/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/contrib/CHANGES.txt?rev=1303002&r1=1303001&r2=1303002&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/contrib/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/contrib/CHANGES.txt Tue Mar 20 17:05:05 2012
@@ -105,6 +105,9 @@ Bug Fixes
  * LUCENE-3045: fixed QueryNodeImpl.containsTag(String key) that was
    not lowercasing the key before checking for the tag (Adriano Crestani)
 
+ * LUCENE-3890: Fixed NPE for grouped faceting on multi-valued fields.
+   (Michael McCandless, Martijn van Groningen)
+
 Optimizations
 
 * LUCENE-3468: Replaced last() and remove() with pollLast() in

Modified: lucene/dev/trunk/modules/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/modules/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java?rev=1303002&r1=1303001&r2=1303002&view=diff
==============================================================================
--- lucene/dev/trunk/modules/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java (original)
+++ lucene/dev/trunk/modules/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java Tue Mar 20 17:05:05 2012
@@ -187,12 +187,14 @@ public abstract class TermGroupFacetColl
 
     public void collect(int doc) throws IOException {
       int groupOrd = groupFieldTermsIndex.getOrd(doc);
-      reuse = facetFieldDocTermOrds.lookup(doc, reuse);
+      if (facetOrdTermsEnum != null) {
+        reuse = facetFieldDocTermOrds.lookup(doc, reuse);
+      }
       int chunk;
       boolean first = true;
       int[] buffer = new int[5];
       do {
-        chunk = reuse.read(buffer);
+        chunk = reuse != null ? reuse.read(buffer) : 0;
         if (first && chunk == 0) {
           chunk = 1;
           buffer[0] = facetFieldDocTermOrds.numTerms(); // this facet ord is reserved for docs not containing facet field.
@@ -246,7 +248,7 @@ public abstract class TermGroupFacetColl
 
         int facetOrd;
         if (groupedFacetHit.facetValue != null) {
-          if (!facetOrdTermsEnum.seekExact(groupedFacetHit.facetValue, true)) {
+          if (facetOrdTermsEnum == null || !facetOrdTermsEnum.seekExact(groupedFacetHit.facetValue, true)) {
             continue;
           }
           facetOrd = (int) facetOrdTermsEnum.ord();
@@ -260,7 +262,13 @@ public abstract class TermGroupFacetColl
       }
 
       if (facetPrefix != null) {
-        TermsEnum.SeekStatus seekStatus = facetOrdTermsEnum.seekCeil(facetPrefix, true);
+        TermsEnum.SeekStatus seekStatus;
+        if (facetOrdTermsEnum != null) {
+          seekStatus = facetOrdTermsEnum.seekCeil(facetPrefix, true);
+        } else {
+          seekStatus = TermsEnum.SeekStatus.END;
+        }
+
         if (seekStatus != TermsEnum.SeekStatus.END) {
           startFacetOrd = (int) facetOrdTermsEnum.ord();
         } else {
@@ -296,8 +304,10 @@ public abstract class TermGroupFacetColl
             endFacetOrd == missingCountIndex + 1 ?  missingCountIndex : endFacetOrd);
         this.tenum = tenum;
         this.mergePos = startFacetOrd;
-        tenum.seekExact(mergePos);
-        mergeTerm = tenum.term();
+        if (tenum != null) {
+          tenum.seekExact(mergePos);
+          mergeTerm = tenum.term();
+        }
       }
 
       protected void nextTerm() throws IOException {