SOLR-2780: Fixed issue where multi select facets didn't respect group.truncate parameter.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/branch_3x@1174055 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 0c15f80..290cffa 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -58,6 +58,8 @@
 * SOLR-2763: Extracting update request handler throws exception and returns 400 
   when zero-length file posted using multipart form post (janhoy)
 
+* SOLR-2780: Fixed issue where multi select facets didn't respect group.truncate parameter.
+
  Other Changes
 ----------------------
 
diff --git a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
index 5177460..30db6e3 100644
--- a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
@@ -23,6 +23,9 @@
 import org.apache.lucene.index.TermDocs;
 import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.search.*;
+import org.apache.lucene.search.grouping.AbstractAllGroupHeadsCollector;
+import org.apache.lucene.util.FixedBitSet;
+import org.apache.lucene.util.OpenBitSet;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.FacetParams;
@@ -148,7 +151,24 @@
       }
 
       // get the new base docset for this facet
-      base = searcher.getDocSet(qlist);
+      DocSet base = searcher.getDocSet(qlist);
+      if (rb.grouping() && rb.getGroupingSpec().isTruncateGroups()) {
+        Grouping grouping = new Grouping(searcher, null, rb.getQueryCommand(), false, 0, false);
+        if (rb.getGroupingSpec().getFields().length > 0) {
+          grouping.addFieldCommand(rb.getGroupingSpec().getFields()[0], req);
+        } else {
+          this.base = base;
+          return;
+        }
+        AbstractAllGroupHeadsCollector allGroupHeadsCollector = grouping.getCommands().get(0).createAllGroupCollector();
+        searcher.search(new MatchAllDocsQuery(), base.getTopFilter(), allGroupHeadsCollector);
+        int maxDoc = searcher.maxDoc();
+        FixedBitSet fixedBitSet = allGroupHeadsCollector.retrieveGroupHeads(maxDoc);
+        long[] bits = fixedBitSet.getBits();
+        this.base = new BitDocSet(new OpenBitSet(bits, bits.length));
+      } else {
+        this.base = base;
+      }
     }
 
   }
@@ -936,7 +956,7 @@
    */
   protected int rangeCount(SchemaField sf, String low, String high,
                            boolean iLow, boolean iHigh) throws IOException {
-    Query rangeQ = sf.getType().getRangeQuery(null, sf,low,high,iLow,iHigh);
+    Query rangeQ = sf.getType().getRangeQuery(null, sf, low, high, iLow, iHigh);
     return searcher.numDocs(rangeQ ,base);
   }
 
diff --git a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
index 1f4816f..fab6469 100644
--- a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
@@ -298,6 +298,24 @@
         "/grouped=={'value4_s1':{'matches':5,'groups':[{'groupValue':'1','doclist':{'numFound':3,'start':0,'docs':[{'id':'1'}]}}]}}",
         "/facet_counts=={'facet_queries':{},'facet_fields':{'value3_s1':['a',1,'b',1]},'facet_dates':{},'facet_ranges':{}}"
     );
+
+    // Multi select facets AND group.truncate=true
+    req = req("q", "*:*", "rows", "1", "group", "true", "group.field", "value4_s1", "fl", "id", "facet", "true",
+        "facet.field", "{!ex=v}value3_s1", "group.truncate", "true", "fq", "{!tag=v}value3_s1:b");
+    assertJQ(
+        req,
+        "/grouped=={'value4_s1':{'matches':2,'groups':[{'groupValue':'2','doclist':{'numFound':2,'start':0,'docs':[{'id':'3'}]}}]}}",
+        "/facet_counts=={'facet_queries':{},'facet_fields':{'value3_s1':['a',1,'b',1]},'facet_dates':{},'facet_ranges':{}}"
+    );
+
+    // Multi select facets AND group.truncate=false
+    req = req("q", "*:*", "rows", "1", "group", "true", "group.field", "value4_s1", "fl", "id", "facet", "true",
+        "facet.field", "{!ex=v}value3_s1", "group.truncate", "false", "fq", "{!tag=v}value3_s1:b");
+    assertJQ(
+        req,
+        "/grouped=={'value4_s1':{'matches':2,'groups':[{'groupValue':'2','doclist':{'numFound':2,'start':0,'docs':[{'id':'3'}]}}]}}",
+        "/facet_counts=={'facet_queries':{},'facet_fields':{'value3_s1':['a',3,'b',2]},'facet_dates':{},'facet_ranges':{}}"
+    );
   }
 
   static String f = "foo_s1";