1 package com.griddynamics.jagger.engine.e1.services;
3 import com.griddynamics.jagger.coordinator.NodeContext;
4 import com.griddynamics.jagger.dbapi.DatabaseService;
5 import com.griddynamics.jagger.dbapi.dto.*;
6 import com.griddynamics.jagger.dbapi.model.MetricNode;
7 import com.griddynamics.jagger.dbapi.model.RootNode;
8 import com.griddynamics.jagger.dbapi.model.TestDetailsNode;
9 import com.griddynamics.jagger.dbapi.model.TestNode;
10 import com.griddynamics.jagger.dbapi.util.SessionMatchingSetup;
11 import com.griddynamics.jagger.engine.e1.services.data.service.*;
27 private DatabaseService databaseService;
30 private final SessionMatchingSetup SESSION_MATCHING_SETUP =
new SessionMatchingSetup(
false, Collections.<SessionMatchingSetup.MatchBy>emptySet());
33 databaseService = context.getService(DatabaseService.class);
37 this.databaseService = databaseService;
42 Set<SessionEntity> sessions =
getSessions(Arrays.asList(sessionId));
43 if (sessions.isEmpty()) {
46 return sessions.iterator().next();
50 public Set<SessionEntity>
getSessions(Collection<String> sessionIds) {
52 List<SessionDataDto> sessionDataDtoList = databaseService.getSessionInfoService().getBySessionIds(0, sessionIds.size(),
new HashSet<String>(sessionIds));
54 if (sessionDataDtoList.isEmpty()) {
55 return Collections.emptySet();
58 Set<SessionEntity> entities =
new TreeSet<>(
new SessionEntity.IdComparator());
59 for (SessionDataDto sessionDataDto : sessionDataDtoList) {
61 sessionEntity.
setId(sessionDataDto.getSessionId());
62 sessionEntity.
setStartDate(sessionDataDto.getStartDate());
63 sessionEntity.
setEndDate(sessionDataDto.getEndDate());
64 sessionEntity.
setKernels(sessionDataDto.getActiveKernelsCount());
65 sessionEntity.
setComment(sessionDataDto.getComment());
67 entities.add(sessionEntity);
79 public Set<TestEntity>
getTests(String sessionId) {
80 Map<String, Set<TestEntity>> map =
getTests(Arrays.asList(sessionId));
82 Set<TestEntity> result = map.get(sessionId);
87 return Collections.emptySet();
91 public Map<String, Set<TestEntity>>
getTests(Collection<String> sessionIds) {
102 Map<String, TestEntity> map =
getTestsByName(Collections.singletonList(sessionId), testName);
105 if (result != null) {
113 public Map<String, TestEntity>
getTestsByName(Collection<String> sessionIds, String testName) {
114 Map<String, Set<TestEntity>> tests =
getTestsWithName(sessionIds, testName, SESSION_MATCHING_SETUP);
116 Map<String, TestEntity> result =
new HashMap<String, TestEntity>(tests.size());
118 for (Map.Entry<String, Set<TestEntity>> entry : tests.entrySet()) {
119 Set<TestEntity> testEntities = entry.getValue();
120 if (!testEntities.isEmpty()) {
121 result.put(entry.getKey(), testEntities.iterator().next());
130 public Map<String, Set<TestEntity>>
getTestsWithName(Collection<String> sessionIds, String testName, SessionMatchingSetup sessionMatchingSetup) {
131 if (sessionIds.isEmpty()) {
132 return Collections.emptyMap();
136 List<TaskDataDto> taskDataDtoList = databaseService.getTaskDataForSessions(
new HashSet<String>(sessionIds), sessionMatchingSetup);
138 Map<TaskDataDto, Map<String, TestInfoDto>> testInfoMap = databaseService.getTestInfoByTaskDataDto(taskDataDtoList);
140 Set<Long> ids =
new HashSet<Long>();
141 for (TaskDataDto taskDataDto : taskDataDtoList) {
142 ids.addAll(taskDataDto.getIds());
144 Map<Long, TaskDecisionDto> idToDecisionPerTest =
new HashMap<Long, TaskDecisionDto>();
145 for (TaskDecisionDto taskDecisionDto : databaseService.getDecisionsPerTask(ids)) {
146 idToDecisionPerTest.put(taskDecisionDto.getId(), taskDecisionDto);
149 Map<String, Set<TestEntity>> result =
new HashMap<String, Set<TestEntity>>();
151 for (TaskDataDto taskDataDto : taskDataDtoList) {
152 for (Map.Entry<Long, String> entry : taskDataDto.getIdToSessionId().entrySet()) {
153 if (((testName != null) && (testName.equals(taskDataDto.getTaskName()))) ||
154 (testName == null)) {
155 Long testId = entry.getKey();
156 String sessionId = entry.getValue();
159 testEntity.
setId(testId);
161 testEntity.
setName(taskDataDto.getTaskName());
164 if (testInfoMap.containsKey(taskDataDto)) {
165 TestInfoDto testInfoDto = testInfoMap.get(taskDataDto).entrySet().iterator().next().getValue();
166 testEntity.
setLoad(testInfoDto.getClock());
174 if (idToDecisionPerTest.containsKey(testId)) {
175 testEntity.
setDecision(idToDecisionPerTest.get(testId).getDecision());
178 if (result.containsKey(sessionId)) {
179 result.get(sessionId).add(testEntity);
181 Set<TestEntity> testEntitySet =
new HashSet<TestEntity>();
182 testEntitySet.add(testEntity);
183 result.put(sessionId, testEntitySet);
190 for (String sessionId : sessionIds) {
191 if (!result.containsKey(sessionId)) {
192 result.put(sessionId, Collections.<
TestEntity>emptySet());
203 Set<MetricEntity> result = map.get(testId);
204 if (result != null) {
208 return Collections.emptySet();
215 Set<MetricEntity> result = map.get(test);
216 if (result != null) {
220 return Collections.emptySet();
225 Map<Long, TestEntity> map =
new HashMap<Long, TestEntity>(tests.size());
226 Set<Long> ids =
new HashSet<Long>(tests.size());
229 map.put(test.getId(), test);
230 ids.add(test.getId());
235 Map<TestEntity, Set<MetricEntity>> result =
new HashMap<TestEntity, Set<MetricEntity>>();
237 for (Long key : map.keySet()) {
238 result.put(map.get(key), metrics.get(key));
246 if (testIds.isEmpty()) {
247 return Collections.emptyMap();
251 List<String> sessionIds = databaseService.getSessionIdsByTaskIds(
new HashSet<Long>(testIds));
254 SessionMatchingSetup sessionMatchingSetup =
new SessionMatchingSetup(
false, Collections.<SessionMatchingSetup.MatchBy>emptySet());
255 RootNode rootNode = databaseService.getControlTreeForSessions(
new HashSet<String>(sessionIds), sessionMatchingSetup);
258 List<TestNode> summaryNodeTests =
new ArrayList<TestNode>();
259 List<TestDetailsNode> detailsNodeTests =
new ArrayList<TestDetailsNode>();
261 for (TestNode testNode : rootNode.getSummaryNode().getTests()) {
262 Long testId = testNode.getTaskDataDto().getId();
263 if (testIds.contains(testId)) {
264 summaryNodeTests.add(testNode);
267 for (TestDetailsNode testDetailsNode : rootNode.getDetailsNode().getTests()) {
268 Long testId = testDetailsNode.getTaskDataDto().getId();
269 if (testIds.contains(testId)) {
270 detailsNodeTests.add(testDetailsNode);
275 Map<Long, Set<MetricNameDto>> metrics =
new HashMap<Long, Set<MetricNameDto>>();
276 Set<String> metricsWithSummary =
new HashSet<String>();
277 Set<String> metricsWithPlots =
new HashSet<String>();
279 for (TestNode testNode : summaryNodeTests) {
280 Long testId = testNode.getTaskDataDto().getId();
282 if (!metrics.containsKey(testId)) {
283 metrics.put(testId,
new HashSet<MetricNameDto>());
286 for (MetricNode metricNode : testNode.getMetrics()) {
287 for (MetricNameDto metricNameDto : metricNode.getMetricNameDtoList()) {
288 metrics.get(testId).add(metricNameDto);
289 metricsWithSummary.add(metricNameDto.getMetricName());
294 for (TestDetailsNode testDetailsNode : detailsNodeTests) {
295 Long testId = testDetailsNode.getTaskDataDto().getId();
297 if (!metrics.containsKey(testId)) {
298 metrics.put(testId,
new HashSet<MetricNameDto>());
301 for (MetricNode metricNode : testDetailsNode.getMetrics()) {
302 for (MetricNameDto metricNameDto : metricNode.getMetricNameDtoList()) {
303 metrics.get(testId).add(metricNameDto);
304 metricsWithPlots.add(metricNameDto.getMetricName());
310 Map<Long, Set<MetricEntity>> result =
new HashMap<Long, Set<MetricEntity>>();
311 for (Long key : metrics.keySet()) {
312 result.put(key,
new HashSet<MetricEntity>());
314 for (MetricNameDto metricNameDto : metrics.get(key)) {
317 if (metricsWithSummary.contains(metricNameDto.getMetricName())) {
320 if (metricsWithPlots.contains(metricNameDto.getMetricName())) {
323 result.get(key).add(metricEntity);
332 Map<MetricEntity, MetricSummaryValueEntity> map =
getMetricSummary(Arrays.asList(metric));
334 return map.get(metric);
338 public Map<MetricEntity, MetricSummaryValueEntity>
getMetricSummary(Collection<MetricEntity> metrics) {
340 Set<MetricNameDto> metricNameDtoSet =
new HashSet<MetricNameDto>();
341 Map<MetricNameDto, MetricEntity> matchMap =
new HashMap<MetricNameDto, MetricEntity>();
344 if (metric.isSummaryAvailable()) {
345 metricNameDtoSet.add(metric.getMetricNameDto());
346 matchMap.put(metric.getMetricNameDto(), metric);
350 Collection<SummarySingleDto> metricDtoList = databaseService.getSummaryByMetricNameDto(metricNameDtoSet,
true).values();
352 Map<MetricEntity, MetricSummaryValueEntity> result =
new HashMap<MetricEntity, MetricSummaryValueEntity>();
353 for (SummarySingleDto metricDto : metricDtoList) {
354 MetricEntity metricEntity = matchMap.get(metricDto.getMetricName());
356 value.
setValue(Double.parseDouble(metricDto.getValues().iterator().next().getValue()));
357 value.
setDecision(metricDto.getValues().iterator().next().getDecision());
358 result.put(metricEntity, value);
366 Map<MetricEntity, List<MetricPlotPointEntity>> map =
getMetricPlotData(Collections.singletonList(metric));
368 return map.get(metric);
372 public Map<MetricEntity, List<MetricPlotPointEntity>>
getMetricPlotData(Collection<MetricEntity> metrics) {
373 Set<MetricNameDto> metricNameDtoSet =
new HashSet<MetricNameDto>();
374 Map<MetricNameDto, MetricEntity> matchMap =
new HashMap<MetricNameDto, MetricEntity>();
377 if (metric.isPlotAvailable()) {
378 metricNameDtoSet.add(metric.getMetricNameDto());
379 matchMap.put(metric.getMetricNameDto(), metric);
383 Map<MetricNameDto, List<PlotSingleDto>> resultMap = databaseService.getPlotDataByMetricNameDto(metricNameDtoSet);
385 Map<MetricEntity, List<MetricPlotPointEntity>> result =
new HashMap<MetricEntity, List<MetricPlotPointEntity>>();
386 for (Map.Entry<MetricNameDto, List<PlotSingleDto>> entry : resultMap.entrySet()) {
387 MetricEntity metricEntity = matchMap.get(entry.getKey());
388 List<MetricPlotPointEntity> values =
new ArrayList<MetricPlotPointEntity>();
389 for (PointDto pointDto : entry.getValue().iterator().next().getPlotData()) {
391 metricPlotPointEntity.
setTime(pointDto.getX());
392 metricPlotPointEntity.
setValue(pointDto.getY());
393 values.add(metricPlotPointEntity);
395 result.put(metricEntity, values);
402 return databaseService;