package storm.applications.bolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; import storm.applications.constants.SmartGridConstants.Field; import storm.applications.constants.SmartGridConstants.SlidingWindowAction; import storm.applications.util.math.RunningMedianCalculator; /** * * @author mayconbordin */ public class GlobalMedianCalculatorBolt extends AbstractBolt { private RunningMedianCalculator medianCalc; private long lastUpdatedTs; @Override public void initialize() { medianCalc = new RunningMedianCalculator(); } @Override public Fields getDefaultFields() { return new Fields(Field.TIMESTAMP, Field.GLOBAL_MEDIAN_LOAD); } @Override public void execute(Tuple tuple) { int operation = tuple.getIntegerByField(Field.SLIDING_WINDOW_ACTION); double value = tuple.getDoubleByField(Field.VALUE); long timestamp = tuple.getLongByField(Field.TIMESTAMP); if (operation == SlidingWindowAction.ADD){ double median = medianCalc.getMedian(value); if (lastUpdatedTs < timestamp) { // the sliding window has moved lastUpdatedTs = timestamp; collector.emit(new Values(timestamp, median)); } } else { medianCalc.remove(value); } } }