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/08/28 13:13:43 UTC

svn commit: r1378078 - in /lucene/dev/branches/branch_4x/lucene: CHANGES.txt grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java

Author: mvg
Date: Tue Aug 28 11:13:43 2012
New Revision: 1378078

URL: http://svn.apache.org/viewvc?rev=1378078&view=rev
Log:
LUCENE-4333: Fixed NPE in TermGroupFacetCollector when faceting on mv fields.

Modified:
    lucene/dev/branches/branch_4x/lucene/CHANGES.txt
    lucene/dev/branches/branch_4x/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java
    lucene/dev/branches/branch_4x/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java

Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1378078&r1=1378077&r2=1378078&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Tue Aug 28 11:13:43 2012
@@ -113,6 +113,9 @@ Bug Fixes
 * LUCENE-4224: Add in-order scorer to query time joining and the
   out-of-order scorer throws an UOE. (Martijn van Groningen, Robert Muir)
 
+* LUCENE-4333: Fixed NPE in TermGroupFacetCollector when faceting on mv fields.
+  (Jesse MacVicar, Martijn van Groningen)
+
 Optimizations
 
 * LUCENE-4317: Improve reuse of internal TokenStreams and StringReader

Modified: lucene/dev/branches/branch_4x/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java?rev=1378078&r1=1378077&r2=1378078&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java (original)
+++ lucene/dev/branches/branch_4x/lucene/grouping/src/java/org/apache/lucene/search/grouping/term/TermGroupFacetCollector.java Tue Aug 28 11:13:43 2012
@@ -186,6 +186,10 @@ public abstract class TermGroupFacetColl
     }
 
     public void collect(int doc) throws IOException {
+      if (facetFieldDocTermOrds.isEmpty()) {
+        return;
+      }
+
       int groupOrd = groupFieldTermsIndex.getOrd(doc);
       if (facetOrdTermsEnum != null) {
         reuse = facetFieldDocTermOrds.lookup(doc, reuse);
@@ -240,6 +244,10 @@ public abstract class TermGroupFacetColl
       segmentTotalCount = 0;
 
       segmentGroupedFacetHits.clear();
+      if (facetFieldDocTermOrds.isEmpty()) {
+        return;
+      }
+
       for (GroupedFacetHit groupedFacetHit : groupedFacetHits) {
         int groupOrd = groupFieldTermsIndex.binarySearchLookup(groupedFacetHit.groupValue, spare);
         if (groupOrd < 0) {

Modified: lucene/dev/branches/branch_4x/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java?rev=1378078&r1=1378077&r2=1378078&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java (original)
+++ lucene/dev/branches/branch_4x/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java Tue Aug 28 11:13:43 2012
@@ -19,10 +19,7 @@ package org.apache.lucene.search.groupin
 
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.document.*;
-import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.DocValues;
-import org.apache.lucene.index.RandomIndexWriter;
-import org.apache.lucene.index.Term;
+import org.apache.lucene.index.*;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.TermQuery;
@@ -217,6 +214,82 @@ public class GroupFacetCollectorTest ext
     dir.close();
   }
 
+  public void testMVGroupedFacetingWithDeletes() throws Exception {
+    final String groupField = "hotel";
+    FieldType customType = new FieldType();
+    customType.setStored(true);
+
+    Directory dir = newDirectory();
+    RandomIndexWriter w = new RandomIndexWriter(
+        random(),
+        dir,
+        newIndexWriterConfig(TEST_VERSION_CURRENT,
+            new MockAnalyzer(random())).setMergePolicy(NoMergePolicy.COMPOUND_FILES));
+    boolean useDv = false;
+
+    // 0
+    Document doc = new Document();
+    addField(doc, "x", "x", useDv);
+    w.addDocument(doc);
+
+    doc = new Document();
+    addField(doc, groupField, "a", useDv);
+    addField(doc, "airport", "ams", useDv);
+    w.addDocument(doc);
+
+    w.commit();
+    w.deleteDocuments(new TermQuery(new Term("airport", "ams")));
+
+    // 0
+    doc = new Document();
+    addField(doc, groupField, "a", useDv);
+    addField(doc, "airport", "ams", useDv);
+    w.addDocument(doc);
+
+    // 1
+    doc = new Document();
+    addField(doc, groupField, "a", useDv);
+    addField(doc, "airport", "dus", useDv);
+    w.addDocument(doc);
+
+    // 2
+    doc = new Document();
+    addField(doc, groupField, "b", useDv);
+    addField(doc, "airport", "ams", useDv);
+    w.addDocument(doc);
+
+    // 3
+    doc = new Document();
+    addField(doc, groupField, "b", useDv);
+    addField(doc, "airport", "ams", useDv);
+    w.addDocument(doc);
+
+    // 4
+    doc = new Document();
+    addField(doc, groupField, "b", useDv);
+    addField(doc, "airport", "ams", useDv);
+    w.addDocument(doc);
+
+    w.commit();
+    w.close();
+    IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(dir));
+    AbstractGroupFacetCollector groupedAirportFacetCollector = createRandomCollector(groupField, "airport", null, true, useDv);
+    indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
+    TermGroupFacetCollector.GroupedFacetResult airportResult = groupedAirportFacetCollector.mergeSegmentResults(10, 0, false);
+    assertEquals(3, airportResult.getTotalCount());
+    assertEquals(0, airportResult.getTotalMissingCount());
+
+    List<TermGroupFacetCollector.FacetEntry> entries = airportResult.getFacetEntries(0, 10);
+    assertEquals(2, entries.size());
+    assertEquals("ams", entries.get(0).getValue().utf8ToString());
+    assertEquals(2, entries.get(0).getCount());
+    assertEquals("dus", entries.get(1).getValue().utf8ToString());
+    assertEquals(1, entries.get(1).getCount());
+
+    indexSearcher.getIndexReader().close();
+    dir.close();
+  }
+
   private void addField(Document doc, String field, String value, boolean canUseIDV) {
     doc.add(new StringField(field, value, Field.Store.NO));
     if (canUseIDV) {