content: /*
   * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.alibaba.otter.manager.biz.statistics.delay.impl;
  
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.LinkedHashMap;
  import java.util.List;
  import java.util.Map;
  
  import com.alibaba.otter.shared.common.utils.Assert;
  import com.alibaba.otter.manager.biz.statistics.delay.DelayStatService;
  import com.alibaba.otter.manager.biz.statistics.delay.dal.DelayStatDAO;
  import com.alibaba.otter.manager.biz.statistics.delay.dal.dataobject.DelayStatDO;
  import com.alibaba.otter.manager.biz.statistics.delay.param.DelayStatInfo;
  import com.alibaba.otter.manager.biz.statistics.delay.param.TopDelayStat;
  import com.alibaba.otter.shared.common.model.statistics.delay.DelayStat;
  
  /**
   * @author danping.yudp
   */
  public class DelayStatServiceImpl implements DelayStatService {
  
      private DelayStatDAO delayStatDao;
  
      public DelayStatDAO getDelayStatDao() {
          return delayStatDao;
      }
  
      public void setDelayStatDao(DelayStatDAO delayStatDao) {
          this.delayStatDao = delayStatDao;
      }
  
      /**
       * 在数据库中插入delayStat
       */
      public void createDelayStat(DelayStat stat) {
          Assert.assertNotNull(stat);
          delayStatDao.insertDelayStat(delayStatModelToDo(stat));
      }
  
      /**
       * 通过pipeLineId得到一个以gmtCreate倒排序的第一条记录
       */
      public DelayStat findRealtimeDelayStat(Long pipelineId) {
          Assert.assertNotNull(pipelineId);
          DelayStatDO delayStatDO = delayStatDao.findRealtimeDelayStat(pipelineId);
          DelayStat delayStat = new DelayStat();
          if (delayStatDO != null) {
              delayStat = delayStatDOToModel(delayStatDO);
          }
          return delayStat;
      }
  
      /**
       * 列出pipeLineId下，start-end时间段下的delayStat
       */
      public Map<Long, DelayStatInfo> listTimelineDelayStat(Long pipelineId, Date start, Date end) {
  
          Map<Long, DelayStatInfo> delayStatInfos = new LinkedHashMap<Long, DelayStatInfo>();
          List<DelayStatDO> delayStatDOs = delayStatDao.listTimelineDelayStatsByPipelineId(pipelineId, start, end);
          int size = delayStatDOs.size();
          int k = size - 1;
          for (Long i = start.getTime(); i <= end.getTime(); i += 60 * 1000) {
              DelayStatInfo delayStatInfo = new DelayStatInfo();
              List<DelayStat> delayStats = new ArrayList<DelayStat>();
              // 取出每个时间点i以内的数据，k是一个游标，每次遍历时前面已经取过了的数据就不用再遍历了
              for (int j = k; j >= 0; --j) {
                  if ((i - delayStatDOs.get(j).getGmtModified().getTime() <= 60 * 1000)
                      && (i - delayStatDOs.get(j).getGmtModified().getTime() >= 0)) {
                      delayStats.add(delayStatDOToModel(delayStatDOs.get(j)));
                      k = j - 1;
                  }// 如果不满足if条件，则后面的数据也不用再遍历
                  else {
                      break;
                  }
              }
              if (delayStats.size() > 0) {
                  delayStatInfo.setItems(delayStats);
                  delayStatInfos.put(i, delayStatInfo);
              }
  
          }
          return delayStatInfos;
      }
  
      public List<TopDelayStat> listTopDelayStat(String searchKey, int topN) {
          return delayStatDao.listTopDelayStatsByName(searchKey, topN);
      }
  
      /**
       * 用于Model对象转化为DO对象
       * 
       * @param delayStat
       * @return DelayStatDO
       */
      private DelayStatDO delayStatModelToDo(DelayStat delayStat) {
          DelayStatDO delayStatDO = new DelayStatDO();
          delayStatDO.setId(delayStat.getId());
          delayStatDO.setDelayTime(delayStat.getDelayTime());
          delayStatDO.setDelayNumber(delayStat.getDelayNumber());
          delayStatDO.setPipelineId(delayStat.getPipelineId());
          delayStatDO.setGmtCreate(delayStat.getGmtCreate());
          delayStatDO.setGmtModified(delayStat.getGmtModified());
          return delayStatDO;
  
      }
  
      /**
       * 用于DO对象转化为Model对象
       * 
       * @param delayStatDO
       * @return DelayStat
       */
      private DelayStat delayStatDOToModel(DelayStatDO delayStatDO) {
          DelayStat delayStat = new DelayStat();
          delayStat.setId(delayStatDO.getId());
          delayStat.setDelayTime(delayStatDO.getDelayTime());
          delayStat.setDelayNumber(delayStatDO.getDelayNumber());
          delayStat.setPipelineId(delayStatDO.getPipelineId());
          delayStat.setGmtCreate(delayStatDO.getGmtCreate());
          delayStat.setGmtModified(delayStatDO.getGmtModified());
          return delayStat;
  
      }
  
  }
  