/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.search.elasticsearch.internal.stats;
import com.liferay.portal.kernel.search.Stats;
import com.liferay.portal.kernel.search.StatsResults;
import com.liferay.portal.search.elasticsearch.stats.StatsTranslator;
import java.util.Map;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.missing.Missing;
import org.elasticsearch.search.aggregations.bucket.missing.MissingBuilder;
import org.elasticsearch.search.aggregations.metrics.max.Max;
import org.elasticsearch.search.aggregations.metrics.max.MaxBuilder;
import org.elasticsearch.search.aggregations.metrics.min.Min;
import org.elasticsearch.search.aggregations.metrics.min.MinBuilder;
import org.elasticsearch.search.aggregations.metrics.stats.StatsBuilder;
import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats;
import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStatsBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.search.aggregations.metrics.sum.SumBuilder;
import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount;
import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCountBuilder;
import org.osgi.service.component.annotations.Component;
/**
* @author Michael C. Han
*/
@Component(immediate = true, service = StatsTranslator.class)
public class DefaultStatsTranslator implements StatsTranslator {
@Override
public StatsResults translate(
Map<String, Aggregation> aggregationMap, Stats stats) {
String field = stats.getField();
StatsResults statsResults = new StatsResults(field);
if (stats.isCount()) {
ValueCount valueCount = (ValueCount)aggregationMap.get(
field + "_count");
statsResults.setCount(valueCount.getValue());
}
if (stats.isMax()) {
Max max = (Max)aggregationMap.get(field + "_max");
statsResults.setMax(max.getValue());
}
if (stats.isMean()) {
org.elasticsearch.search.aggregations.metrics.stats.Stats
elasticsearchStats =
(org.elasticsearch.search.aggregations.metrics.stats.Stats)
aggregationMap.get(field + "_stats");
statsResults.setMean(elasticsearchStats.getAvg());
}
if (stats.isMin()) {
Min min = (Min)aggregationMap.get(field + "_min");
statsResults.setMin(min.getValue());
}
if (stats.isMissing()) {
Missing missing = (Missing)aggregationMap.get(field + "_missing");
statsResults.setMissing((int)missing.getDocCount());
}
if (stats.isStandardDeviation()) {
ExtendedStats extendedStats = (ExtendedStats)aggregationMap.get(
field + "_extendedStats");
statsResults.setStandardDeviation(extendedStats.getStdDeviation());
}
if (stats.isSum()) {
Sum sum = (Sum)aggregationMap.get(field + "_sum");
statsResults.setSum(sum.getValue());
}
if (stats.isSumOfSquares()) {
ExtendedStats extendedStats = (ExtendedStats)aggregationMap.get(
field + "_extendedStats");
statsResults.setSumOfSquares(extendedStats.getSumOfSquares());
}
return statsResults;
}
@Override
public void translate(
SearchRequestBuilder searchRequestBuilder, Stats stats) {
if (!stats.isEnabled()) {
return;
}
String field = stats.getField();
if (stats.isCount()) {
ValueCountBuilder valueCountBuilder = AggregationBuilders.count(
field + "_count");
valueCountBuilder.field(field);
searchRequestBuilder.addAggregation(valueCountBuilder);
}
if (stats.isMax()) {
MaxBuilder maxBuilder = AggregationBuilders.max(field + "_max");
maxBuilder.field(field);
searchRequestBuilder.addAggregation(maxBuilder);
}
if (stats.isMean()) {
StatsBuilder statsBuilder = AggregationBuilders.stats(
field + "_stats");
statsBuilder.field(field);
searchRequestBuilder.addAggregation(statsBuilder);
}
if (stats.isMin()) {
MinBuilder minBuilder = AggregationBuilders.min(field + "_min");
minBuilder.field(field);
searchRequestBuilder.addAggregation(minBuilder);
}
if (stats.isMissing()) {
MissingBuilder missingBuilder = AggregationBuilders.missing(
field + "_missing");
missingBuilder.field(field);
searchRequestBuilder.addAggregation(missingBuilder);
}
if (stats.isStandardDeviation() || stats.isSumOfSquares()) {
ExtendedStatsBuilder extendedStatsBuilder =
AggregationBuilders.extendedStats(field + "_extendedStats");
extendedStatsBuilder.field(field);
searchRequestBuilder.addAggregation(extendedStatsBuilder);
}
if (stats.isSum()) {
SumBuilder sumBuilder = AggregationBuilders.sum(field + "_sum");
sumBuilder.field(field);
searchRequestBuilder.addAggregation(sumBuilder);
}
}
}