diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/query/QueryFacetCollector.java b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/query/QueryFacetCollector.java index 12b90ca48c8..e7797aeb8f3 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/query/QueryFacetCollector.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/query/QueryFacetCollector.java @@ -20,10 +20,13 @@ package org.elasticsearch.search.facets.query; import org.apache.lucene.index.IndexReader; -import org.apache.lucene.search.*; +import org.apache.lucene.search.DocIdSet; +import org.apache.lucene.search.Filter; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryWrapperFilter; import org.elasticsearch.index.cache.filter.FilterCache; import org.elasticsearch.search.facets.Facet; -import org.elasticsearch.search.facets.collector.FacetCollector; +import org.elasticsearch.search.facets.support.AbstractFacetCollector; import org.elasticsearch.util.lucene.docset.DocSet; import org.elasticsearch.util.lucene.docset.DocSets; @@ -32,25 +35,19 @@ import java.io.IOException; /** * @author kimchy (shay.banon) */ -public class QueryFacetCollector extends FacetCollector { +public class QueryFacetCollector extends AbstractFacetCollector { private final Filter filter; - private final String name; - private DocSet docSet; private int count = 0; - public QueryFacetCollector(String name, Query query, FilterCache filterCache) { - this.name = name; + public QueryFacetCollector(String facetName, Query query, FilterCache filterCache) { + super(facetName); this.filter = filterCache.cache(new QueryWrapperFilter(query)); } - @Override public void setScorer(Scorer scorer) throws IOException { - // ignore - } - @Override public void setNextReader(IndexReader reader, int docBase) throws IOException { DocIdSet docIdSet = filter.getDocIdSet(reader); if (docIdSet instanceof DocSet) { @@ -66,11 +63,7 @@ public class QueryFacetCollector extends FacetCollector { } } - @Override public boolean acceptsDocsOutOfOrder() { - return true; - } - @Override public Facet facet() { - return new InternalQueryFacet(name, count); + return new InternalQueryFacet(facetName, count); } } diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/statistical/StatisticalFacetCollector.java b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/statistical/StatisticalFacetCollector.java index 6e14e6c120c..1bc64828bd3 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/statistical/StatisticalFacetCollector.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/statistical/StatisticalFacetCollector.java @@ -20,7 +20,6 @@ package org.elasticsearch.search.facets.statistical; import org.apache.lucene.index.IndexReader; -import org.apache.lucene.search.Scorer; import org.elasticsearch.index.cache.field.FieldDataCache; import org.elasticsearch.index.field.FieldData; import org.elasticsearch.index.field.NumericFieldData; @@ -28,7 +27,7 @@ import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.search.facets.Facet; import org.elasticsearch.search.facets.FacetPhaseExecutionException; -import org.elasticsearch.search.facets.collector.FacetCollector; +import org.elasticsearch.search.facets.support.AbstractFacetCollector; import java.io.IOException; @@ -37,9 +36,7 @@ import static org.elasticsearch.index.field.FieldDataOptions.*; /** * @author kimchy (shay.banon) */ -public class StatisticalFacetCollector extends FacetCollector { - - private final String name; +public class StatisticalFacetCollector extends AbstractFacetCollector { private final String fieldName; @@ -51,14 +48,14 @@ public class StatisticalFacetCollector extends FacetCollector { private final StatsProc statsProc = new StatsProc(); - public StatisticalFacetCollector(String name, String fieldName, FieldDataCache fieldDataCache, MapperService mapperService) { - this.name = name; + public StatisticalFacetCollector(String facetName, String fieldName, FieldDataCache fieldDataCache, MapperService mapperService) { + super(facetName); this.fieldName = fieldName; this.fieldDataCache = fieldDataCache; FieldMapper mapper = mapperService.smartNameFieldMapper(fieldName); if (mapper == null) { - throw new FacetPhaseExecutionException(name, "No mapping found for field [" + fieldName + "]"); + throw new FacetPhaseExecutionException(facetName, "No mapping found for field [" + fieldName + "]"); } fieldDataType = mapper.fieldDataType(); } @@ -71,15 +68,8 @@ public class StatisticalFacetCollector extends FacetCollector { fieldData = (NumericFieldData) fieldDataCache.cache(fieldDataType, reader, fieldName, fieldDataOptions().withFreqs(false)); } - @Override public void setScorer(Scorer scorer) throws IOException { - } - - @Override public boolean acceptsDocsOutOfOrder() { - return true; - } - @Override public Facet facet() { - return new InternalStatisticalFacet(name, statsProc.min(), statsProc.max(), statsProc.total(), statsProc.sumOfSquares(), statsProc.count()); + return new InternalStatisticalFacet(facetName, statsProc.min(), statsProc.max(), statsProc.total(), statsProc.sumOfSquares(), statsProc.count()); } public static class StatsProc implements NumericFieldData.DoubleValueInDocProc { diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/support/AbstractFacetCollector.java b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/support/AbstractFacetCollector.java new file mode 100644 index 00000000000..9d0cf4b21eb --- /dev/null +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/support/AbstractFacetCollector.java @@ -0,0 +1,45 @@ +/* + * Licensed to Elastic Search and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Elastic Search licenses this + * file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.search.facets.support; + +import org.apache.lucene.search.Scorer; +import org.elasticsearch.search.facets.collector.FacetCollector; + +import java.io.IOException; + +/** + * @author kimchy (shay.banon) + */ +public abstract class AbstractFacetCollector extends FacetCollector { + + protected final String facetName; + + public AbstractFacetCollector(String facetName) { + this.facetName = facetName; + } + + @Override public void setScorer(Scorer scorer) throws IOException { + // usually, there is nothing to do here + } + + @Override public boolean acceptsDocsOutOfOrder() { + return true; // when working on FieldData, docs can be out of order + } +} diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollector.java b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollector.java index fcbda77b99f..88a59bd784b 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollector.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollector.java @@ -20,13 +20,12 @@ package org.elasticsearch.search.facets.terms; import org.apache.lucene.index.IndexReader; -import org.apache.lucene.search.Scorer; import org.elasticsearch.index.cache.field.FieldDataCache; import org.elasticsearch.index.field.FieldData; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.search.facets.Facet; -import org.elasticsearch.search.facets.collector.FacetCollector; +import org.elasticsearch.search.facets.support.AbstractFacetCollector; import org.elasticsearch.util.BoundedTreeSet; import org.elasticsearch.util.ThreadLocals; import org.elasticsearch.util.collect.ImmutableList; @@ -42,7 +41,7 @@ import static org.elasticsearch.index.field.FieldDataOptions.*; /** * @author kimchy (shay.banon) */ -public class TermsFacetCollector extends FacetCollector { +public class TermsFacetCollector extends AbstractFacetCollector { private static ThreadLocal>>> cache = new ThreadLocal>>>() { @Override protected ThreadLocals.CleanableValue>> initialValue() { @@ -53,8 +52,6 @@ public class TermsFacetCollector extends FacetCollector { private final FieldDataCache fieldDataCache; - private final String name; - private final String fieldName; private final int size; @@ -65,8 +62,8 @@ public class TermsFacetCollector extends FacetCollector { private final AggregatorValueProc aggregator; - public TermsFacetCollector(String name, String fieldName, int size, FieldDataCache fieldDataCache, MapperService mapperService) { - this.name = name; + public TermsFacetCollector(String facetName, String fieldName, int size, FieldDataCache fieldDataCache, MapperService mapperService) { + super(facetName); this.fieldDataCache = fieldDataCache; this.size = size; @@ -82,14 +79,6 @@ public class TermsFacetCollector extends FacetCollector { aggregator = new AggregatorValueProc(popFacets()); } - @Override public void setScorer(Scorer scorer) throws IOException { - // nothing to do here - } - - @Override public boolean acceptsDocsOutOfOrder() { - return true; - } - @Override public void setNextReader(IndexReader reader, int docBase) throws IOException { fieldData = fieldDataCache.cache(fieldDataType, reader, fieldName, fieldDataOptions().withFreqs(false)); } @@ -102,7 +91,7 @@ public class TermsFacetCollector extends FacetCollector { TObjectIntHashMap facets = aggregator.facets(); if (facets.isEmpty()) { pushFacets(facets); - return new InternalTermsFacet(name, InternalTermsFacet.ComparatorType.COUNT, size, ImmutableList.of()); + return new InternalTermsFacet(facetName, InternalTermsFacet.ComparatorType.COUNT, size, ImmutableList.of()); } else { BoundedTreeSet ordered = new BoundedTreeSet(InternalTermsFacet.ComparatorType.COUNT.comparator(), size); for (TObjectIntIterator it = facets.iterator(); it.hasNext();) { @@ -110,7 +99,7 @@ public class TermsFacetCollector extends FacetCollector { ordered.add(new InternalTermsFacet.Entry(it.key(), it.value())); } pushFacets(facets); - return new InternalTermsFacet(name, InternalTermsFacet.ComparatorType.COUNT, size, ordered); + return new InternalTermsFacet(facetName, InternalTermsFacet.ComparatorType.COUNT, size, ordered); } }