package timeflow.data.analysis; import timeflow.util.*; import timeflow.data.time.*; import timeflow.data.analysis.DBAnalysis.InterestLevel; import timeflow.data.db.*; import java.util.*; public class FrequencyAnalysis implements FieldAnalysis { String[] description; @Override public String getName() { return "Frequency Of Values"; } @Override public String[] getResultDescription() { return description; } @Override public InterestLevel perform(ActList acts, Field field) { Bag bag=new Bag(); if (field.getType()==String[].class) { for (Act a: acts) { String[] tags=a.getTextList(field); if (tags!=null) for (String tag:tags) bag.add(tag); } } else for (Act a: acts) bag.add(a.get(field)); int numItems=acts.size(); int numDistinctVals=bag.size(); int numNullVals=bag.num(null)+bag.num(""); if (numItems==numDistinctVals) description=new String[] {"All values are defined and unique."}; else if (numItems==numDistinctVals+numNullVals-1) description=new String[] {"All defined values are unique."}; else if (numDistinctVals==1) description=new String[] {"This field is always equal to "+string(bag.list().get(0))}; else if (numDistinctVals<4) { List all=bag.list(); description=new String[] {"This field takes only "+all.size()+" values.", "which are: "+all}; } else { List all=bag.list(); description=new String[] {"There are "+numDistinctVals+" distinct values.", "Most common: \""+string(all.get(0))+"\", occurring "+bag.num(all.get(0))+" times."}; } return InterestLevel.INTERESTING; } private static String[] empty=new String[0]; static String string(Object o) { if (o==null || "".equals(o) || empty.equals(o)) return "[missing]"; return o.toString(); } @Override public boolean canHandleType(Class type) { return type==Double.class || type==String.class || type==String[].class; } }