/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg.referencedata.statistics;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import com.google.common.base.Supplier;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps;
import com.opengamma.util.tuple.LongObjectPair;
/**
* A snapshot of the statistics.
*/
public class Snapshot {
private final long _totalLookups;
private final List<LongObjectPair<String>> _lookupsBySecurity;
private final List<LongObjectPair<String>> _lookupsByField;
public Snapshot(Map<String, Long> lookupsBySecurity,
Map<String, Long> lookupsByField) {
super();
_lookupsByField = reverseOrder(lookupsByField);
_lookupsBySecurity = reverseOrder(lookupsBySecurity);
//Assume that fields is smaller than security
long lookups = 0;
for (LongObjectPair<String> point : _lookupsByField) {
lookups += point.getFirstLong();
}
_totalLookups = lookups;
}
private static final Supplier<ArrayList<String>> ARRAY_LIST_SUPPLIER = new Supplier<ArrayList<String>>() {
@Override
public ArrayList<String> get() {
return new ArrayList<String>();
}
};
private static final Comparator<Long> DESCENDING_COMPARATOR = new Comparator<Long>() {
@Override
public int compare(Long o1, Long o2) {
return o2.compareTo(o1);
}
};
private List<LongObjectPair<String>> reverseOrder(Map<String, Long> forward) {
ListMultimap<Long, String> index = index(forward);
int size = forward.size();
return flatten(index, size);
}
private List<LongObjectPair<String>> flatten(ListMultimap<Long, String> index, int size) {
List<LongObjectPair<String>> reverse = new ArrayList<LongObjectPair<String>>(size);
for (Entry<Long, String> entry : index.entries()) {
reverse.add(LongObjectPair.of((long) entry.getKey(), entry.getValue()));
}
return reverse;
}
private ListMultimap<Long, String> index(Map<String, Long> forward) {
ListMultimap<Long, String> index = Multimaps.newListMultimap(new TreeMap<Long, Collection<String>>(DESCENDING_COMPARATOR), ARRAY_LIST_SUPPLIER);
for (Entry<String, Long> e : forward.entrySet()) {
index.put(e.getValue(), e.getKey());
}
return index;
}
public long getTotalLookups() {
return _totalLookups;
}
public long getDistinctSecurities() {
return _lookupsBySecurity.size();
}
/**
* Gets the distinctFields field.
* @return the distinctFields
*/
public long getDistinctFields() {
return _lookupsByField.size();
}
public List<LongObjectPair<String>> getLookupsBySecurity() {
return _lookupsBySecurity;
}
public List<LongObjectPair<String>> getLookupsByField() {
return _lookupsByField;
}
}