Jagger
 All Classes Namespaces Files Functions Variables Groups Pages
DefaultDataService.java
Go to the documentation of this file.
1 package com.griddynamics.jagger.engine.e1.services;
2 
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.*;
12 
13 import java.util.*;
14 
25 public class DefaultDataService implements DataService {
26 
27  private DatabaseService databaseService;
28 
29  // For all user operations - get all test results without matching
30  private final SessionMatchingSetup SESSION_MATCHING_SETUP = new SessionMatchingSetup(false, Collections.<SessionMatchingSetup.MatchBy>emptySet());
31 
32  public DefaultDataService(NodeContext context) {
33  databaseService = context.getService(DatabaseService.class);
34  }
35 
36  public DefaultDataService(DatabaseService databaseService) {
37  this.databaseService = databaseService;
38  }
39 
40  @Override
41  public SessionEntity getSession(String sessionId) {
42  Set<SessionEntity> sessions = getSessions(Arrays.asList(sessionId));
43  if (sessions.isEmpty()) {
44  return null;
45  }
46  return sessions.iterator().next();
47  }
48 
49  @Override
50  public Set<SessionEntity> getSessions(Collection<String> sessionIds) {
51 
52  List<SessionDataDto> sessionDataDtoList = databaseService.getSessionInfoService().getBySessionIds(0, sessionIds.size(), new HashSet<String>(sessionIds));
53 
54  if (sessionDataDtoList.isEmpty()) {
55  return Collections.emptySet();
56  }
57 
58  Set<SessionEntity> entities = new TreeSet<>(new SessionEntity.IdComparator());
59  for (SessionDataDto sessionDataDto : sessionDataDtoList) {
60  SessionEntity sessionEntity = new SessionEntity();
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());
66 
67  entities.add(sessionEntity);
68  }
69 
70  return entities;
71  }
72 
73  @Override
74  public Set<TestEntity> getTests(SessionEntity session) {
75  return getTests(session.getId());
76  }
77 
78  @Override
79  public Set<TestEntity> getTests(String sessionId) {
80  Map<String, Set<TestEntity>> map = getTests(Arrays.asList(sessionId));
81 
82  Set<TestEntity> result = map.get(sessionId);
83  if (result != null) {
84  return result;
85  }
86 
87  return Collections.emptySet();
88  }
89 
90  @Override
91  public Map<String, Set<TestEntity>> getTests(Collection<String> sessionIds) {
92  return getTestsWithName(sessionIds, null, SESSION_MATCHING_SETUP);
93  }
94 
95  @Override
96  public TestEntity getTestByName(SessionEntity session, String testName) {
97  return getTestByName(session.getId(), testName);
98  }
99 
100  @Override
101  public TestEntity getTestByName(String sessionId, String testName) {
102  Map<String, TestEntity> map = getTestsByName(Collections.singletonList(sessionId), testName);
103 
104  TestEntity result = map.get(sessionId);
105  if (result != null) {
106  return result;
107  }
108 
109  return null;
110  }
111 
112  @Override
113  public Map<String, TestEntity> getTestsByName(Collection<String> sessionIds, String testName) {
114  Map<String, Set<TestEntity>> tests = getTestsWithName(sessionIds, testName, SESSION_MATCHING_SETUP);
115 
116  Map<String, TestEntity> result = new HashMap<String, TestEntity>(tests.size());
117 
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());
122  }
123  }
124 
125  return result;
126  }
127 
128  // if testName=null => no filtering for test name => all tests for session(s) will be returned
129  // @return map <sessionId, set<test>>
130  public Map<String, Set<TestEntity>> getTestsWithName(Collection<String> sessionIds, String testName, SessionMatchingSetup sessionMatchingSetup) {
131  if (sessionIds.isEmpty()) {
132  return Collections.emptyMap();
133  }
134 
135  // basic
136  List<TaskDataDto> taskDataDtoList = databaseService.getTaskDataForSessions(new HashSet<String>(sessionIds), sessionMatchingSetup);
137  // info
138  Map<TaskDataDto, Map<String, TestInfoDto>> testInfoMap = databaseService.getTestInfoByTaskDataDto(taskDataDtoList);
139  // decision
140  Set<Long> ids = new HashSet<Long>();
141  for (TaskDataDto taskDataDto : taskDataDtoList) {
142  ids.addAll(taskDataDto.getIds());
143  }
144  Map<Long, TaskDecisionDto> idToDecisionPerTest = new HashMap<Long, TaskDecisionDto>();
145  for (TaskDecisionDto taskDecisionDto : databaseService.getDecisionsPerTask(ids)) {
146  idToDecisionPerTest.put(taskDecisionDto.getId(), taskDecisionDto);
147  }
148 
149  Map<String, Set<TestEntity>> result = new HashMap<String, Set<TestEntity>>();
150 
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();
157 
158  TestEntity testEntity = new TestEntity();
159  testEntity.setId(testId);
160  testEntity.setDescription(taskDataDto.getDescription());
161  testEntity.setName(taskDataDto.getTaskName());
162  testEntity.setTaskDataDto(taskDataDto);
163 
164  if (testInfoMap.containsKey(taskDataDto)) {
165  TestInfoDto testInfoDto = testInfoMap.get(taskDataDto).entrySet().iterator().next().getValue();
166  testEntity.setLoad(testInfoDto.getClock());
167  testEntity.setClockValue(testInfoDto.getClockValue());
168  testEntity.setTerminationStrategy(testInfoDto.getTermination());
169  testEntity.setStartDate(testInfoDto.getStartTime());
170  testEntity.setTestGroupIndex(testInfoDto.getNumber());
171  testEntity.setTestExecutionStatus(testInfoDto.getStatus());
172  }
173 
174  if (idToDecisionPerTest.containsKey(testId)) {
175  testEntity.setDecision(idToDecisionPerTest.get(testId).getDecision());
176  }
177 
178  if (result.containsKey(sessionId)) {
179  result.get(sessionId).add(testEntity);
180  } else {
181  Set<TestEntity> testEntitySet = new HashSet<TestEntity>();
182  testEntitySet.add(testEntity);
183  result.put(sessionId, testEntitySet);
184  }
185  }
186  }
187  }
188 
189  // add empty results when not found
190  for (String sessionId : sessionIds) {
191  if (!result.containsKey(sessionId)) {
192  result.put(sessionId, Collections.<TestEntity>emptySet());
193  }
194  }
195 
196  return result;
197  }
198 
199  @Override
200  public Set<MetricEntity> getMetrics(Long testId) {
201  Map<Long, Set<MetricEntity>> map = getMetricsByTestIds(Arrays.asList(testId));
202 
203  Set<MetricEntity> result = map.get(testId);
204  if (result != null) {
205  return result;
206  }
207 
208  return Collections.emptySet();
209  }
210 
211  @Override
212  public Set<MetricEntity> getMetrics(TestEntity test) {
213  Map<TestEntity, Set<MetricEntity>> map = getMetricsByTests(Arrays.asList(test));
214 
215  Set<MetricEntity> result = map.get(test);
216  if (result != null) {
217  return result;
218  }
219 
220  return Collections.emptySet();
221  }
222 
223  @Override
224  public Map<TestEntity, Set<MetricEntity>> getMetricsByTests(Collection<TestEntity> tests) {
225  Map<Long, TestEntity> map = new HashMap<Long, TestEntity>(tests.size());
226  Set<Long> ids = new HashSet<Long>(tests.size());
227 
228  for (TestEntity test : tests) {
229  map.put(test.getId(), test);
230  ids.add(test.getId());
231  }
232 
233  Map<Long, Set<MetricEntity>> metrics = getMetricsByTestIds(ids);
234 
235  Map<TestEntity, Set<MetricEntity>> result = new HashMap<TestEntity, Set<MetricEntity>>();
236 
237  for (Long key : map.keySet()) {
238  result.put(map.get(key), metrics.get(key));
239  }
240 
241  return result;
242  }
243 
244  @Override
245  public Map<Long, Set<MetricEntity>> getMetricsByTestIds(Collection<Long> testIds) {
246  if (testIds.isEmpty()) {
247  return Collections.emptyMap();
248  }
249 
250  // Get
251  List<String> sessionIds = databaseService.getSessionIdsByTaskIds(new HashSet<Long>(testIds));
252 
253  // Get all test results without matching
254  SessionMatchingSetup sessionMatchingSetup = new SessionMatchingSetup(false, Collections.<SessionMatchingSetup.MatchBy>emptySet());
255  RootNode rootNode = databaseService.getControlTreeForSessions(new HashSet<String>(sessionIds), sessionMatchingSetup);
256 
257  // Filter
258  List<TestNode> summaryNodeTests = new ArrayList<TestNode>();
259  List<TestDetailsNode> detailsNodeTests = new ArrayList<TestDetailsNode>();
260 
261  for (TestNode testNode : rootNode.getSummaryNode().getTests()) {
262  Long testId = testNode.getTaskDataDto().getId();
263  if (testIds.contains(testId)) {
264  summaryNodeTests.add(testNode);
265  }
266  }
267  for (TestDetailsNode testDetailsNode : rootNode.getDetailsNode().getTests()) {
268  Long testId = testDetailsNode.getTaskDataDto().getId();
269  if (testIds.contains(testId)) {
270  detailsNodeTests.add(testDetailsNode);
271  }
272  }
273 
274  // Join
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>();
278 
279  for (TestNode testNode : summaryNodeTests) {
280  Long testId = testNode.getTaskDataDto().getId();
281 
282  if (!metrics.containsKey(testId)) {
283  metrics.put(testId, new HashSet<MetricNameDto>());
284  }
285 
286  for (MetricNode metricNode : testNode.getMetrics()) {
287  for (MetricNameDto metricNameDto : metricNode.getMetricNameDtoList()) {
288  metrics.get(testId).add(metricNameDto);
289  metricsWithSummary.add(metricNameDto.getMetricName());
290  }
291  }
292  }
293 
294  for (TestDetailsNode testDetailsNode : detailsNodeTests) {
295  Long testId = testDetailsNode.getTaskDataDto().getId();
296 
297  if (!metrics.containsKey(testId)) {
298  metrics.put(testId, new HashSet<MetricNameDto>());
299  }
300 
301  for (MetricNode metricNode : testDetailsNode.getMetrics()) {
302  for (MetricNameDto metricNameDto : metricNode.getMetricNameDtoList()) {
303  metrics.get(testId).add(metricNameDto);
304  metricsWithPlots.add(metricNameDto.getMetricName());
305  }
306  }
307  }
308 
309  // Convert
310  Map<Long, Set<MetricEntity>> result = new HashMap<Long, Set<MetricEntity>>();
311  for (Long key : metrics.keySet()) {
312  result.put(key, new HashSet<MetricEntity>());
313 
314  for (MetricNameDto metricNameDto : metrics.get(key)) {
315  MetricEntity metricEntity = new MetricEntity();
316  metricEntity.setMetricNameDto(metricNameDto);
317  if (metricsWithSummary.contains(metricNameDto.getMetricName())) {
318  metricEntity.setSummaryAvailable(true);
319  }
320  if (metricsWithPlots.contains(metricNameDto.getMetricName())) {
321  metricEntity.setPlotAvailable(true);
322  }
323  result.get(key).add(metricEntity);
324  }
325  }
326 
327  return result;
328  }
329 
330  @Override
332  Map<MetricEntity, MetricSummaryValueEntity> map = getMetricSummary(Arrays.asList(metric));
333 
334  return map.get(metric);
335  }
336 
337  @Override
338  public Map<MetricEntity, MetricSummaryValueEntity> getMetricSummary(Collection<MetricEntity> metrics) {
339 
340  Set<MetricNameDto> metricNameDtoSet = new HashSet<MetricNameDto>();
341  Map<MetricNameDto, MetricEntity> matchMap = new HashMap<MetricNameDto, MetricEntity>();
342 
343  for (MetricEntity metric : metrics) {
344  if (metric.isSummaryAvailable()) {
345  metricNameDtoSet.add(metric.getMetricNameDto());
346  matchMap.put(metric.getMetricNameDto(), metric);
347  }
348  }
349 
350  Collection<SummarySingleDto> metricDtoList = databaseService.getSummaryByMetricNameDto(metricNameDtoSet, true).values();
351 
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);
359  }
360 
361  return result;
362  }
363 
364  @Override
365  public List<MetricPlotPointEntity> getMetricPlotData(MetricEntity metric) {
366  Map<MetricEntity, List<MetricPlotPointEntity>> map = getMetricPlotData(Collections.singletonList(metric));
367 
368  return map.get(metric);
369  }
370 
371  @Override
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>();
375 
376  for (MetricEntity metric : metrics) {
377  if (metric.isPlotAvailable()) {
378  metricNameDtoSet.add(metric.getMetricNameDto());
379  matchMap.put(metric.getMetricNameDto(), metric);
380  }
381  }
382 
383  Map<MetricNameDto, List<PlotSingleDto>> resultMap = databaseService.getPlotDataByMetricNameDto(metricNameDtoSet);
384 
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()) {
390  MetricPlotPointEntity metricPlotPointEntity = new MetricPlotPointEntity();
391  metricPlotPointEntity.setTime(pointDto.getX());
392  metricPlotPointEntity.setValue(pointDto.getY());
393  values.add(metricPlotPointEntity);
394  }
395  result.put(metricEntity, values);
396  }
397 
398  return result;
399  }
400 
401  public DatabaseService getDatabaseService() {
402  return databaseService;
403  }
404 
405  @Override
406  public boolean isAvailable() {
407  return true;
408  }
409 }