package com.griddynamics.jagger.dbapi.provider; import com.griddynamics.jagger.dbapi.dto.MetricNameDto; import com.griddynamics.jagger.dbapi.dto.TaskDataDto; import com.griddynamics.jagger.dbapi.util.DataProcessingUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceException; import java.math.BigInteger; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @Component public class ValidatorNamesProvider implements MetricNameProvider { private Logger log = LoggerFactory.getLogger(ValidatorNamesProvider.class); private EntityManager entityManager; @PersistenceContext public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } @Override public Set<MetricNameDto> getMetricNames(List<TaskDataDto> tests) { Set<Long> taskIds = new HashSet<>(); Set<String> sessionIds = new HashSet<>(); for (TaskDataDto tdd : tests) { taskIds.addAll(tdd.getIds()); sessionIds.addAll(tdd.getSessionIds()); } long temp = System.currentTimeMillis(); Set<MetricNameDto> validators = getValidatorsNamesNewModel(tests); if (validators == null) { // some exception occured List<Object[]> validatorNames = entityManager.createNativeQuery( "SELECT v.validator, selected.taskdataID FROM ValidationResultEntity v JOIN " + "(" + " SELECT wd.workloaddataID, td.taskdataID FROM " + " ( " + " SELECT wd.id AS workloaddataID, wd.taskId, wd.sessionId FROM WorkloadData wd WHERE wd.sessionId IN (:sessionIds)" + " ) AS wd JOIN " + " ( " + " SELECT td.id AS taskdataID, td.taskId, td.sessionId FROM TaskData td WHERE td.id IN (:taskIds)" + " ) AS td ON wd.taskId=td.taskId AND wd.sessionId=td.sessionId" + ") AS selected ON v.workloadData_id=selected.workloaddataID") .setParameter("taskIds", taskIds) .setParameter("sessionIds", sessionIds) .getResultList(); log.debug("{} ms spent for fetching {} validators", System.currentTimeMillis() - temp, validatorNames.size()); validators = new HashSet<>(validatorNames.size()); for (Object[] name : validatorNames) { if (name == null || name[0] == null) continue; for (TaskDataDto td : tests) { if (td.getIds().contains(((BigInteger) name[1]).longValue())) { MetricNameDto metric = new MetricNameDto(); metric.setTest(td); metric.setMetricName((String) name[0]); metric.setOrigin(MetricNameDto.Origin.VALIDATOR); validators.add(metric); break; } } } } return validators; } public Set<MetricNameDto> getValidatorsNamesNewModel(List<TaskDataDto> tests) { try { Set<Long> taskIds = new HashSet<>(); Set<String> sessionIds = new HashSet<>(); for (TaskDataDto tdd : tests) { taskIds.addAll(tdd.getIds()); sessionIds.addAll(tdd.getSessionIds()); } long temp = System.currentTimeMillis(); List<Object[]> validatorNames = entityManager.createNativeQuery( "SELECT v.validator, selected.taskdataID, v.displayName FROM ValidationResultEntity v JOIN " + "(" + " SELECT wd.workloaddataID, td.taskdataID FROM " + " ( " + " SELECT wd.id AS workloaddataID, wd.taskId, wd.sessionId FROM WorkloadData wd WHERE wd.sessionId IN (:sessionIds)" + " ) AS wd JOIN " + " ( " + " SELECT td.id AS taskdataID, td.taskId, td.sessionId FROM TaskData td WHERE td.id IN (:taskIds)" + " ) AS td ON wd.taskId=td.taskId AND wd.sessionId=td.sessionId" + ") AS selected ON v.workloadData_id=selected.workloaddataID") .setParameter("taskIds", taskIds) .setParameter("sessionIds", sessionIds) .getResultList(); log.debug("{} ms spent for fetching {} validators", System.currentTimeMillis() - temp, validatorNames.size()); if (validatorNames.isEmpty()) { return Collections.emptySet(); } Set<MetricNameDto> validators = new HashSet<>(validatorNames.size()); for (Object[] name : validatorNames) { if (name == null || name[0] == null) continue; for (TaskDataDto td : tests) { if (td.getIds().contains(((BigInteger) name[1]).longValue())) { MetricNameDto metric = new MetricNameDto(); metric.setTest(td); metric.setMetricName((String) name[0]); metric.setMetricDisplayName((String) name[2]); metric.setOrigin(MetricNameDto.Origin.VALIDATOR); validators.add(metric); break; } } } return validators; } catch (PersistenceException e) { log.debug("Could not fetch validators names from new model of ValidationResultEntity: {}", DataProcessingUtil.getMessageFromLastCause(e)); return null; } } }