/** * 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.solr.internal.stats; import com.liferay.portal.kernel.search.Stats; import com.liferay.portal.kernel.search.StatsResults; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.search.solr.stats.StatsTranslator; import java.util.ArrayList; import java.util.List; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.FieldStatsInfo; import org.osgi.service.component.annotations.Component; /** * @author Miguel Angelo Caldas Gallindo */ @Component(immediate = true, service = StatsTranslator.class) public class DefaultStatsTranslator implements StatsTranslator { @Override public StatsResults translate(FieldStatsInfo fieldStatsInfo, Stats stats) { String field = stats.getField(); StatsResults statsResults = new StatsResults(field); if (stats.isCount()) { Long count = fieldStatsInfo.getCount(); if (count != null) { statsResults.setCount(count); } } if (stats.isMax()) { Object max = fieldStatsInfo.getMax(); if (max != null) { statsResults.setMax(toDouble(max)); } } if (stats.isMean()) { Object mean = fieldStatsInfo.getMean(); if (mean != null) { statsResults.setMean(toDouble(mean)); } } if (stats.isMin()) { Object min = fieldStatsInfo.getMin(); if (min != null) { statsResults.setMin(toDouble(min)); } } if (stats.isMissing()) { Long missing = fieldStatsInfo.getMissing(); if (missing != null) { statsResults.setMissing(missing.intValue()); } } if (stats.isStandardDeviation()) { Double stddev = fieldStatsInfo.getStddev(); if (stddev != null) { statsResults.setStandardDeviation(stddev); } } if (stats.isSum()) { Object sum = fieldStatsInfo.getSum(); if (sum != null) { statsResults.setSum(toDouble(sum)); } } if (stats.isSumOfSquares()) { Double sumOfSquares = fieldStatsInfo.getSumOfSquares(); if (sumOfSquares != null) { statsResults.setSumOfSquares(sumOfSquares); } } return statsResults; } @Override public void translate(SolrQuery solrQuery, Stats stats) { if (!stats.isEnabled()) { return; } List<String> solrStats = new ArrayList<>(8); if (stats.isCount()) { solrStats.add("count"); } if (stats.isMax()) { solrStats.add("max"); } if (stats.isMean()) { solrStats.add("mean"); } if (stats.isMin()) { solrStats.add("min"); } if (stats.isMissing()) { solrStats.add("missing"); } if (stats.isStandardDeviation()) { solrStats.add("stddev"); } if (stats.isSum()) { solrStats.add("sum"); } if (stats.isSumOfSquares()) { solrStats.add("sumOfSquares"); } String fieldStatistics = buildField(stats.getField(), solrStats); solrQuery.setGetFieldStatistics(fieldStatistics); } protected String buildField(String field, List<String> solrStats) { if (solrStats.isEmpty()) { return field; } StringBundler sb = new StringBundler(solrStats.size() * 3 + 2); sb.append("{!"); for (int i = 0; i < solrStats.size(); i++) { if (i > 0) { sb.append(' '); } sb.append(solrStats.get(i)); sb.append("=true"); } sb.append("}"); sb.append(field); return sb.toString(); } protected double toDouble(Object value) { if (value instanceof Number) { Number number = (Number)value; return number.doubleValue(); } throw new IllegalArgumentException("Only numeric fields are supported"); } }