package main.java.bolts;
import static main.java.utils.constants.WorkberchConstants.INDEX_FIELD;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import main.java.utils.WorkberchTuple;
import backtype.storm.topology.BasicOutputCollector;
public class WorkberchDotBolt extends WorkberchProvenanceBolt {
private static final long serialVersionUID = 1L;
private final Map<Long, Map<String, Object>> vectorsMap = new HashMap<Long, Map<String, Object>>();
public WorkberchDotBolt(final String guid, final List<String> outputFields) {
super(guid, new ArrayList<String>(outputFields));
}
@Override
public void executeLogic(final WorkberchTuple input, final BasicOutputCollector collector, final boolean lastValue, final String uuid) {
final Long index = Long.valueOf(input.getValues().get(INDEX_FIELD).toString());
final Map<String, Object> value = vectorsMap.containsKey(index) ? vectorsMap.get(index) : new HashMap<String, Object>();
final List<String> notPresentFields = new ArrayList<String>();
notPresentFields.addAll(getOutputFields());
notPresentFields.removeAll(input.getFields());
final List<String> presentFields = new ArrayList<String>();
presentFields.addAll(getOutputFields());
presentFields.removeAll(notPresentFields);
for (final String field : presentFields) {
value.put(field, input.getValues().get(field));
}
if (value.keySet().size() == getOutputFields().size()) {
final List<Object> tupleToEmit = new ArrayList<Object>();
for (final String field : getOutputFields()) {
tupleToEmit.add(value.get(field));
}
emitTuple(tupleToEmit, collector, lastValue, uuid);
vectorsMap.remove(index);
} else {
vectorsMap.put(index, value);
}
}
}