You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2015/04/26 03:14:47 UTC

svn commit: r1676077 - in /lucene/dev/trunk/solr/core/src: java/org/apache/solr/search/facet/FacetRange.java test/org/apache/solr/search/facet/TestJsonFacets.java

Author: yonik
Date: Sun Apr 26 01:14:47 2015
New Revision: 1676077

URL: http://svn.apache.org/r1676077
Log:
SOLR-7446: refactor range faceting to use slots

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java?rev=1676077&r1=1676076&r2=1676077&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java Sun Apr 26 01:14:47 2015
@@ -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 FacetP
 
   private  SimpleOrderedMap getRangeCountsIndexed() throws IOException {
 
-    final SimpleOrderedMap<Object> res = new SimpleOrderedMap<>();
+    int slotCount = rangeList.size() + otherList.size();
+    intersections = new DocSet[slotCount];
+    createAccs(fcontext.base.size(), slotCount);
+    prepareForCollection();
 
-    List<SimpleOrderedMap<Object>> buckets = null;
+    for (int idx = 0; idx<rangeList.size(); idx++) {
+      rangeStats(rangeList.get(idx), idx);
+    }
+
+    for (int idx = 0; idx<otherList.size(); idx++) {
+      rangeStats(otherList.get(idx), rangeList.size() + idx);
+    }
 
-    buckets = new ArrayList<>();
+
+    final SimpleOrderedMap res = new SimpleOrderedMap<>();
+    List<SimpleOrderedMap> buckets = new ArrayList<>();
     res.add("buckets", buckets);
-    
-    for (Range range : rangeList) {
-      buckets.add( rangeStats( range, false) );
+
+    for (int idx = 0; idx<rangeList.size(); idx++) {
+      Range range = rangeList.get(idx);
+      SimpleOrderedMap bucket = new SimpleOrderedMap();
+      buckets.add(bucket);
+      bucket.add("val", range.label);
+      addStats(bucket, idx);
+      doSubs(bucket, idx);
     }
 
-    for (Range range : otherList) {
-      res.add(range.label.toString(), rangeStats( range, true));
+    for (int idx = 0; idx<otherList.size(); idx++) {
+      Range range = otherList.get(idx);
+      SimpleOrderedMap bucket = new SimpleOrderedMap();
+      res.add(range.label.toString(), bucket);
+      addStats(bucket, rangeList.size() + idx);
+      doSubs(bucket, rangeList.size() + idx);
     }
 
     return res;
   }
 
+  private DocSet[] intersections;
+  private void rangeStats(Range range, int slot) throws IOException {
+    Query rangeQ = sf.getType().getRangeQuery(null, sf, range.low == null ? null : calc.formatValue(range.low), range.high==null ? null : calc.formatValue(range.high), range.includeLower, range.includeUpper);
+    // TODO: specialize count only
+    DocSet intersection = fcontext.searcher.getDocSet(rangeQ, fcontext.base);
+    intersections[slot] = intersection;  // save for later
+    int num = collect(intersection, slot);
+    countAcc.incrementCount(slot, num); // TODO: roll this into collect()
+  }
+
+  private void doSubs(SimpleOrderedMap bucket, int slot) throws IOException {
+    // handle sub-facets for this bucket
+    if (freq.getSubFacets().size() > 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<Object> rangeStats(Range range, boolean special ) throws IOException {
     SimpleOrderedMap<Object> bucket = new SimpleOrderedMap<>();
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java?rev=1676077&r1=1676076&r2=1676077&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java Sun Apr 26 01:14:47 2015
@@ -286,7 +286,6 @@ public class TestJsonFacets extends Solr
 
   @Test
   public void testStats() throws Exception {
-    // single valued strings
     doStats(Client.localClient, params());
   }