static ArrayList<Datapoint> convertMetricStatisticsToDatapoints(
     Statistics statistics, Collection<MetricStatistics> metrics) {
   ArrayList<Datapoint> datapoints = Lists.newArrayList();
   boolean wantsAverage = statistics.getMember().contains("Average");
   boolean wantsSum = statistics.getMember().contains("Sum");
   boolean wantsSampleCount = statistics.getMember().contains("SampleCount");
   boolean wantsMaximum = statistics.getMember().contains("Maximum");
   boolean wantsMinimum = statistics.getMember().contains("Minimum");
   for (MetricStatistics metricStatistics : metrics) {
     Datapoint datapoint = new Datapoint();
     datapoint.setTimestamp(metricStatistics.getTimestamp());
     datapoint.setUnit(metricStatistics.getUnits().toString());
     if (wantsSum) {
       datapoint.setSum(metricStatistics.getSampleSum());
     }
     if (wantsSampleCount) {
       datapoint.setSampleCount(metricStatistics.getSampleSize());
     }
     if (wantsMaximum) {
       datapoint.setMaximum(metricStatistics.getSampleMax());
     }
     if (wantsMinimum) {
       datapoint.setMinimum(metricStatistics.getSampleMin());
     }
     if (wantsAverage) {
       datapoint.setAverage(
           MetricUtils.average(metricStatistics.getSampleSum(), metricStatistics.getSampleSize()));
     }
     datapoints.add(datapoint);
   }
   return datapoints;
 }
  @Test
  public void testDistinctDimensionMaps() {
    final Date now = MetricUtils.stripSeconds(new Date());
    // throw some different dimension order in there...
    final Map<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("dim1", "val1");
    hashMap.put("dim2", "val2");
    final Map<String, String> treeMap = new TreeMap<String, String>();
    treeMap.put("dim2", "val2");
    treeMap.put("dim1", "val1");

    ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>();
    for (int i = 0; i < 10; i++) {
      SimpleMetricEntity mqi = new SimpleMetricEntity();
      mqi.setAccountId("account1");
      mqi.setDimensionMap((i % 2 == 0) ? null : hashMap);
      mqi.setMetricName("metric1");
      mqi.setMetricType(MetricType.Custom);
      mqi.setNamespace("namespace1");
      mqi.setSampleMax((double) i);
      mqi.setSampleMin((double) i);
      mqi.setSampleSize((double) 1);
      mqi.setSampleSum((double) i);
      mqi.setTimestamp(now);
      mqi.setUnits(Units.None);
      list.add(mqi);
    }

    List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list);
    // should be two items...
    assertEquals(2, aggregateList.size());
    // since we are not sure which order, one should have dimensionMap null
    // and one should have hashMap
    SimpleMetricEntity odd, even;
    if (aggregateList.get(0).getDimensionMap() == null) {
      even = aggregateList.get(0);
      odd = aggregateList.get(1);
    } else {
      even = aggregateList.get(1);
      odd = aggregateList.get(0);
    }
    // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5
    assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE);
    assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE);
    assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE);
    assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE);
    assertEquals(even.getAccountId(), "account1");
    assertEquals(even.getDimensionMap(), null);
    assertEquals(even.getMetricName(), "metric1");
    assertEquals(even.getMetricType(), MetricType.Custom);
    assertEquals(even.getNamespace(), "namespace1");
    assertEquals(even.getTimestamp(), now);
    assertEquals(even.getUnits(), Units.None);

    // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5
    assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE);
    assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE);
    assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE);
    assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE);
    assertEquals(odd.getAccountId(), "account1");
    assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok
    assertEquals(odd.getMetricName(), "metric1");
    assertEquals(odd.getMetricType(), MetricType.Custom);
    assertEquals(odd.getNamespace(), "namespace1");
    assertEquals(odd.getTimestamp(), now);
    assertEquals(odd.getUnits(), Units.None);
  }