Commit e61ce5d9 authored by Jeremy Mikola's avatar Jeremy Mikola

PHPLIB-74: Use Client's default type map for Database and Collection

This ensures that the library's default type map (i.e. model classes) are used for manually constructed Database and Collection objects.
parent 573f1e75
...@@ -14,6 +14,12 @@ use MongoDB\Operation\ListDatabases; ...@@ -14,6 +14,12 @@ use MongoDB\Operation\ListDatabases;
class Client class Client
{ {
private static $defaultTypeMap = [
'array' => 'MongoDB\Model\BSONArray',
'document' => 'MongoDB\Model\BSONDocument',
'root' => 'MongoDB\Model\BSONDocument',
];
private $manager; private $manager;
private $uri; private $uri;
private $typeMap; private $typeMap;
...@@ -41,13 +47,7 @@ class Client ...@@ -41,13 +47,7 @@ class Client
*/ */
public function __construct($uri = 'mongodb://localhost:27017', array $uriOptions = [], array $driverOptions = []) public function __construct($uri = 'mongodb://localhost:27017', array $uriOptions = [], array $driverOptions = [])
{ {
$driverOptions += [ $driverOptions += ['typeMap' => self::$defaultTypeMap];
'typeMap' => [
'array' => 'MongoDB\Model\BSONArray',
'document' => 'MongoDB\Model\BSONDocument',
'root' => 'MongoDB\Model\BSONDocument',
],
];
if (isset($driverOptions['typeMap']) && ! is_array($driverOptions['typeMap'])) { if (isset($driverOptions['typeMap']) && ! is_array($driverOptions['typeMap'])) {
throw InvalidArgumentException::invalidType('"typeMap" driver option', $driverOptions['typeMap'], 'array'); throw InvalidArgumentException::invalidType('"typeMap" driver option', $driverOptions['typeMap'], 'array');
......
...@@ -36,6 +36,11 @@ use Traversable; ...@@ -36,6 +36,11 @@ use Traversable;
class Collection class Collection
{ {
private static $defaultTypeMap = [
'array' => 'MongoDB\Model\BSONArray',
'document' => 'MongoDB\Model\BSONDocument',
'root' => 'MongoDB\Model\BSONDocument',
];
private static $wireVersionForFindAndModifyWriteConcern = 4; private static $wireVersionForFindAndModifyWriteConcern = 4;
private $collectionName; private $collectionName;
...@@ -102,7 +107,7 @@ class Collection ...@@ -102,7 +107,7 @@ class Collection
$this->manager = $manager; $this->manager = $manager;
$this->readConcern = isset($options['readConcern']) ? $options['readConcern'] : $this->manager->getReadConcern(); $this->readConcern = isset($options['readConcern']) ? $options['readConcern'] : $this->manager->getReadConcern();
$this->readPreference = isset($options['readPreference']) ? $options['readPreference'] : $this->manager->getReadPreference(); $this->readPreference = isset($options['readPreference']) ? $options['readPreference'] : $this->manager->getReadPreference();
$this->typeMap = isset($options['typeMap']) ? $options['typeMap'] : null; $this->typeMap = isset($options['typeMap']) ? $options['typeMap'] : self::$defaultTypeMap;
$this->writeConcern = isset($options['writeConcern']) ? $options['writeConcern'] : $this->manager->getWriteConcern(); $this->writeConcern = isset($options['writeConcern']) ? $options['writeConcern'] : $this->manager->getWriteConcern();
} }
......
...@@ -20,6 +20,12 @@ use MongoDB\Operation\ListCollections; ...@@ -20,6 +20,12 @@ use MongoDB\Operation\ListCollections;
class Database class Database
{ {
private static $defaultTypeMap = [
'array' => 'MongoDB\Model\BSONArray',
'document' => 'MongoDB\Model\BSONDocument',
'root' => 'MongoDB\Model\BSONDocument',
];
private $databaseName; private $databaseName;
private $manager; private $manager;
private $readConcern; private $readConcern;
...@@ -80,7 +86,7 @@ class Database ...@@ -80,7 +86,7 @@ class Database
$this->databaseName = (string) $databaseName; $this->databaseName = (string) $databaseName;
$this->readConcern = isset($options['readConcern']) ? $options['readConcern'] : $this->manager->getReadConcern(); $this->readConcern = isset($options['readConcern']) ? $options['readConcern'] : $this->manager->getReadConcern();
$this->readPreference = isset($options['readPreference']) ? $options['readPreference'] : $this->manager->getReadPreference(); $this->readPreference = isset($options['readPreference']) ? $options['readPreference'] : $this->manager->getReadPreference();
$this->typeMap = isset($options['typeMap']) ? $options['typeMap'] : null; $this->typeMap = isset($options['typeMap']) ? $options['typeMap'] : self::$defaultTypeMap;
$this->writeConcern = isset($options['writeConcern']) ? $options['writeConcern'] : $this->manager->getWriteConcern(); $this->writeConcern = isset($options['writeConcern']) ? $options['writeConcern'] : $this->manager->getWriteConcern();
} }
......
...@@ -115,9 +115,9 @@ class CollectionFunctionalTest extends FunctionalTestCase ...@@ -115,9 +115,9 @@ class CollectionFunctionalTest extends FunctionalTestCase
'sort' => ['x' => -1], 'sort' => ['x' => -1],
]; ];
$expected = (object) ['_id' => 3, 'x' => 33]; $expected = ['_id' => 3, 'x' => 33];
$this->assertEquals($expected, $this->collection->findOne($filter, $options)); $this->assertSameDocument($expected, $this->collection->findOne($filter, $options));
} }
public function testWithOptionsInheritsReadPreferenceAndWriteConcern() public function testWithOptionsInheritsReadPreferenceAndWriteConcern()
......
...@@ -32,9 +32,7 @@ abstract class FunctionalTestCase extends TestCase ...@@ -32,9 +32,7 @@ abstract class FunctionalTestCase extends TestCase
protected function assertCommandSucceeded($document) protected function assertCommandSucceeded($document)
{ {
if (is_object($document)) { $document = is_object($document) ? (array) $document : $document;
$document = get_object_vars($document);
}
$this->assertArrayHasKey('ok', $document); $this->assertArrayHasKey('ok', $document);
$this->assertEquals(1, $document['ok']); $this->assertEquals(1, $document['ok']);
...@@ -43,8 +41,8 @@ abstract class FunctionalTestCase extends TestCase ...@@ -43,8 +41,8 @@ abstract class FunctionalTestCase extends TestCase
protected function assertSameDocument($expectedDocument, $actualDocument) protected function assertSameDocument($expectedDocument, $actualDocument)
{ {
$this->assertEquals( $this->assertEquals(
($expectedDocument instanceof stdClass) ? (array) $expectedDocument : $expectedDocument, is_object($expectedDocument) ? (array) $expectedDocument : $expectedDocument,
($actualDocument instanceof stdClass) ? (array) $actualDocument : $actualDocument is_object($actualDocument) ? (array) $actualDocument : $actualDocument
); );
} }
...@@ -59,7 +57,7 @@ abstract class FunctionalTestCase extends TestCase ...@@ -59,7 +57,7 @@ abstract class FunctionalTestCase extends TestCase
} }
$normalizeRootDocuments = function($document) { $normalizeRootDocuments = function($document) {
return ($document instanceof stdClass) ? (array) $document : $document; return is_object($document) ? (array) $document : $document;
}; };
$this->assertEquals( $this->assertEquals(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment