private CompositeMap sqlQuery(String sql) throws Exception {
   ResultSet resultSet = null;
   SqlServiceContext sql_context = null;
   CompositeMap result = new CompositeMap("result");
   try {
     Connection conn = dataSource.getConnection();
     sql_context = SqlServiceContext.createSqlServiceContext(conn);
     ParsedSql stmt = createStatement(sql);
     SqlRunner runner = new SqlRunner(sql_context, stmt);
     resultSet = runner.query(null);
     ResultSetLoader mRsLoader = new ResultSetLoader();
     mRsLoader.setFieldNameCase(Character.LOWERCASE_LETTER);
     FetchDescriptor desc = FetchDescriptor.fetchAll();
     CompositeMapCreator compositeCreator = new CompositeMapCreator(result);
     mRsLoader.loadByResultSet(resultSet, desc, compositeCreator);
   } finally {
     DBUtil.closeResultSet(resultSet);
     if (sql_context != null) sql_context.freeConnection();
   }
   return result;
 }
  @Override
  public CompositeMap getCustomizationData(
      BusinessModel model, String function_code, CompositeMap context) {
    if (custDimensionsRecords == null || custDimensionsRecords.getChilds() == null) return null;
    String bm_name = model.getName();
    SqlServiceContext ssc = null;
    ResultSet rs_exists = null;
    ResultSet rs_details = null;
    CompositeMap result = new CompositeMap("result");
    try {
      ssc = databaseServiceFactory.createContextWithConnection();
      String exits_sql =
          "select 1   from dual  where exists  (select 1 from sys_bm_config_customization t "
              + " where t.bm_code='"
              + bm_name
              + "' and t.function_code = '"
              + function_code
              + "' and t.enable_flag='Y')";
      ParsedSql exits_stmt = createStatement(exits_sql);
      SqlRunner exits_runner = new SqlRunner(ssc, exits_stmt);
      rs_exists = exits_runner.query(null);
      if (!rs_exists.next()) {
        return null;
      }

      String bm_tag = model.getTag();
      if (bm_tag != null) {
        executeDimensionProc(bm_tag, custDimensionsRecords, context);
      }
      String dimenson_sql_template =
          "select d.order_num,record_id,head_id,function_id,function_code,bm_code,dimension_type,dimension_value,"
              + " bm_select_value,bm_data_source,bm_where_clause,bm_order_by,bm_query_condition"
              + " from sys_bm_config_customization t,sys_bm_config_dimension d "
              + " where t.dimension_type=d.dimension_code and t.enable_flag = 'Y'"
              + " and t.bm_code='"
              + bm_name
              + "' and t.function_code = '"
              + function_code
              + "' and t.dimension_type=";
      StringBuffer sb = new StringBuffer("");
      boolean firstRecord = true;
      for (Iterator it = custDimensionsRecords.getChildIterator(); it.hasNext(); ) {
        CompositeMap record = (CompositeMap) it.next();
        String dimensionCode = record.getString("dimension_code");
        String data_query_sql = record.getString("data_query_sql");
        String dimension_tag = record.getString("dimension_tag");
        if (dimension_tag != null) {
          if (bm_tag == null) continue;
          boolean is_tag_match = bm_tag.contains(dimension_tag);
          if (!is_tag_match) continue;
        }
        if (firstRecord) firstRecord = false;
        else sb.append(" union all ");
        sb.append(dimenson_sql_template).append("'").append(dimensionCode).append("'");
        if (data_query_sql != null) sb.append(" and ").append(data_query_sql);
      }
      if (!firstRecord) sb.append(" order by 1 ");
      if ("".equals(sb.toString())) return null;
      String custDetailRecordsSql = sb.toString();
      LoggingContext.getLogger(context, this.getClass().getCanonicalName())
          .config("custDetailRecordsSql:" + custDetailRecordsSql);
      ParsedSql stmt = createStatement(custDetailRecordsSql);
      SqlRunner runner = new SqlRunner(ssc, stmt);
      rs_details = runner.query(context);
      ResultSetLoader mRsLoader = new ResultSetLoader();
      mRsLoader.setFieldNameCase(Character.LOWERCASE_LETTER);
      FetchDescriptor desc = FetchDescriptor.fetchAll();
      CompositeMapCreator compositeCreator = new CompositeMapCreator(result);
      mRsLoader.loadByResultSet(rs_details, desc, compositeCreator);
      if (result.getChilds() == null) return null;
    } catch (Exception e) {
      throw new RuntimeException(e);
    } finally {
      DBUtil.closeResultSet(rs_exists);
      DBUtil.closeResultSet(rs_details);
      if (ssc != null)
        try {
          ssc.freeConnection();
        } catch (SQLException e) {
          throw new RuntimeException(e);
        }
    }
    context.putObject(DEFAULT_CUSTOM_DATA, result);
    return result;
  }