/**
   * 运行查询
   *
   * @param request HttpServletRequest
   * @return QueryValue
   */
  public QueryValue run(HttpServletRequest request) {
    CalTime calTime = new CalTime();
    CalTime calTimeSub = new CalTime();
    // 获取结果
    QueryValue queryValue = new QueryValue();
    request.setAttribute("queryValue", queryValue);

    // 获取运行次数
    queryValue.queryName = this.getQuery().getQueryName();
    queryValue.lastQueryName = RequestUtils.getStringParameter(request, "QueryName", "");
    if (queryValue.queryName.equals(queryValue.lastQueryName)) queryValue.runTime = 1;
    else {
      if (queryValue.lastQueryName.equals("")) queryValue.runTime = 0;
      else queryValue.runTime = -1;
    }

    // 解析参数中的页面大小和页数

    queryValue.pageSize = RequestUtils.getIntParameter(request, "query_pagesize", 0);
    if (queryValue.pageSize == 0) queryValue.pageSize = this.pageSize;
    queryValue.pageNo =
        RequestUtils.getIntParameter(request, queryValue.queryName + "_query_pageno", 1);

    // 将配置的Sql元素传送给SqlConfig
    SqlConfig sqlConfig = new SqlConfig();
    SqlString sqlStringSelect = new SqlString(this.sqlSelect);
    sqlConfig.sqlSelect = sqlStringSelect.getParseSql(request, null);
    // sqlConfig.sqlStringSelect = this.sqlStringSelect;
    sqlConfig.sqlStringFromWhere = this.sqlStringFromWhere;

    // 统计解析
    String sqlGroup = "";
    String sqlGroupSelectGroup = "";
    queryValue.drillURL = drillURL;
    queryValue.needTotalX = this.needTotalX;
    queryValue.needTotalY = this.needTotalY;

    if (groupList != null) {
      // 统计没有分页
      queryValue.pageSize = -1;
      StringBuffer sqlGroupSb = new StringBuffer();
      StringBuffer sqlGroupSelectGroupSb = new StringBuffer();
      queryValue.groupRalationList = this.groupRelationList;
      queryValue.groupList = new ArrayList();

      // 初始化XYZ轴

      if (queryValue.runTime != 1) // 第一次运行和从别的查询过来
      {
        queryValue.groupListY = (ArrayList) this.groupListY.clone();
        queryValue.groupListX = (ArrayList) this.groupListX.clone();
        queryValue.groupListSelect = (ArrayList) this.groupListSelect.clone();
        queryValue.groupList = (ArrayList) this.groupList.clone();
      } // end 初始化XYZ轴 if
      else {
        // 从Request中获取用户选择的X、Y轴

        queryValue.groupListY = new ArrayList();
        queryValue.groupListX = new ArrayList();
        queryValue.groupListSelect = new ArrayList();

        // Y轴

        String[] groupYName = RequestUtils.getStringParameters(request, "groupYName");
        String[] checkGroupYSubTotal =
            RequestUtils.getStringParameters(request, "checkGroupYSubTotal");
        for (int i = 0; i < groupYName.length; i++) {
          Object obj = groupMap.get(groupYName[i]);
          if (obj != null) {
            Group group = (Group) ((Group) obj).clone();
            group.position = 'y' + String.valueOf(i + 1);
            if (ArrayUtils.contains(checkGroupYSubTotal, groupYName[i])) group.needSubTotal = true;
            else group.needSubTotal = false;
            queryValue.groupListY.add(group);
          }
        }

        // X轴

        String[] groupXName = RequestUtils.getStringParameters(request, "groupXName");
        for (int i = 0; i < groupXName.length; i++) {
          Object obj = groupMap.get(groupXName[i]);
          if (obj != null) {
            Group group = (Group) ((Group) obj).clone();
            group.position = 'x' + String.valueOf(i + 1);
            queryValue.groupListX.add(group);
          }
        }

        // Z轴

        String[] groupList = RequestUtils.getStringParameters(request, "groupZName");
        for (int i = 0; i < groupList.length; i++) {
          Object obj = groupMap.get(groupList[i]);
          if (obj != null) {
            Group group = (Group) ((Group) obj).clone();
            group.position = String.valueOf(i + 1);
            queryValue.groupListSelect.add(group);
          }
        }
        queryValue.groupList.addAll(queryValue.groupListX);
        queryValue.groupList.addAll(queryValue.groupListY);
      } // end 初始化XYZ轴 else

      if (!(queryValue.runTime == 0 && !firstShow)) {
        for (int i = 0; i < queryValue.groupList.size(); i++) {
          Group group = (Group) queryValue.groupList.get(i);
          if (group.metadata.size() == 0 && !group.metadatasql.equals("")) {
            group.metadata =
                JdbcUtils.queryForList(
                    group.metadataSqlString.getParseSql(request, this.replaceMap));
          }
          sqlGroupSb.append(group.macrovalue).append(',');
          sqlGroupSelectGroupSb
              .append(group.macrovalue)
              .append(" as ")
              .append(group.groupLabel)
              .append(',');
        }
        sqlGroup = sqlGroupSb.deleteCharAt(sqlGroupSb.length() - 1).toString();
        sqlGroupSelectGroup = sqlGroupSelectGroupSb.toString();
      }
    }
    // 如果不是第1次并配置为第1次不运行
    if (queryValue.runTime == 0 && !firstShow) {
      queryValue.title = new String[0];
    } else {
      queryValue.dataList = new ArrayList();
      queryValue.allDataList = new ArrayList();
      // 进行sqlFromWhere的解析

      sqlConfig.sqlFromWhere = sqlConfig.sqlStringFromWhere.getParseSql(request, this.replaceMap);
      //    sqlConfig.sqlSelect = sqlConfig.sqlStringSelect.getParseSql(request, this.replaceMap);

      if (sqlGroup.length() > 0)
        sqlConfig.sqlData =
            "select "
                + sqlGroupSelectGroup
                + sqlGroupSelect.getSql(request)
                + " "
                + sqlConfig.sqlFromWhere
                + " group by "
                + sqlGroup;
      else {
        sqlConfig.sqlData = "select " + sqlConfig.sqlSelect + " " + sqlConfig.sqlFromWhere;
        sqlConfig.sqlSum = this.sqlSum;
        if (sqlConfig.sqlSum.length() > 0)
          sqlConfig.sqlDataSum = "select " + sqlConfig.sqlSum + " " + sqlConfig.sqlFromWhere;
        sqlConfig.sqlCount =
            "select count(*) from (" + sqlConfig.sqlData + ")"; // + sqlConfig.sqlFromWhere;
        String query_sortcol = RequestUtils.getStringParameter(request, "query_sortcol", "");
        sqlConfig.sqlOrder = this.sqlOrder;
        if (!StringUtils.isBlank(query_sortcol)) {
          sqlConfig.sqlOrder =
              " order by "
                  + query_sortcol
                  + " "
                  + RequestUtils.getStringParameter(request, "query_sortdir", "");
        }
        sqlConfig.sqlOrder = StringUtils.trimToEmpty(sqlConfig.sqlOrder);
      }

      // 从数据库获取数据
      calTime.begin();
      if (needCache
          && agentClass.fetchCacheResultFromDb(eleConfig, sqlConfig, request, queryValue)) {
        int position = queryValue.pageSize * (queryValue.pageNo - 1);
        int maxsize = position + queryValue.pageSize;
        if (queryValue.allDataList.size() <= maxsize) maxsize = queryValue.allDataList.size();
        else {
          queryValue.hasNextPage = true;
        }
        if (queryValue.pageSize == -1) {
          position = 0;
          maxsize = queryValue.allDataList.size();
        }
        for (int i = position; i < maxsize; i++) {
          queryValue.dataList.add(queryValue.allDataList.get(i));
        }
      } else {
        calTimeSub.begin();
        agentClass.fetchPageResultFromDb(eleConfig, sqlConfig, request, queryValue);
        queryValue
            .calTimeSb
            .append("从数据库获取数据时间:")
            .append(calTimeSub.endString())
            .append(StringUtils.LINE_SEPARATOR);
      }
      queryValue
          .calTimeSb
          .append("总共获取数据时间:")
          .append(calTime.endString())
          .append(StringUtils.LINE_SEPARATOR);
    }
    return queryValue;
  }