Commit 52b81e99 authored by Jeremy Mikola's avatar Jeremy Mikola

PHPLIB-49: withOptions() clone method for Database and Collection

parent d13e1109
...@@ -598,4 +598,33 @@ class Collection ...@@ -598,4 +598,33 @@ class Collection
return $operation->execute($server); return $operation->execute($server);
} }
/**
* Get a clone of this collection with different options.
*
* Supported options:
*
* * readPreference (MongoDB\Driver\ReadPreference): The default read
* preference to use for collection operations. Defaults to this
* Collection's read preference.
*
* * writeConcern (MongoDB\Driver\WriteConcern): The default write concern
* to use for collection operations. Defaults to this Collection's write
* concern.
*
* @param array $options Collection constructor options
* @return Collection
*/
public function withOptions(array $options = [])
{
if ( ! isset($options['readPreference'])) {
$options['readPreference'] = $this->readPreference;
}
if ( ! isset($options['writeConcern'])) {
$options['writeConcern'] = $this->writeConcern;
}
return new Collection($this->manager, $this->databaseName . '.' . $this->collectionName, $options);
}
} }
...@@ -189,4 +189,33 @@ class Database ...@@ -189,4 +189,33 @@ class Database
return new Collection($this->manager, $this->databaseName . '.' . $collectionName, $options); return new Collection($this->manager, $this->databaseName . '.' . $collectionName, $options);
} }
/**
* Get a clone of this database with different options.
*
* Supported options:
*
* * readPreference (MongoDB\Driver\ReadPreference): The default read
* preference to use for database operations and selected collections.
* Defaults to this Database's read preference.
*
* * writeConcern (MongoDB\Driver\WriteConcern): The default write concern
* to use for database operations and selected collections. Defaults to
* this Database's write concern.
*
* @param array $options Database constructor options
* @return Database
*/
public function withOptions(array $options = [])
{
if ( ! isset($options['readPreference'])) {
$options['readPreference'] = $this->readPreference;
}
if ( ! isset($options['writeConcern'])) {
$options['writeConcern'] = $this->writeConcern;
}
return new Database($this->manager, $this->databaseName, $options);
}
} }
...@@ -4,6 +4,8 @@ namespace MongoDB\Tests\Collection; ...@@ -4,6 +4,8 @@ namespace MongoDB\Tests\Collection;
use MongoDB\Collection; use MongoDB\Collection;
use MongoDB\Driver\BulkWrite; use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\ReadPreference;
use MongoDB\Driver\WriteConcern;
/** /**
* Functional tests for the Collection class. * Functional tests for the Collection class.
...@@ -109,6 +111,39 @@ class CollectionFunctionalTest extends FunctionalTestCase ...@@ -109,6 +111,39 @@ class CollectionFunctionalTest extends FunctionalTestCase
$this->assertEquals($expected, $this->collection->findOne($filter, $options)); $this->assertEquals($expected, $this->collection->findOne($filter, $options));
} }
public function testWithOptionsInheritsReadPreferenceAndWriteConcern()
{
$collectionOptions = [
'readPreference' => new ReadPreference(ReadPreference::RP_SECONDARY_PREFERRED),
'writeConcern' => new WriteConcern(WriteConcern::MAJORITY),
];
$collection = new Collection($this->manager, $this->getNamespace(), $collectionOptions);
$clone = $collection->withOptions();
$debug = $clone->__debugInfo();
$this->assertInstanceOf('MongoDB\Driver\ReadPreference', $debug['readPreference']);
$this->assertSame(ReadPreference::RP_SECONDARY_PREFERRED, $debug['readPreference']->getMode());
$this->assertInstanceOf('MongoDB\Driver\WriteConcern', $debug['writeConcern']);
$this->assertSame(WriteConcern::MAJORITY, $debug['writeConcern']->getW());
}
public function testWithOptionsPassesReadPreferenceAndWriteConcern()
{
$collectionOptions = [
'readPreference' => new ReadPreference(ReadPreference::RP_SECONDARY_PREFERRED),
'writeConcern' => new WriteConcern(WriteConcern::MAJORITY),
];
$clone = $this->collection->withOptions($collectionOptions);
$debug = $clone->__debugInfo();
$this->assertInstanceOf('MongoDB\Driver\ReadPreference', $debug['readPreference']);
$this->assertSame(ReadPreference::RP_SECONDARY_PREFERRED, $debug['readPreference']->getMode());
$this->assertInstanceOf('MongoDB\Driver\WriteConcern', $debug['writeConcern']);
$this->assertSame(WriteConcern::MAJORITY, $debug['writeConcern']->getW());
}
/** /**
* Create data fixtures. * Create data fixtures.
* *
......
...@@ -109,4 +109,37 @@ class DatabaseFunctionalTest extends FunctionalTestCase ...@@ -109,4 +109,37 @@ class DatabaseFunctionalTest extends FunctionalTestCase
$this->assertInstanceOf('MongoDB\Driver\WriteConcern', $debug['writeConcern']); $this->assertInstanceOf('MongoDB\Driver\WriteConcern', $debug['writeConcern']);
$this->assertSame(WriteConcern::MAJORITY, $debug['writeConcern']->getW()); $this->assertSame(WriteConcern::MAJORITY, $debug['writeConcern']->getW());
} }
public function testWithOptionsInheritsReadPreferenceAndWriteConcern()
{
$databaseOptions = [
'readPreference' => new ReadPreference(ReadPreference::RP_SECONDARY_PREFERRED),
'writeConcern' => new WriteConcern(WriteConcern::MAJORITY),
];
$database = new Database($this->manager, $this->getDatabaseName(), $databaseOptions);
$clone = $database->withOptions();
$debug = $clone->__debugInfo();
$this->assertInstanceOf('MongoDB\Driver\ReadPreference', $debug['readPreference']);
$this->assertSame(ReadPreference::RP_SECONDARY_PREFERRED, $debug['readPreference']->getMode());
$this->assertInstanceOf('MongoDB\Driver\WriteConcern', $debug['writeConcern']);
$this->assertSame(WriteConcern::MAJORITY, $debug['writeConcern']->getW());
}
public function testWithOptionsPassesReadPreferenceAndWriteConcern()
{
$databaseOptions = [
'readPreference' => new ReadPreference(ReadPreference::RP_SECONDARY_PREFERRED),
'writeConcern' => new WriteConcern(WriteConcern::MAJORITY),
];
$clone = $this->database->withOptions($databaseOptions);
$debug = $clone->__debugInfo();
$this->assertInstanceOf('MongoDB\Driver\ReadPreference', $debug['readPreference']);
$this->assertSame(ReadPreference::RP_SECONDARY_PREFERRED, $debug['readPreference']->getMode());
$this->assertInstanceOf('MongoDB\Driver\WriteConcern', $debug['writeConcern']);
$this->assertSame(WriteConcern::MAJORITY, $debug['writeConcern']->getW());
}
} }
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