private void buildHourlyTaskInternal(Date period, Set<String> productLineSet) {
    MetricReportForABTestVisitor visitor = new MetricReportForABTestVisitor();

    for (String productLine : productLineSet) {
      MetricReport metricReport =
          m_reportService.queryMetricReport(
              productLine, period, new Date(period.getTime() + TimeUtil.ONE_HOUR));

      metricReport.accept(visitor);
    }

    Map<Integer, AbtestReport> result = visitor.getReportMap();

    for (AbtestReport report : result.values()) {
      if (report.getRunId() != -1) {
        com.dianping.cat.home.dal.abtest.AbtestReport _report =
            new com.dianping.cat.home.dal.abtest.AbtestReport();

        _report.setRunId(report.getRunId());
        _report.setPeriod(period);
        _report.setContent(report.toString());

        try {
          m_abtestReportDao.insert(_report);
        } catch (DalException e) {
          Cat.logError(e);
        }
      }
    }
  }
  private AbtestReport findOrCreateAbtestReport(int runId) {
    AbtestReport report = m_reportMap.get(runId);

    if (report == null) {
      report = new AbtestReport();

      report.setRunId(runId);
      report.setStartTime(m_startDate);
      report.setEndTime(m_endDate);
      m_reportMap.put(runId, report);
    }

    return report;
  }
  @Override
  public void visitPoint(Point point) {
    AbtestReport report = findOrCreateAbtestReport(m_runId);

    Variation variation = report.findOrCreateVariation(m_variation);

    Goal goal = variation.findOrCreateGoal(m_id);

    int count = goal.getCount() + point.getCount();
    double sum = goal.getSum() + point.getSum();

    goal.setType(m_type);
    goal.setCount(count);
    goal.setSum(sum);
    // avg?
  }
  public Map<Integer, AbtestReport> getReportMap() {
    for (AbtestReport report : m_reportMap.values()) {
      HashMap<String, String> map = m_metrics.get(report.getRunId());

      for (Entry<String, String> entry : map.entrySet()) {
        String metric = entry.getKey();
        String value = entry.getValue();

        for (Variation variation : report.getVariations().values()) {
          Goal goal = variation.findOrCreateGoal(metric);

          goal.setType(value);
        }

        Goal goal = new Goal();

        goal.setName(metric);
        report.getGoals().add(goal);
      }
    }

    return m_reportMap;
  }
  @Test
  public void test() throws Exception {
    String xml =
        Files.forIO().readFrom(getClass().getResourceAsStream("metricReport.xml"), "utf-8");

    MetricReport metricReport = DefaultSaxParser.parse(xml);

    MetricReportForABTestVisitor visitor = new MetricReportForABTestVisitor();

    metricReport.accept(visitor);

    Map<Integer, AbtestReport> result = visitor.getReportMap();

    Calendar calendar = Calendar.getInstance();
    Date now = new Date();
    calendar.setTime(now);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.roll(Calendar.DAY_OF_MONTH, -14);

    for (AbtestReport ar : result.values()) {
      if (ar.getRunId() != -1) {
        System.out.println(ar.toString());
        for (int i = 0; i < 14; i++) {
          for (int j = 0; j < 24; j++) {
            Date begin = calendar.getTime();

            calendar.roll(Calendar.HOUR_OF_DAY, true);
            Date end = calendar.getTime();

            System.out.println("Import new report for " + begin);
            ar.setStartTime(begin);
            ar.setEndTime(end);

            com.dianping.cat.home.dal.abtest.AbtestReport report =
                new com.dianping.cat.home.dal.abtest.AbtestReport();
            report.setPeriod(begin);
            report.setRunId(ar.getRunId());
            report.setContent(ar.toString());

            m_abtestReportDao.insert(report);
          }
          calendar.roll(Calendar.DAY_OF_MONTH, true);
        }
      }
    }
  }