From a3812a67d95651c70c801cbea5ed1ff2e39ee051 Mon Sep 17 00:00:00 2001 From: rustamhsmv Date: Fri, 16 Dec 2016 15:34:47 -0800 Subject: [PATCH 1/2] make CountSlotArrAcc internal array reusable --- .../solr/search/facet/FacetProcessor.java | 1 + .../solr/search/facet/FacetRequest.java | 23 +++++++++++++++++++ .../org/apache/solr/search/facet/SlotAcc.java | 11 ++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java index 4a839a29ccf0..c2c04c533bfc 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java @@ -419,6 +419,7 @@ void processSubs(SimpleOrderedMap response, Query filter, DocSet domain) // make a new context for each sub-facet since they can change the domain FacetContext subContext = fcontext.sub(filter, domain); + subContext.sequentialProcessing = true; FacetProcessor subProcessor = subRequest.createFacetProcessor(subContext); if (fcontext.getDebugInfo() != null) { // if fcontext.debugInfo != null, it means rb.debug() == true diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java index 636460f7e60b..e7235251da3c 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.EnumSet; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -178,6 +179,15 @@ class FacetContext { int flags; FacetDebugInfo debugInfo; + int level; // level of the context + boolean sequentialProcessing; // indicates if execution of facet processors happens sequentially + private Map reusables; + + public FacetContext() { + level = 0; + reusables = new HashMap<>(); + } + public void setDebugInfo(FacetDebugInfo debugInfo) { this.debugInfo = debugInfo; } @@ -190,6 +200,16 @@ public boolean isShard() { return (flags & IS_SHARD) != 0; } + public Object getReusable(String key) { + return sequentialProcessing ? reusables.get(key) : null; + } + + public void addReusable(String key, Object obj) { + if (sequentialProcessing) { + reusables.put(key, obj); + } + } + /** * @param filter The filter for the bucket that resulted in this context/domain. Can be null if this is the root context. * @param domain The resulting set of documents for this facet. @@ -205,6 +225,9 @@ public FacetContext sub(Query filter, DocSet domain) { ctx.qcontext = qcontext; ctx.req = req; ctx.searcher = searcher; + ctx.reusables = reusables; + + ctx.level = level + 1; return ctx; } diff --git a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java index 4f4851bbb602..ae5347733ec4 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java +++ b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java @@ -394,7 +394,16 @@ class CountSlotArrAcc extends CountSlotAcc { int[] result; public CountSlotArrAcc(FacetContext fcontext, int numSlots) { super(fcontext); - result = new int[numSlots]; + + String key = fcontext.level + this.getClass().getSimpleName(); + result = (int[]) fcontext.getReusable(key); + if (result == null || result.length < numSlots) { + result = new int[numSlots]; + fcontext.addReusable(key, result); + } + else { + Arrays.fill(result, 0); + } } @Override From 1c069cc6e0fdc084bb1b88591dae32143d4ebdba Mon Sep 17 00:00:00 2001 From: rustamhsmv Date: Sat, 17 Dec 2016 13:51:21 -0800 Subject: [PATCH 2/2] Comments --- .../src/java/org/apache/solr/search/facet/FacetRequest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java index e7235251da3c..8f847b86f5ab 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRequest.java @@ -179,8 +179,9 @@ class FacetContext { int flags; FacetDebugInfo debugInfo; - int level; // level of the context + // Parameters for reusable boolean sequentialProcessing; // indicates if execution of facet processors happens sequentially + int level; // level of facet processor private Map reusables; public FacetContext() {