package storm.applications.bolt; import backtype.storm.tuple.Fields; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import static storm.applications.constants.VoIPSTREAMConstants.*; import storm.applications.model.cdr.CallDetailRecord; /** * * @author Maycon Viana Bordin <mayconbordin@gmail.com> */ public abstract class AbstractScoreBolt extends AbstractBolt { protected static enum Source { ECR, RCR, ECR24, ENCR, CT24, VD, FOFIR, ACD, GACD, URL, NONE } protected double thresholdMin; protected double thresholdMax; protected String configPrefix; protected Map<String, Entry> map; public AbstractScoreBolt(String configPrefix) { this.configPrefix = configPrefix; } @Override public Fields getDefaultFields() { return new Fields(Field.CALLING_NUM, Field.TIMESTAMP, Field.SCORE, Field.RECORD); } @Override public void initialize() { map = new HashMap<>(); // parameters if (configPrefix != null) { thresholdMin = config.getDouble(String.format(Conf.SCORE_THRESHOLD_MIN, configPrefix)); thresholdMax = config.getDouble(String.format(Conf.SCORE_THRESHOLD_MAX, configPrefix)); } } protected abstract Source[] getFields(); protected static Source parseComponentId(String id) { if (id.equals(Component.VARIATION_DETECTOR)) return Source.VD; else if (id.equals(Component.ECR24)) return Source.ECR24; else if (id.equals(Component.CT24)) return Source.CT24; else if (id.equals(Component.ECR)) return Source.ECR; else if (id.equals(Component.RCR)) return Source.RCR; else if (id.equals(Component.ENCR)) return Source.ENCR; else if (id.equals(Component.ACD)) return Source.ACD; else if (id.equals(Component.GLOBAL_ACD)) return Source.GACD; else if (id.equals(Component.URL)) return Source.URL; else if (id.equals(Component.FOFIR)) return Source.FOFIR; else return Source.NONE; } protected static double score(double v1, double v2, double vi) { double score = vi/(v1 + (v2-v1)); if (score < 0) score = 0; if (score > 1) score = 1; return score; } protected class Entry { public CallDetailRecord cdr; public Source[] fields; public double[] values; public Entry(CallDetailRecord cdr) { this.cdr = cdr; this.fields = getFields(); values = new double[fields.length]; Arrays.fill(values, Double.NaN); } public void set(Source src, double rate) { values[pos(src)] = rate; } public double get(Source src) { return values[pos(src)]; } public boolean isFull() { for (double value : values) if (Double.isNaN(value)) return false; return true; } private int pos(Source src) { for (int i=0; i<fields.length; i++) if (fields[i] == src) return i; return -1; } public double[] getValues() { return values; } @Override public String toString() { return "Entry{" + "cdr=" + cdr + ", fields=" + Arrays.toString(fields) + ", values=" + Arrays.toString(values) + '}'; } } }