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/06/18 09:16:41 UTC
svn commit: r1351219 - in /lucene/dev/trunk/solr: CHANGES.txt
core/src/java/org/apache/solr/request/SimpleFacets.java
core/src/test/org/apache/solr/request/SimpleFacetsTest.java
Author: mvg
Date: Mon Jun 18 07:16:40 2012
New Revision: 1351219
URL: http://svn.apache.org/viewvc?rev=1351219&view=rev
Log:
SOLR-3406: Extended grouped faceting support to facet.query and facet.range parameters.
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1351219&r1=1351218&r2=1351219&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Jun 18 07:16:40 2012
@@ -266,6 +266,9 @@ New Features
(Russell Black, ryan)
* SOLR-2898: Support grouped faceting. (Martijn van Groningen)
+ Additional Work:
+ SOLR-3406: Extended grouped faceting support to facet.query and facet.range parameters.
+ (David Boychuck, Martijn van Groningen)
* SOLR-2949: QueryElevationComponent is now supported with distributed search.
(Mark Miller, yonik)
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java?rev=1351219&r1=1351218&r2=1351219&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java Mon Jun 18 07:16:40 2012
@@ -22,6 +22,7 @@ import org.apache.lucene.queryparser.cla
import org.apache.lucene.search.*;
import org.apache.lucene.search.grouping.AbstractAllGroupHeadsCollector;
import org.apache.lucene.search.grouping.term.TermGroupFacetCollector;
+import org.apache.lucene.search.grouping.term.TermAllGroupsCollector;
import org.apache.lucene.util.*;
import org.apache.lucene.util.packed.PackedInts;
import org.apache.solr.common.SolrException;
@@ -233,19 +234,45 @@ public class SimpleFacets {
String[] facetQs = params.getParams(FacetParams.FACET_QUERY);
+
if (null != facetQs && 0 != facetQs.length) {
for (String q : facetQs) {
parseParams(FacetParams.FACET_QUERY, q);
// TODO: slight optimization would prevent double-parsing of any localParams
Query qobj = QParser.getParser(q, null, req).getQuery();
- res.add(key, searcher.numDocs(qobj, base));
+
+ if (params.getBool(GroupParams.GROUP_FACET, false)) {
+ res.add(key, getGroupedFacetQueryCount(qobj));
+ } else {
+ res.add(key, searcher.numDocs(qobj, base));
+ }
}
}
return res;
}
-
+
+ /**
+ * Returns a grouped facet count for the facet query
+ *
+ * @see FacetParams#FACET_QUERY
+ */
+ public int getGroupedFacetQueryCount(Query facetQuery) throws IOException {
+ GroupingSpecification groupingSpecification = rb.getGroupingSpec();
+ String groupField = groupingSpecification != null ? groupingSpecification.getFields()[0] : null;
+ if (groupField == null) {
+ throw new SolrException (
+ SolrException.ErrorCode.BAD_REQUEST,
+ "Specify the group.field as parameter or local parameter"
+ );
+ }
+
+ TermAllGroupsCollector collector = new TermAllGroupsCollector(groupField);
+ Filter mainQueryFilter = docs.getTopFilter(); // This returns a filter that only matches documents matching with q param and fq params
+ searcher.search(facetQuery, mainQueryFilter, collector);
+ return collector.getGroupCount();
+ }
public NamedList<Integer> getTermCounts(String field) throws IOException {
int offset = params.getFieldInt(field, FacetParams.FACET_OFFSET, 0);
@@ -1172,7 +1199,11 @@ public class SimpleFacets {
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);
- return searcher.numDocs(rangeQ ,base);
+ if (params.getBool(GroupParams.GROUP_FACET, false)) {
+ return getGroupedFacetQueryCount(rangeQ);
+ } else {
+ return searcher.numDocs(rangeQ ,base);
+ }
}
/**
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java?rev=1351219&r1=1351218&r2=1351219&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java Mon Jun 18 07:16:40 2012
@@ -26,14 +26,9 @@ import org.apache.solr.util.TimeZoneUtil
import org.junit.BeforeClass;
import org.junit.Test;
-import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.List;
import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.TimeZone;
public class SimpleFacetsTest extends SolrTestCaseJ4 {
@@ -120,6 +115,42 @@ public class SimpleFacetsTest extends So
}
@Test
+ public void testSimpleGroupedQueryRangeFacets() throws Exception {
+ assertQ(
+ req(
+ "q", "*:*",
+ "fq", "id:[2000 TO 2004]",
+ "group", "true",
+ "group.facet", "true",
+ "group.field", "hotel_s1",
+ "facet", "true",
+ "facet.query", "airport_s1:ams"
+ ),
+ "//lst[@name='facet_queries']/int[@name='airport_s1:ams'][.='2']"
+ );
+ assertQ(
+ req(
+ "q", "*:*",
+ "fq", "id:[2000 TO 2004]",
+ "group", "true",
+ "group.facet", "true",
+ "group.field", "hotel_s1",
+ "facet", "true",
+ "facet.range", "duration_i1",
+ "facet.range.start", "5",
+ "facet.range.end", "11",
+ "facet.range.gap", "1"
+ ),
+ "//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='5'][.='2']",
+ "//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='6'][.='0']",
+ "//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='7'][.='0']",
+ "//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='8'][.='0']",
+ "//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='9'][.='0']",
+ "//lst[@name='facet_ranges']/lst[@name='duration_i1']/lst[@name='counts']/int[@name='10'][.='2']"
+ );
+ }
+
+ @Test
public void testSimpleGroupedFacets() throws Exception {
assertQ(
"Return 5 docs with id range 1937 till 1940",