package com.xavient.dip.storm.bolt;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.xavient.dip.storm.utils.TuplesOrdering;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class TopNUsersWithMaxFollowers extends DataIngestionBolt {
private static final long serialVersionUID = 588968842105801987L;
@SuppressWarnings({ "rawtypes" })
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
super.prepare(stormConf, context, collector);
this.batchSize = rankMaxThreshold * 3;
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("tableName", "username", "count"));
}
@Override
protected void finishBatch() {
List<Tuple> _tuples = new ArrayList<Tuple>();
queue.drainTo(_tuples);
Set<Tuple> tuples = new TreeSet<>(new TuplesOrdering("followersCount"));
tuples.addAll(_tuples);
tuples = tuples.size() > rankMaxThreshold ? ImmutableSet.copyOf(Iterables.limit(tuples, rankMaxThreshold))
: tuples;
for (Tuple tuple : tuples) {
collector.emit(new Values("user_followers", tuple.getStringByField("username"),
tuple.getIntegerByField("followersCount")));
collector.ack(tuple);
}
}
}