/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF 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.apache.solr.handler.component; import java.util.HashMap; import java.util.Map; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; /** 2/11/2009 - Moved out of StatsComponent to allow open access to UnInvertedField * StatsValues is a utility to accumulate statistics on a set of values * * </p> * @see org.apache.solr.handler.component.StatsComponent * */ public class StatsValues { private static final String FACETS = "facets"; double min; double max; double sum; double sumOfSquares; long count; long missing; // facetField facetValue public Map<String, Map<String,StatsValues>> facets; public StatsValues() { reset(); } public void accumulate(NamedList stv){ min = Math.min(min, (Double)stv.get("min")); max = Math.max(max, (Double)stv.get("max")); sum += (Double)stv.get("sum"); count += (Long)stv.get("count"); missing += (Long)stv.get("missing"); sumOfSquares += (Double)stv.get("sumOfSquares"); NamedList f = (NamedList)stv.get( FACETS ); if( f != null ) { if( facets == null ) { facets = new HashMap<String, Map<String,StatsValues>>(); } for( int i=0; i< f.size(); i++ ) { String field = f.getName(i); NamedList vals = (NamedList)f.getVal( i ); Map<String,StatsValues> addTo = facets.get( field ); if( addTo == null ) { addTo = new HashMap<String,StatsValues>(); facets.put( field, addTo ); } for( int j=0; j< vals.size(); j++ ) { String val = vals.getName(j); StatsValues vvals = addTo.get( val ); if( vvals == null ) { vvals = new StatsValues(); addTo.put( val, vvals ); } vvals.accumulate( (NamedList)vals.getVal( j ) ); } } } } public void accumulate(double v){ sumOfSquares += (v*v); // for std deviation min = Math.min(min, v); max = Math.max(max, v); sum += v; count++; } public void accumulate(double v, int c){ sumOfSquares += (v*v*c); // for std deviation min = Math.min(min, v); max = Math.max(max, v); sum += v*c; count+= c; } public void addMissing(int c){ missing += c; } public double getAverage(){ return sum / count; } public double getStandardDeviation() { if( count <= 1.0D ) return 0.0D; return Math.sqrt( ( ( count * sumOfSquares ) - ( sum * sum ) ) / ( count * ( count - 1.0D ) ) ); } public long getCount() { return count; } public void reset(){ min = Double.MAX_VALUE; max = -1.0*Double.MAX_VALUE; sum = count = missing = 0; sumOfSquares = 0; facets = null; } public NamedList<?> getStatsValues(){ NamedList<Object> res = new SimpleOrderedMap<Object>(); res.add("min", min); res.add("max", max); res.add("sum", sum); res.add("count", count); res.add("missing", missing); res.add("sumOfSquares", sumOfSquares ); res.add("mean", getAverage()); res.add( "stddev", getStandardDeviation() ); // add the facet stats if( facets != null && facets.size() > 0 ) { NamedList<NamedList<?>> nl = new SimpleOrderedMap<NamedList<?>>(); for( Map.Entry<String, Map<String,StatsValues>> entry : facets.entrySet() ) { NamedList<NamedList<?>> nl2 = new SimpleOrderedMap<NamedList<?>>(); nl.add( entry.getKey(), nl2 ); for( Map.Entry<String, StatsValues> e2 : entry.getValue().entrySet() ) { nl2.add( e2.getKey(), e2.getValue().getStatsValues() ); } } res.add( FACETS, nl ); } return res; } }