public void query(CompositeMap context_map) throws Exception {
    super.doPopulate();
    ILogger logger =
        LoggingContext.getLogger(context_map, DatabaseConstant.AURORA_DATABASE_LOGGING_TOPIC);
    SqlServiceContext context =
        (SqlServiceContext) DynamicObject.cast(context_map, SqlServiceContext.class);

    String cache_key = null;
    boolean is_cache = false;
    ICache cache_for_data = null;
    if (cacheKey != null) {
      is_cache = true;
      cache_for_data = CacheUtil.getNamedCache(mObjectReg, KEY_DATA_CACHE_NAME);
      cache_key = TextParser.parse(cacheKey, context_map);
      CompositeMap data = (CompositeMap) cache_for_data.getValue(cache_key);
      if (data != null) {
        logger.config("Cached data found with key " + cache_key);
        // write cache to context
        CompositeMap root_node =
            getMapFromRootPath(
                context.getModel(), TextParser.parse(this.rootPath, context.getObjectContext()));
        root_node.copy(data);
        return;
      } else {
        logger.config(
            "Cached data not found with key " + cache_key + ", doing normal database query");
      }
    }

    prepare(context_map);

    // context.setTrace(trace);
    ServiceOption option = ServiceOption.createInstance();
    option.setQueryMode(mode);
    option.setAutoCount(autoCount);
    option.setConnectionName(connectionName);
    option.setFieldCase(fieldNameCaseValue);
    option.setRecordName(recordName);
    transferServiceOption(option, ServiceOption.KEY_DEFAULT_WHERE_CLAUSE);
    transferServiceOption(option, ServiceOption.KEY_QUERY_ORDER_BY);
    context.setServiceOption(option);

    IResultSetConsumer consumer = null;
    //        CompositeMapCreator compositeCreator = null;
    try {
      // get parameter
      CompositeMap param = context.getCurrentParameter();
      if (parameter != null) {
        Object obj = param.getObject(parameter);
        if (obj != null) {
          if (!(obj instanceof CompositeMap))
            throw new IllegalArgumentException(
                "query parameter should be instance of CompositeMap, but actually got "
                    + obj.getClass().getName());
          param = (CompositeMap) obj;
        }
      }

      // page settings
      FetchDescriptor desc = FetchDescriptor.createFromParameter(context.getParameter());
      desc.setFetchAll(fetchAll);
      if (pageSize != null) desc.setPageSize(pageSize.intValue());

      // ResultSet consumer
      if (this.rsConsummer != null) consumer = this.rsConsummer;
      else {
        consumer = (IResultSetConsumer) context.getInstanceOfType(IResultSetConsumer.class);
        if (consumer == null) {
          consumer = new CompositeMapCreator();
          mOCManager.populateObject(mEntryConfig, consumer);
        }
      }
      if (consumer instanceof IContextAcceptable)
        ((IContextAcceptable) consumer).setContext(context_map);
      // set root path
      if (consumer instanceof IRootMapAcceptable) {
        CompositeMap result =
            getMapFromRootPath(
                context.getModel(), TextParser.parse(this.rootPath, context.getObjectContext()));
        if (result != null) ((IRootMapAcceptable) consumer).setRoot(result);
      }
      context.setResultsetConsumer(consumer);
      doQuery(param, consumer, desc);

      // write data to cache
      if (is_cache) {
        CompositeMap d = (CompositeMap) consumer.getResult();
        CompositeMap copied_data = (CompositeMap) d.clone();
        copied_data.setParent(null);
        cache_for_data.setValue(cache_key, copied_data);
      }
      /*
      if( transform_list != null && consumer instanceof  IRootMapAcceptable){
          CompositeMap root = ((IRootMapAcceptable)consumer).getRoot();
          Transformer.doBatchTransform( root, transform_list );
      }
      */
    } finally {
      context.setServiceOption(null);
      context.setResultsetConsumer(null);
      cleanUp(context_map);
    }
  }
 protected void transferServiceOption(ServiceOption option, String key) {
   option.getObjectContext().put(key, super.mEntryConfig.get(key));
 }