package storm.applications.bolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import java.util.List;
import static storm.applications.constants.SmartGridConstants.*;
import storm.applications.util.window.SlidingWindow;
import storm.applications.util.window.SlidingWindowCallback;
import storm.applications.util.window.SlidingWindowEntry;
/**
* Author: Thilina
* Date: 11/22/14
*/
public class SmartGridSlidingWindowBolt extends AbstractBolt {
private SlidingWindow window;
@Override
public void initialize() {
window = new SlidingWindow(1 * 60 * 60);
}
@Override
public void execute(Tuple tuple) {
int type = tuple.getIntegerByField(Field.PROPERTY);
// we are interested only in load
if (type == Measurement.WORK) {
return;
}
SlidingWindowEntryImpl windowEntry = new SlidingWindowEntryImpl(
tuple.getLongByField(Field.TIMESTAMP), tuple.getDoubleByField(Field.VALUE),
tuple.getStringByField(Field.HOUSE_ID), tuple.getStringByField(Field.HOUSEHOLD_ID),
tuple.getStringByField(Field.PLUG_ID));
window.add(windowEntry, new SlidingWindowCallback() {
@Override
public void remove(List<SlidingWindowEntry> entries) {
for (SlidingWindowEntry e : entries) {
SlidingWindowEntryImpl entry = (SlidingWindowEntryImpl) e;
collector.emit(new Values(entry.ts, entry.houseId, entry.houseHoldId,
entry.plugId, entry.value, SlidingWindowAction.REMOVE));
}
}
});
collector.emit(new Values(windowEntry.ts, windowEntry.houseId, windowEntry.houseHoldId,
windowEntry.plugId, windowEntry.value, SlidingWindowAction.ADD));
}
@Override
public Fields getDefaultFields() {
return new Fields(Field.TIMESTAMP, Field.HOUSE_ID, Field.HOUSEHOLD_ID,
Field.PLUG_ID, Field.VALUE, Field.SLIDING_WINDOW_ACTION);
}
private class SlidingWindowEntryImpl implements SlidingWindowEntry {
private String houseId;
private String houseHoldId;
private String plugId;
private long ts;
private double value;
private SlidingWindowEntryImpl(long ts, double value, String houseId,
String houseHoldId, String plugId) {
this.ts = ts;
this.value = value;
this.houseId = houseId;
this.houseHoldId = houseHoldId;
this.plugId = plugId;
}
@Override
public long getTime() {
return ts;
}
}
}