public static Average getInstanceAverage(List<Event> events)
{
assert events.size()>0 : "Empty event list";
assert events.size()%2==0 : "Parity error: "+events.size() +" events. Every event should have closing counterpart!";
Average stat = new Average(events.get(0).getProcessDefinitionID());
Map<String, Long> duration = new HashMap<String,Long>(events.size()/2);
for(Event e : events)
{
String processInstance = e.getProcessInstanceID();
Long l0 = duration.get(processInstance);
if(l0!=null)
{
long l1 = e.getTimestamp();
if(l0<l1)
duration.put(processInstance, (l1-l0)); // not necessarily in order
else
duration.put(processInstance, (l0-l1));
}
else
{
duration.put(processInstance, e.getTimestamp());
}
}
long sum = 0;
for(String processInstance : duration.keySet())
{
long l3 = duration.get(processInstance);
if(stat.getMin()==-1) // first iteration
stat.setMin(l3);
else if(l3<stat.getMin())
stat.setMin(l3);
else if(l3>stat.getMax())
stat.setMax(l3);
sum+=l3;
}
stat.setAvg(sum/duration.entrySet().size());
return stat;
}