command = $command; } /** * @param MongoClient $connection * @param string $hash * @param array $document * @return MongoCommandCursor */ public static function createFromDocument(MongoClient $connection, $hash, array $document) { throw new \Exception('Not implemented'); } /** * @return \MongoDB\Driver\Cursor */ protected function ensureCursor() { if ($this->cursor === null) { $convertedCommand = TypeConverter::fromLegacy($this->command); if (isset($convertedCommand->cursor)) { if ($convertedCommand->cursor === true || $convertedCommand->cursor === []) { $convertedCommand->cursor = new \stdClass(); } } $originalReadPreference = null; if (!$this->supportsReadPreference()) { $originalReadPreference = $this->readPreference; $this->setReadPreference(\MongoClient::RP_PRIMARY); } try { $this->cursor = $this->db->command($convertedCommand, $this->getOptions()); } finally { if ($originalReadPreference) { $this->readPreference = $originalReadPreference; } } } return $this->cursor; } /** * @return array */ protected function getCursorInfo() { return [ 'ns' => $this->ns, 'limit' => 0, 'batchSize' => $this->batchSize, 'skip' => 0, 'flags' => 0, 'query' => $this->command, 'fields' => null, ]; } /** * @return array */ protected function getIterationInfo() { $iterationInfo = parent::getIterationInfo(); if ($iterationInfo['started_iterating']) { $iterationInfo += [ 'firstBatchAt' => $iterationInfo['at'], 'firstBatchNumReturned' => $iterationInfo['numReturned'], ]; $iterationInfo['at'] = 0; $iterationInfo['numReturned'] = 0; } return $iterationInfo; } /** * @return array */ public function __sleep() { return ['command'] + parent::__sleep(); } /** * @see https://github.com/mongodb/mongo-php-driver-legacy/blob/1.6.14/db.c#L51 * @return bool */ private function supportsReadPreference() { if ($this->command === []) { return false; } $firstKey = array_keys($this->command)[0]; switch ($firstKey) { case 'count': case 'group': case 'dbStats': case 'geoNear': case 'geoWalk': case 'distinct': case 'aggregate': case 'collStats': case 'geoSearch': case 'parallelCollectionScan': return true; case 'mapreduce': case 'mapReduce': return (isset($this->command['out']) && is_array($this->command['out']) && array_key_exists('inline', $this->command['out'])); default: return false; } } }