package com.griddynamics.jagger.dbapi.provider;
import com.google.common.collect.Multimap;
import com.griddynamics.jagger.dbapi.dto.MetricNameDto;
import com.griddynamics.jagger.dbapi.dto.TaskDataDto;
import com.griddynamics.jagger.dbapi.parameter.DefaultMonitoringParameters;
import com.griddynamics.jagger.dbapi.parameter.GroupKey;
import com.griddynamics.jagger.dbapi.util.CommonUtils;
import com.griddynamics.jagger.dbapi.util.DataProcessingUtil;
import com.griddynamics.jagger.dbapi.util.FetchUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* User: kgribov
* Date: 7/12/13
* Time: 1:45 PM
*/
@Component
public class CustomMetricPlotNameProvider {
private Logger log = LoggerFactory.getLogger(CustomMetricPlotNameProvider.class);
private FetchUtil fetchUtil;
private Map<GroupKey, DefaultMonitoringParameters[]> monitoringPlotGroups;
private EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Autowired
public void setFetchUtil(FetchUtil fetchUtil) {
this.fetchUtil = fetchUtil;
}
@Resource
public void setMonitoringPlotGroups(Map<GroupKey, DefaultMonitoringParameters[]> monitoringPlotGroups) {
this.monitoringPlotGroups = monitoringPlotGroups;
}
public Set<MetricNameDto> getPlotNames(List<TaskDataDto> taskDataDtos) {
final long temp = System.currentTimeMillis();
Set<MetricNameDto> result = new HashSet<>();
result.addAll(getPlotNamesNewModel(taskDataDtos));
result.addAll(getTestGroupPlotNamesNewModel(taskDataDtos));
log.debug("{} ms spent to fetch custom metrics plots names in count of {}", System.currentTimeMillis() - temp, result.size());
return result;
}
public Set<MetricNameDto> getPlotNamesNewModel(List<TaskDataDto> taskDataDtos) {
try {
Set<Long> testIds = CommonUtils.getTestsIds(taskDataDtos);
List<Object[]> plotNamesNew = getMetricNames(testIds);
if (plotNamesNew.isEmpty()) {
return Collections.emptySet();
}
Set<MetricNameDto> result = new HashSet<>(plotNamesNew.size());
for (Object[] plotName : plotNamesNew) {
if (plotName != null) {
for (TaskDataDto tdd : taskDataDtos) {
if (tdd.getIds().contains((Long) plotName[2])) {
String metricName = (String) plotName[0];
MetricNameDto metricNameDto = new MetricNameDto(tdd, metricName, (String) plotName[1], MetricNameDto.Origin.METRIC);
result.add(metricNameDto);
}
}
}
}
return result;
} catch (PersistenceException e) {
log.debug("Could not fetch metric plot names from MetricPointEntity: {}", DataProcessingUtil.getMessageFromLastCause(e));
return Collections.emptySet();
}
}
public Set<MetricNameDto> getTestGroupPlotNamesNewModel(List<TaskDataDto> tests) {
try {
Set<Long> testIds = CommonUtils.getTestsIds(tests);
Multimap<Long, Long> testGroupMap = fetchUtil.getTestGroupIdsByTestIds(testIds);
List<Object[]> plotNamesNew = getMetricNames(testGroupMap.keySet());
plotNamesNew = CommonUtils.filterMonitoring(plotNamesNew, monitoringPlotGroups);
if (plotNamesNew.isEmpty()) {
return Collections.emptySet();
}
Set<MetricNameDto> result = new HashSet<>(plotNamesNew.size());
for (Object[] mde : plotNamesNew) {
for (TaskDataDto td : tests) {
Collection<Long> allTestsInGroup = testGroupMap.get((Long) mde[2]);
if (CommonUtils.containsAtLeastOne(td.getIds(), allTestsInGroup)) {
result.add(new MetricNameDto(td, (String) mde[0], (String) mde[1], MetricNameDto.Origin.TEST_GROUP_METRIC));
// we should create new MetricNameDto with another origin, because we need it for Session Scope plots
result.add(new MetricNameDto(td, (String) mde[0], (String) mde[1], MetricNameDto.Origin.SESSION_SCOPE_TG));
}
}
}
return result;
} catch (PersistenceException e) {
log.debug("Could not fetch test-group metric plot names from MetricPointEntity: {}", DataProcessingUtil.getMessageFromLastCause(e));
return Collections.emptySet();
}
}
private List<Object[]> getMetricNames(Set<Long> testIds) {
if (testIds.isEmpty()) {
return Collections.emptyList();
}
return entityManager.createQuery(
"select mpe.metricDescription.metricId, mpe.metricDescription.displayName, mpe.metricDescription.taskData.id " +
"from MetricPointEntity as mpe where mpe.metricDescription.taskData.id in (:taskIds) group by mpe.metricDescription.id")
.setParameter("taskIds", testIds)
.getResultList();
}
}