diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java index 27b5bde8175..57800ad021f 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java @@ -23,7 +23,9 @@ import java.util.Date; import java.util.EnumSet; import java.util.List; +import org.apache.lucene.index.Term; import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.FacetParams; import org.apache.solr.common.util.SimpleOrderedMap; @@ -31,6 +33,7 @@ import org.apache.solr.schema.FieldType; import org.apache.solr.schema.SchemaField; import org.apache.solr.schema.TrieDateField; import org.apache.solr.schema.TrieField; +import org.apache.solr.search.DocSet; import org.apache.solr.util.DateMathParser; public class FacetRange extends FacetRequest { @@ -214,24 +217,70 @@ class FacetRangeProcessor extends FacetProcessor { private SimpleOrderedMap getRangeCountsIndexed() throws IOException { - final SimpleOrderedMap res = new SimpleOrderedMap<>(); + int slotCount = rangeList.size() + otherList.size(); + intersections = new DocSet[slotCount]; + createAccs(fcontext.base.size(), slotCount); + prepareForCollection(); - List> buckets = null; - - buckets = new ArrayList<>(); - res.add("buckets", buckets); - - for (Range range : rangeList) { - buckets.add( rangeStats( range, false) ); + for (int idx = 0; idx(); + List buckets = new ArrayList<>(); + res.add("buckets", buckets); + + for (int idx = 0; idx 0) { + DocSet subBase = intersections[slot]; + if (subBase.size() == 0) return; + FacetContext subContext = fcontext.sub(); + subContext.base = subBase; + try { + fillBucketSubs(bucket, subContext); + } finally { + // subContext.base.decref(); // OFF-HEAP + // subContext.base = null; // do not modify context after creation... there may be deferred execution (i.e. streaming) + } + } + } + private SimpleOrderedMap rangeStats(Range range, boolean special ) throws IOException { SimpleOrderedMap bucket = new SimpleOrderedMap<>(); diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java index e8ed066ad30..1721ffff1b9 100644 --- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java +++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java @@ -286,7 +286,6 @@ public class TestJsonFacets extends SolrTestCaseHS { @Test public void testStats() throws Exception { - // single valued strings doStats(Client.localClient, params()); }