package backtype.storm.metric.api;
import backtype.storm.metric.api.IReducer;
class MeanReducerState {
public int count = 0;
public double sum = 0.0;
}
public class MeanReducer implements IReducer<MeanReducerState> {
public MeanReducerState init() {
return new MeanReducerState();
}
public MeanReducerState reduce(MeanReducerState acc, Object input) {
acc.count++;
if (input instanceof Double) {
acc.sum += (Double) input;
} else if (input instanceof Long) {
acc.sum += ((Long) input).doubleValue();
} else if (input instanceof Integer) {
acc.sum += ((Integer) input).doubleValue();
} else {
throw new RuntimeException(
"MeanReducer::reduce called with unsupported input type `"
+ input.getClass()
+ "`. Supported types are Double, Long, Integer.");
}
return acc;
}
public Object extractResult(MeanReducerState acc) {
if (acc.count > 0) {
return new Double(acc.sum / (double) acc.count);
} else {
return null;
}
}
}