package org.rhq.server.metrics; import java.util.List; import com.datastax.driver.core.ResultSet; import com.google.common.base.Function; import org.rhq.server.metrics.domain.AggregateNumericMetric; import org.rhq.server.metrics.domain.AggregateNumericMetricMapper; import org.rhq.server.metrics.domain.Bucket; /** * @author John Sanda */ public class ComputeAggregate implements Function<ResultSet, AggregateNumericMetric> { private AggregateNumericMetricMapper mapper; private long timestamp; private Bucket bucket; public ComputeAggregate(long timestamp, Bucket bucket) { this.timestamp = timestamp; this.bucket = bucket; mapper = new AggregateNumericMetricMapper(); } @Override public AggregateNumericMetric apply(ResultSet resultSet) { List<AggregateNumericMetric> metrics = mapper.mapAll(resultSet); double min = Double.NaN; double max = min; int count = 0; ArithmeticMeanCalculator mean = new ArithmeticMeanCalculator(); for (AggregateNumericMetric metric : metrics) { if (count == 0) { min = metric.getMin(); max = metric.getMax(); } if (metric.getMin() < min) { min = metric.getMin(); } else if (metric.getMax() > max) { max = metric.getMax(); } mean.add(metric.getAvg()); ++count; } // We let the caller handle setting the schedule id because in some cases we do // not care about it. return new AggregateNumericMetric(0, bucket, mean.getArithmeticMean(), min, max, timestamp); } }