public function queryStruct($queryStruct = array(), $option = array(), $vendorInstance = null)
 {
     $option += array('routeKey' => $this->getRouteKey(), 'dbName' => $this->getDbName(), 'seqName' => null, 'collectionName' => null, 'options' => array(), 'explain' => false, 'cacheCount' => false);
     empty($option['dbName']) && ($option['dbName'] = lcfirst($option['routeKey']));
     empty($option['collectionName']) && ($option['collectionName'] = $option['dbName']);
     empty($option['seqName']) && ($option['seqName'] = lcfirst($option['routeKey']));
     list($vendorInstance, $option) = $this->getVendorInstanceSet($option, $vendorInstance, $this->buildRouteAttrCallbackByQueryStruct($queryStruct, $option));
     $collection = $vendorInstance->selectCollection($option['dbName'], $option['collectionName']);
     // 拼接 查询字段
     $queryField = array();
     !array_key_exists('queryField', $queryStruct) && ($queryStruct['queryField'] = array('*'));
     if (count($queryStruct['queryField']) == 1 && $queryStruct['queryField'][0] == '*') {
         $queryField = array();
     } else {
         $queryFiled = array();
         foreach ($queryStruct['queryField'] as $field) {
             $queryFiled[$field] = TRUE;
         }
     }
     // 查询条件
     $queryCondition = $this->compileCondition($queryStruct);
     // 排序条件
     $querySort = array();
     if (isset($queryStruct['orderSet']) && !empty($queryStruct['orderSet'])) {
         foreach ($queryStruct['orderSet'] as $row => $set) {
             foreach ($set as $field => $direction) {
                 $direction = strtoupper(trim($direction));
                 !in_array($direction, array('ASC', 'DESC')) && ($direction = 'ASC');
                 $querySort[$field] = $direction == 'ASC' ? MongoCollection::ASCENDING : MongoCollection::DESCENDING;
             }
         }
     }
     // Limit 分页条件
     $limit = null;
     $offset = null;
     if (isset($queryStruct['limitOffset']) && !empty($queryStruct['limitOffset'])) {
         if (isset($queryStruct['limitOffset']['offset']) && isset($queryStruct['limitOffset']['limit'])) {
             $limit = $queryStruct['limitOffset']['limit'];
             $offset = $queryStruct['limitOffset']['offset'];
         } elseif (!isset($queryStruct['limitOffset']['offset']) && isset($queryStruct['limitOffset']['limit'])) {
             $limit = $queryStruct['limitOffset']['limit'];
         }
     }
     // 结果集游标
     $resCur = $collection->find($queryCondition, $queryField);
     //var_export($resCur);exit;
     if (!empty($querySort)) {
         $resCur = $resCur->sort($querySort);
     }
     if (!is_null($offset)) {
         $resCur = $resCur->skip($offset);
     }
     if (!is_null($limit)) {
         $resCur = $resCur->limit($limit);
     }
     if ($option['explain'] == true) {
         return $resCur->explain();
     }
     if (isset($queryStruct['returnType'])) {
         if ($queryStruct['returnType'] == self::RETURNTYPE_CURSOR) {
             return $resCur;
         }
     }
     $resCount = null;
     if ($option['cacheCount'] == true) {
         !isset($conditionHash) && ($conditionHash = BoxUtil::getDataHashKey(array($option['dbName'], $option['collection'], $queryCondition)));
         $resCount = $this->currentQuerycount($option['collection'], $conditionHash);
     }
     if (is_null($resCount)) {
         $resCount = $resCur->count();
     }
     if ($option['cacheCount'] == true) {
         !isset($conditionHash) && ($conditionHash = BoxUtil::getDataHashKey(array($option['dbName'], $option['collection'], $queryCondition)));
         $this->setQueryCount($option['collection'], $conditionHash, $resCount);
     }
     $resAssoc = array();
     if ($resCount > 0) {
         foreach ($resCur as $rowObject) {
             $resAssoc[] = $rowObject;
         }
     }
     $retStruct = array('count' => $resCount, 'assoc' => $resAssoc);
     return $retStruct;
 }
 public function callMultiGetVendorInstance(array $keys, $method = '', $params = array(), $rowPostCallback = null, $option = array(), $vendorInstance = null)
 {
     $option += array('driverKey' => $this->getDriverKey(), 'routeMode' => BoxConstants::DATAROUTE_MODE_ATTR, 'routeKey' => $this->getRouteKey(), 'routeAttrIdLabel' => 'id');
     $resultDict = array();
     if (is_null($vendorInstance)) {
         $routeAttr = array();
         // 根据各个属性分配到的池子中不同的分组
         $routeInstSetPool = array();
         foreach ($keys as $key) {
             $routeAttr = array($option['routeAttrIdLabel'] => $key);
             $routeIdSet = self::$routeInstance->getRouteInstanceRouteIdSet($option['driverKey'], $option['routeKey'], $routeAttr);
             !isset($routeInstSetPool[$routeIdSet['group']]) && ($routeInstSetPool[$routeIdSet['group']] = array('keys' => array(), 'idset' => $routeIdSet));
             $keyHash = is_scalar($key) ? $key : BoxUtil::getDataHashKey($key);
             !isset($routeInstSetPool[$routeIdSet['group']]['keys'][$keyHash]) && ($routeInstSetPool[$routeIdSet['group']]['keys'][$keyHash] = $key);
         }
         $tplParams = $params;
         // 再分别根据各个分组将执行的结果返回
         if (!empty($routeInstSetPool)) {
             foreach ($routeInstSetPool as $group => $groupSet) {
                 $rowParams = $tplParams;
                 $rowKeys = array_values($groupSet['keys']);
                 $routeIdSet = $groupSet['idset'];
                 $rowVendorInstance = self::$routeInstance->getRouteInstanceByConfSubset($option['driverKey'], $routeIdSet['routeKey'], $routeIdSet['group'])->getInstance();
                 if (!empty($rowParams)) {
                     array_unshift($rowParams, $rowKeys);
                 } else {
                     $rowParams = array($rowKeys);
                 }
                 if (!is_null($rowPostCallback)) {
                     $midResult = call_user_func_array(array($rowVendorInstance, $method), $rowParams);
                     $result = call_user_func($rowPostCallback, $midResult);
                 } else {
                     $result = call_user_func_array(array($rowVendorInstance, $method), $rowParams);
                 }
                 if (!empty($result)) {
                     $resultDict = array_merge($resultDict, $result);
                 }
             }
         }
     } else {
         if (!empty($params)) {
             array_unshift($params, $keys);
         } else {
             $params = array($keys);
         }
         if (!is_null($rowPostCallback)) {
             $midResult = call_user_func_array(array($vendorInstance, $method), $params);
             $resultDict = call_user_func($rowPostCallback, $midResult);
         } else {
             $resultDict = call_user_func_array(array($vendorInstance, $method), $params);
         }
     }
     return $resultDict;
 }