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; }