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";