package com.griddynamics.jagger.dbapi.fetcher;
import com.griddynamics.jagger.dbapi.dto.MetricNameDto;
import com.griddynamics.jagger.dbapi.util.DataProcessingUtil;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Component
public class CustomMetricPlotFetcher extends AbstractMetricPlotFetcher {
@Override
protected Collection<MetricRawData> getAllRawData(List<MetricNameDto> metricNames) {
Set<String> metricIds = new HashSet<>();
Set<Long> taskIds = new HashSet<>();
for (MetricNameDto metricName : metricNames) {
metricIds.add(metricName.getMetricName());
taskIds.addAll(metricName.getTaskIds());
}
List<Object[]> rawData = getRawData(taskIds, metricIds);
if (rawData.isEmpty()) {
log.warn("No plot data found for metrics {} within taskData ids {}", metricIds, taskIds);
return Collections.emptyList();
}
List<MetricRawData> resultList = new ArrayList<>();
for (Object[] objects : rawData) {
MetricRawData metricRawData = new MetricRawData();
metricRawData.setWorkloadTaskDataId(((Number) objects[0]).longValue());
metricRawData.setTime((Long) objects[1]);
metricRawData.setValue((Double) objects[2]);
metricRawData.setSessionId((String) objects[3]);
metricRawData.setMetricId((String) objects[4]);
resultList.add(metricRawData);
}
return resultList;
}
/**
* @return collection of objects {Task Data id, time, value, sessionId, metricId}
*/
protected List<Object[]> getRawData(Set<Long> taskDataIds, Set<String> metricIds) {
if (taskDataIds.isEmpty() || metricIds.isEmpty()) {
log.warn("Empty data for getRawData() method {}; {}" + taskDataIds, metricIds);
return Collections.emptyList();
}
List<Object[]> resultList = new ArrayList<>();
resultList.addAll(getPlotDataNewModel(taskDataIds, metricIds));
return resultList;
}
/**
* @return collection of objects {Task Data id, time, value, sessionId, metricId}
*/
protected Collection<? extends Object[]> getPlotDataNewModel(Set<Long> taskIds, Set<String> metricIds) {
try {
return entityManager.createQuery(
"SELECT mpe.metricDescription.taskData.id, mpe.time, mpe.value, mpe.metricDescription.taskData.sessionId, " +
"mpe.metricDescription.metricId " +
"from MetricPointEntity AS mpe " +
"WHERE mpe.metricDescription.taskData.id IN (:taskIds) " +
"AND mpe.metricDescription.metricId IN (:metricIds)")
.setParameter("taskIds", taskIds)
.setParameter("metricIds", metricIds)
.getResultList();
} catch (Exception e) {
log.debug("Could not fetch metric plots from MetricPointEntity: ", DataProcessingUtil.getMessageFromLastCause(e));
return Collections.emptyList();
}
}
}