Browse Source

Invoke postCollection on aggregation collectors.
Also cleanup how facet and aggs collector are used inside the QueryCollector

Closes #5387

Martijn van Groningen 11 years ago
parent
commit
aecadfcc61

+ 1 - 1
src/main/java/org/elasticsearch/percolator/PercolatorService.java

@@ -777,7 +777,7 @@ public class PercolatorService extends AbstractComponent {
         FilteredQuery query = new FilteredQuery(context.percolateQuery(), percolatorTypeFilter);
         percolatorSearcher.searcher().search(query, percolateCollector);
 
-        for (Collector queryCollector : percolateCollector.facetCollectors) {
+        for (Collector queryCollector : percolateCollector.facetAndAggregatorCollector) {
             if (queryCollector instanceof XCollector) {
                 ((XCollector) queryCollector).postCollection();
             }

+ 18 - 28
src/main/java/org/elasticsearch/percolator/QueryCollector.java

@@ -19,6 +19,7 @@
 package org.elasticsearch.percolator;
 
 import com.carrotsearch.hppc.FloatArrayList;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.search.*;
@@ -61,8 +62,7 @@ abstract class QueryCollector extends Collector {
 
     BytesValues values;
 
-    final List<Collector> facetCollectors = new ArrayList<Collector>();
-    final Collector facetAndAggregatorCollector;
+    final List<Collector> facetAndAggregatorCollector;
 
     QueryCollector(ESLogger logger, PercolateContext context) {
         this.logger = logger;
@@ -71,6 +71,7 @@ abstract class QueryCollector extends Collector {
         final FieldMapper<?> idMapper = context.mapperService().smartNameFieldMapper(IdFieldMapper.NAME);
         this.idFieldData = context.fieldData().getForField(idMapper);
 
+        ImmutableList.Builder<Collector> facetAggCollectorBuilder = ImmutableList.builder();
         if (context.facets() != null) {
             for (SearchContextFacets.Entry entry : context.facets().entries()) {
                 if (entry.isGlobal()) {
@@ -84,11 +85,10 @@ abstract class QueryCollector extends Collector {
                         collector = new FilteredCollector(collector, entry.getFilter());
                     }
                 }
-                facetCollectors.add(collector);
+                facetAggCollectorBuilder.add(collector);
             }
         }
 
-        List<Collector> collectors = new ArrayList<Collector>(facetCollectors);
         if (context.aggregations() != null) {
             AggregationContext aggregationContext = new AggregationContext(context);
             context.aggregations().aggregationContext(aggregationContext);
@@ -105,24 +105,22 @@ abstract class QueryCollector extends Collector {
             }
             context.aggregations().aggregators(aggregators);
             if (!aggregatorCollectors.isEmpty()) {
-                collectors.add(new AggregationPhase.AggregationsCollector(aggregatorCollectors, aggregationContext));
+                facetAggCollectorBuilder.add(new AggregationPhase.AggregationsCollector(aggregatorCollectors, aggregationContext));
             }
         }
+        facetAndAggregatorCollector = facetAggCollectorBuilder.build();
+    }
 
-        int size = collectors.size();
-        if (size == 0) {
-            facetAndAggregatorCollector = null;
-        } else if (size == 1) {
-            facetAndAggregatorCollector = collectors.get(0);
-        } else {
-            facetAndAggregatorCollector = MultiCollector.wrap(collectors.toArray(new Collector[collectors.size()]));
+    public void postMatch(int doc) throws IOException {
+        for (Collector collector : facetAndAggregatorCollector) {
+            collector.collect(doc);
         }
     }
 
     @Override
     public void setScorer(Scorer scorer) throws IOException {
-        if (facetAndAggregatorCollector != null) {
-            facetAndAggregatorCollector.setScorer(scorer);
+        for (Collector collector : facetAndAggregatorCollector) {
+            collector.setScorer(scorer);
         }
     }
 
@@ -130,8 +128,8 @@ abstract class QueryCollector extends Collector {
     public void setNextReader(AtomicReaderContext context) throws IOException {
         // we use the UID because id might not be indexed
         values = idFieldData.load(context).getBytesValues(true);
-        if (facetAndAggregatorCollector != null) {
-            facetAndAggregatorCollector.setNextReader(context);
+        for (Collector collector : facetAndAggregatorCollector) {
+            collector.setNextReader(context);
         }
     }
 
@@ -214,9 +212,7 @@ abstract class QueryCollector extends Collector {
                         }
                     }
                     counter++;
-                    if (facetAndAggregatorCollector != null) {
-                        facetAndAggregatorCollector.collect(doc);
-                    }
+                    postMatch(doc);
                 }
             } catch (IOException e) {
                 logger.warn("[" + spare.bytes.utf8ToString() + "] failed to execute query", e);
@@ -259,9 +255,7 @@ abstract class QueryCollector extends Collector {
                 searcher.search(query, collector);
                 if (collector.exists()) {
                     topDocsCollector.collect(doc);
-                    if (facetAndAggregatorCollector != null) {
-                        facetAndAggregatorCollector.collect(doc);
-                    }
+                    postMatch(doc);
                 }
             } catch (IOException e) {
                 logger.warn("[" + spare.bytes.utf8ToString() + "] failed to execute query", e);
@@ -333,9 +327,7 @@ abstract class QueryCollector extends Collector {
                         }
                     }
                     counter++;
-                    if (facetAndAggregatorCollector != null) {
-                        facetAndAggregatorCollector.collect(doc);
-                    }
+                    postMatch(doc);
                 }
             } catch (IOException e) {
                 logger.warn("[" + spare.bytes.utf8ToString() + "] failed to execute query", e);
@@ -385,9 +377,7 @@ abstract class QueryCollector extends Collector {
                 searcher.search(query, collector);
                 if (collector.exists()) {
                     counter++;
-                    if (facetAndAggregatorCollector != null) {
-                        facetAndAggregatorCollector.collect(doc);
-                    }
+                    postMatch(doc);
                 }
             } catch (IOException e) {
                 logger.warn("[" + spare.bytes.utf8ToString() + "] failed to execute query", e);