package com.intuit.tank.reporting.local;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Nonnull;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.reporting.api.TPSInfo;
import com.intuit.tank.reporting.api.TPSInfoContainer;
import com.intuit.tank.results.TankResult;
public final class ResultsStorage {
private static final Logger LOG = LogManager.getLogger(ResultsStorage.class);
private static ResultsStorage instance = new ResultsStorage();
private Map<String, Map<String, List<TankResult>>> timingResultMap = new ConcurrentHashMap<String, Map<String, List<TankResult>>>();
private Map<String, Map<String, List<TPSInfoContainer>>> tpsMap = new ConcurrentHashMap<String, Map<String, List<TPSInfoContainer>>>();
private ResultsStorage() {
// private constructor to implement singleton pattern
}
public static final ResultsStorage instance() {
return instance;
}
/**
*
* @param jobId
* @param results
*/
public void storeTimingResults(@Nonnull String jobId, @Nonnull String instanceId, List<TankResult> results) {
if (results != null && !results.isEmpty()) {
Map<String, List<TankResult>> map = timingResultMap.get(jobId);
if (map == null) {
map = new ConcurrentHashMap<String, List<TankResult>>();
timingResultMap.put(jobId, map);
}
List<TankResult> list = map.get(instanceId);
if (list == null) {
list = new ArrayList<TankResult>();
map.put(instanceId, list);
}
list.addAll(results);
}
}
/**
*
* @param jobId
* @param results
*/
public void storeTpsResults(@Nonnull String jobId, @Nonnull String instanceId, TPSInfoContainer container) {
if (container != null) {
LOG.info("Storing results for job: " + jobId + " instance: " + instanceId);
Map<String, List<TPSInfoContainer>> map = tpsMap.get(jobId);
if (map == null) {
map = new ConcurrentHashMap<String, List<TPSInfoContainer>>();
tpsMap.put(jobId, map);
LOG.info("Creating Map for job: " + jobId);
}
List<TPSInfoContainer> list = map.get(instanceId);
if (list == null) {
list = new ArrayList<TPSInfoContainer>();
map.put(instanceId, list);
LOG.info("Creating List for instance: " + instanceId);
}
list.add(container);
}
}
/**
*
* @param jobId
* @return
*/
public List<TankResult> getAllTimingResults(String jobId) {
List<TankResult> ret = new ArrayList<TankResult>();
Map<String, List<TankResult>> map = timingResultMap.get(jobId);
if (map != null) {
for (List<TankResult> r : map.values()) {
ret.addAll(r);
}
}
return ret;
}
public void deleteForJob(String jobId) {
timingResultMap.remove(jobId);
}
public Map<Date, Map<String, TPSInfo>> getTpsMapForJob(Date minDate, String... jobId) {
List<TPSInfoContainer> containers = new ArrayList<TPSInfoContainer>();
for (String id : jobId) {
Map<String, List<TPSInfoContainer>> map = tpsMap.get(id);
if (map != null) {
for (List<TPSInfoContainer> list : map.values()) {
containers.addAll(list);
}
}
}
LOG.info("Have " + containers.size() + " containers for jobs " + Arrays.toString(jobId));
return getTpsMapForJob(minDate, containers);
}
public Map<Date, Map<String, TPSInfo>> getTpsMapForInstance(Date minDate, String jobId, String instanceId) {
List<TPSInfoContainer> containers = new ArrayList<TPSInfoContainer>();
Map<String, List<TPSInfoContainer>> map = tpsMap.get(jobId);
if (map != null) {
List<TPSInfoContainer> list = map.get(instanceId);
if (list != null) {
containers.addAll(list);
}
}
LOG.info("Have " + containers.size() + " containers for job " + jobId + " and instance " + instanceId);
return getTpsMapForJob(minDate, containers);
}
private Map<Date, Map<String, TPSInfo>> getTpsMapForJob(Date minDate, List<TPSInfoContainer> conatiners) {
Map<Date, Map<String, TPSInfo>> ret = new HashMap<Date, Map<String, TPSInfo>>();
for (TPSInfoContainer container : conatiners) {
for (TPSInfo info : container.getTpsInfos()) {
if (minDate != null && info.getTimestamp().getTime() >= minDate.getTime()) {
Map<String, TPSInfo> map = ret.get(info.getTimestamp());
if (map == null) {
map = new HashMap<String, TPSInfo>();
ret.put(info.getTimestamp(), map);
}
TPSInfo existing = map.get(info.getKey());
if (existing != null) {
info = existing.add(info);
}
map.put(info.getKey(), info);
}
}
}
return ret;
}
}