protected PlotSingleDto assemble(
      MetricNameDto metricNameDto, Collection<MetricRawData> rawDatas) {
    List<PointDto> points = new ArrayList<>(rawDatas.size());
    String sessionId = null;

    for (MetricRawData metricRawData : rawDatas) {
      if (sessionId == null) sessionId = metricRawData.getSessionId();
      points.add(new PointDto(metricRawData.getTime() / 1000D, metricRawData.getValue()));
    }

    return new PlotSingleDto(
        points,
        legendProvider.generatePlotLegend(sessionId, metricNameDto.getMetricDisplayName(), true),
        getHexColorCode(metricNameDto.getMetricName(), sessionId),
        generatePointShape(metricNameDto.getMetricName(), sessionId));
  }
  protected Set<Pair<MetricNameDto, List<PlotSingleDto>>> getResult(
      Collection<MetricRawData> allRawData, List<MetricNameDto> metricNames) {

    Map<Long, Multimap<String, MetricRawData>> taskIdMetricIdRawMap =
        createMappedPlotDatasets(metricNames);

    for (MetricRawData rawData : allRawData) {
      String metricId = rawData.getMetricId();
      Long taskId = rawData.getWorkloadTaskDataId();
      taskIdMetricIdRawMap.get(taskId).put(metricId, rawData);
    }

    Multimap<MetricNameDto, PlotSingleDto> metricNamePlotMap = ArrayListMultimap.create();
    for (MetricNameDto metricName : metricNames) {
      for (Long taskId : metricName.getTaskIds()) {
        Collection<MetricRawData> rawDatas;

        Multimap<String, MetricRawData> multimap = taskIdMetricIdRawMap.get(taskId);
        if (multimap == null) {
          // we did not find metric for given task Id
          // it could happen if we got 2 sessions with different sets of custom metrics
          continue;
        }
        rawDatas = multimap.get(metricName.getMetricName());
        if (rawDatas == null || rawDatas.isEmpty()) {
          // no data was saved for given taskId and metric Id
          continue;
        }

        metricNamePlotMap.put(metricName, assemble(metricName, rawDatas));
      }
    }

    Set<Pair<MetricNameDto, List<PlotSingleDto>>> resultSet = new HashSet<>(metricNames.size());

    for (MetricNameDto metricName : metricNamePlotMap.keySet()) {
      List<PlotSingleDto> plotDatasetDtoList = new ArrayList<>(metricNamePlotMap.get(metricName));
      resultSet.add(Pair.of(metricName, plotDatasetDtoList));
    }

    return resultSet;
  }