package stormapplied.githubcommits.topology;

import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;

import java.util.HashMap;
import java.util.Map;

public class EmailCounter extends BaseBasicBolt {
  private Map<String, Integer> counts;

  @Override
  public void declareOutputFields(OutputFieldsDeclarer declarer) {
    // This bolt does not emit any values and therefore does not define any output fields.
  }

  @Override
  public void prepare(Map stormConf,
                      TopologyContext context) {
    counts = new HashMap<String, Integer>();
  }

  @Override
  public void execute(Tuple tuple,
                      BasicOutputCollector outputCollector) {
    String email = tuple.getStringByField("email");
    counts.put(email, countFor(email) + 1);
    printCounts();
  }

  private Integer countFor(String email) {
    Integer count = counts.get(email);
    return count == null ? 0 : count;
  }

  /**
   * Print the counts to System.out so you can easily see what's happening.
   */
  private void printCounts() {
    for (String email : counts.keySet()) {
      System.out.println(String.format("%s has count of %s", email, counts.get(email)));
    }
  }
}