package org.act.tstream.stats; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.act.tstream.callback.RunnableCallback; import org.act.tstream.common.stats.StatBuckets; import org.act.tstream.stats.incval.IncValExtractor; import org.act.tstream.stats.incval.IncValMerger; import org.act.tstream.stats.incval.IncValUpdater; import org.act.tstream.stats.keyAvg.KeyAvgExtractor; import org.act.tstream.stats.keyAvg.KeyAvgMerge; import org.act.tstream.stats.keyAvg.KeyAvgUpdater; import org.act.tstream.stats.rolling.RollingWindowSet; import org.act.tstream.utils.JStormUtils; import org.act.tstream.utils.Pair; public class StatFunction { public static final Integer NUM_STAT_BUCKETS = StatBuckets.NUM_STAT_BUCKETS; /** * create simple counter statics * * @param num_buckets * @param bucket_sizes * @return */ public static RollingWindowSet keyed_counter_rolling_window_set( int num_buckets, Integer[] bucket_sizes) { RunnableCallback updater = new IncValUpdater(); RunnableCallback merger = new IncValMerger(); RunnableCallback extractor = new IncValExtractor(); return RollingWindowSet.rolling_window_set(updater, merger, extractor, num_buckets, bucket_sizes); } /** * create averge statics * * @param num_buckets * @param bucket_sizes * @return */ public static RollingWindowSet keyed_avg_rolling_window_set( int num_buckets, Integer[] bucket_sizes) { RunnableCallback updater = new KeyAvgUpdater(); RunnableCallback merger = new KeyAvgMerge(); RunnableCallback extractor = new KeyAvgExtractor(); return RollingWindowSet.rolling_window_set(updater, merger, extractor, num_buckets, bucket_sizes); } public static void incr_val(Map<Object, Long> map, Object key, Long amt) { Long value = Long.valueOf(0); if (map.containsKey(key)) { value = map.get(key); } value = (Long) JStormUtils.add(value, amt); map.put(key, value); } public static void incr_val(Map<Object, Long> map, Object key) { incr_val(map, key, Long.valueOf(1)); } public static synchronized Pair<Long, Long> update_avg( Pair<Long, Long> curr, long val) { curr.setFirst(curr.getFirst() + val); curr.setSecond(curr.getSecond() + 1); return curr; } public static Pair<Long, Long> merge_avg(List<Pair<Long, Long>> avg) { Pair<Long, Long> rtn = new Pair<Long, Long>(0l, 0l); for (Pair<Long, Long> p : avg) { rtn.setFirst(rtn.getFirst() + p.getFirst()); rtn.setSecond(rtn.getSecond() + p.getSecond()); } return rtn; } public static double extract_avg(Pair<Long, Long> p) { if (p.getSecond() == 0) { return 0d; } return (p.getFirst() * 1.0) / p.getSecond(); } public static void update_keyed_avg(Map<Object, Pair<Long, Long>> map, Object key, long val) { Pair<Long, Long> p = map.get(key); if (p == null) { p = new Pair<Long, Long>(0l, 0l); } update_avg(p, val); map.put(key, p); } public static Pair<Long, Long> merge_keyed_avg(List<Pair<Long, Long>> avg) { return merge_avg(avg); } public static Map<Object, Double> extract_key_avg( Map<Object, Pair<Long, Long>> map) { Map<Object, Double> rtn = new HashMap<Object, Double>(); if (map != null) { for (Entry<Object, Pair<Long, Long>> e : map.entrySet()) { rtn.put(e.getKey(), extract_avg(e.getValue())); } } return rtn; } public static Map<Object, Long> counter_extract(Map<Object, Long> v) { if (v == null) { return new HashMap<Object, Long>(); } return v; } }