Skip to content

Commit 33cb62e

Browse files
committed
Write API implemented in Collection class
1 parent 6067f55 commit 33cb62e

28 files changed

+358
-53
lines changed

src/Collection.php

Lines changed: 136 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,19 @@
22

33
namespace Tequilla\MongoDB;
44

5-
use Tequilla\MongoDB\BulkWrite\BulkWrite;
6-
use Tequilla\MongoDB\WriteModel\WriteModelInterface;
5+
use Tequilla\MongoDB\Write\Bulk\BulkWrite;
6+
use Tequilla\MongoDB\Write\Bulk\BulkWriteOptions;
7+
use Tequilla\MongoDB\Write\Model\DeleteMany;
8+
use Tequilla\MongoDB\Write\Model\DeleteOne;
9+
use Tequilla\MongoDB\Write\Model\InsertOne;
10+
use Tequilla\MongoDB\Write\Model\ReplaceOne;
11+
use Tequilla\MongoDB\Write\Model\UpdateMany;
12+
use Tequilla\MongoDB\Write\Model\UpdateOne;
13+
use Tequilla\MongoDB\Write\Model\WriteModelInterface;
14+
use Tequilla\MongoDB\Write\Result\DeleteResult;
15+
use Tequilla\MongoDB\Write\Result\InsertManyResult;
16+
use Tequilla\MongoDB\Write\Result\InsertOneResult;
17+
use Tequilla\MongoDB\Write\Result\UpdateResult;
718

819
class Collection
920
{
@@ -39,12 +50,134 @@ public function __construct(Connection $connection, $databaseName, $collectionNa
3950
/**
4051
* @param WriteModelInterface[] $requests
4152
* @param array $options
42-
* @return \Tequilla\MongoDB\BulkWrite\BulkWriteResult
53+
* @return \Tequilla\MongoDB\Write\Bulk\BulkWriteResult
4354
*/
4455
public function bulkWrite(array $requests, array $options = [])
4556
{
57+
$options = $options + ['writeConcern' => $this->getWriteConcern()];
4658
$bulk = new BulkWrite($requests, $options);
4759

4860
return $bulk->execute($this->connection, $this->databaseName, $this->name);
4961
}
62+
63+
/**
64+
* @param array|object $document
65+
* @param array $options
66+
* @return InsertOneResult
67+
*/
68+
public function insertOne($document, array $options = [])
69+
{
70+
71+
$model = new InsertOne($document);
72+
$bulkWriteResult = $this->bulkWrite([$model], $options);
73+
74+
return new InsertOneResult($bulkWriteResult);
75+
}
76+
77+
/**
78+
* @param array|\Traversable $documents
79+
* @param array $options
80+
* @return InsertManyResult
81+
*/
82+
public function insertMany($documents, array $options = [])
83+
{
84+
$models = [];
85+
86+
foreach ($documents as $document) {
87+
$models[] = new InsertOne($document);
88+
}
89+
90+
$bulkWriteResult = $this->bulkWrite($models, $options);
91+
92+
return new InsertManyResult($bulkWriteResult);
93+
}
94+
95+
/**
96+
* @param array|object $filter
97+
* @param array $options
98+
* @return DeleteResult
99+
*/
100+
public function deleteOne($filter, array $options = [])
101+
{
102+
list($bulkOptions, $options) = $this->extractBulkWriteOptions($options);
103+
$model = new DeleteOne($filter, $options);
104+
$bulkWriteResult = $this->bulkWrite([$model], $bulkOptions);
105+
106+
return new DeleteResult($bulkWriteResult);
107+
}
108+
109+
/**
110+
* @param array|object $filter
111+
* @param array $options
112+
* @return DeleteResult
113+
*/
114+
public function deleteMany($filter, array $options = [])
115+
{
116+
list($bulkOptions, $options) = $this->extractBulkWriteOptions($options);
117+
$model = new DeleteMany($filter, $options);
118+
$bulkWriteResult = $this->bulkWrite([$model], $bulkOptions);
119+
120+
return new DeleteResult($bulkWriteResult);
121+
}
122+
123+
/**
124+
* @param array|object $filter
125+
* @param $update
126+
* @param array $options
127+
* @return UpdateResult
128+
*/
129+
public function updateOne($filter, $update, array $options = [])
130+
{
131+
list($bulkOptions, $options) = $this->extractBulkWriteOptions($options);
132+
$model = new UpdateOne($filter, $update, $options);
133+
134+
$bulkWriteResult = $this->bulkWrite([$model], $bulkOptions);
135+
136+
return new UpdateResult($bulkWriteResult);
137+
}
138+
139+
/**
140+
* @param array|object $filter
141+
* @param $update
142+
* @param array $options
143+
* @return UpdateResult
144+
*/
145+
public function updateMany($filter, $update, array $options = [])
146+
{
147+
list($bulkOptions, $options) = $this->extractBulkWriteOptions($options);
148+
$model = new UpdateMany($filter, $update, $options);
149+
150+
$bulkWriteResult = $this->bulkWrite([$model], $bulkOptions);
151+
152+
return new UpdateResult($bulkWriteResult);
153+
}
154+
155+
/**
156+
* @param array|object $filter
157+
* @param array|object $replacement
158+
* @param array $options
159+
* @return UpdateResult
160+
*/
161+
public function replaceOne($filter, $replacement, array $options = [])
162+
{
163+
list($bulkOptions, $options) = $this->extractBulkWriteOptions($options);
164+
$model = new ReplaceOne($filter, $replacement, $options);
165+
166+
$bulkWriteResult = $this->bulkWrite([$model], $bulkOptions);
167+
168+
return new UpdateResult($bulkWriteResult);
169+
}
170+
171+
/**
172+
* @param array $options
173+
* @return array
174+
*/
175+
private function extractBulkWriteOptions(array $options)
176+
{
177+
$resolver = BulkWriteOptions::getCachedResolver();
178+
$bulkWriteOptions = array_intersect_key($options, array_flip($resolver->getDefinedOptions()));
179+
$operationOptions = array_diff_key($options, $bulkWriteOptions);
180+
181+
return [$bulkWriteOptions, $operationOptions];
182+
}
50183
}

src/CollectionInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Tequilla\MongoDB;
44

5-
use Tequilla\MongoDB\BulkWrite\BulkWriteResult;
5+
use Tequilla\MongoDB\Write\Bulk\BulkWriteResult;
66

77
interface CollectionInterface
88
{
@@ -17,7 +17,7 @@ public function find(array $filter, array $options = []);
1717
/**
1818
* @param array $requests
1919
* @param array $options
20-
* @return BulkWriteResult
20+
* @return \Tequilla\MongoDB\Write\Bulk\BulkWriteResult
2121
*/
2222
public function bulkWrite(array $requests, array $options = []);
2323

src/BulkWrite/BulkWrite.php renamed to src/Write/Bulk/BulkWrite.php

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\BulkWrite;
3+
namespace Tequilla\MongoDB\Write\Bulk;
44

55
use MongoDB\BSON\ObjectID;
66
use MongoDB\BSON\Serializable;
77
use MongoDB\Driver\BulkWrite as Bulk;
88
use MongoDB\Driver\Exception\Exception as MongoDBException;
9+
use MongoDB\Driver\WriteConcern;
910
use Tequilla\MongoDB\Connection;
1011
use Tequilla\MongoDB\Exception\InvalidArgumentException;
1112
use Tequilla\MongoDB\Exception\RuntimeException;
12-
use Tequilla\MongoDB\Options\Write\BulkWriteOptions;
1313
use Tequilla\MongoDB\Util\TypeUtils;
14-
use Tequilla\MongoDB\WriteModel\WriteModelInterface;
14+
use Tequilla\MongoDB\Write\Model\WriteModelInterface;
1515

1616
class BulkWrite
1717
{
1818
/**
19-
* @var WriteModelInterface[]
19+
* @var \Tequilla\MongoDB\Write\Model\WriteModelInterface[]
2020
*/
2121
private $requests;
2222

@@ -36,14 +36,25 @@ class BulkWrite
3636
private $insertedIds = [];
3737

3838
/**
39-
* @param WriteModelInterface[] $requests
39+
* @var WriteConcern
40+
*/
41+
private $writeConcern;
42+
43+
/**
44+
* @param \Tequilla\MongoDB\Write\Model\WriteModelInterface[] $requests
4045
* @param array $options
4146
*/
4247
public function __construct(array $requests, array $options)
4348
{
4449
self::validateRequests($requests);
4550
$this->requests = $requests;
4651
$this->options = BulkWriteOptions::getCachedResolver()->resolve($options);
52+
53+
if (isset($this->options['writeConcern'])) {
54+
$this->writeConcern = $this->options['writeConcern'];
55+
unset($this->options['writeConcern']);
56+
}
57+
4758
$this->bulk = new Bulk($this->options);
4859
}
4960

@@ -121,7 +132,12 @@ public function execute(Connection $connection, $databaseName, $collectionName)
121132
}
122133
}
123134

124-
$writeResult = $connection->executeBulkWrite($databaseName, $collectionName, $this->bulk);
135+
$writeResult = $connection->executeBulkWrite(
136+
$databaseName,
137+
$collectionName,
138+
$this->bulk,
139+
$this->writeConcern
140+
);
125141

126142
return new BulkWriteResult($writeResult, $this->insertedIds);
127143
}

src/Write/Bulk/BulkWriteBuilder.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Tequilla\MongoDB\Write\Bulk;
4+
5+
6+
class BulkWriteBuilder
7+
{
8+
9+
}

src/Options/Write/BulkWriteOptions.php renamed to src/Write/Bulk/BulkWriteOptions.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\Options\Write;
3+
namespace Tequilla\MongoDB\Write\Bulk;
44

5+
use MongoDB\Driver\WriteConcern;
56
use Symfony\Component\OptionsResolver\OptionsResolver;
67
use Tequilla\MongoDB\Options\ConfigurableInterface;
78
use Tequilla\MongoDB\Options\Traits\CachedResolverTrait;
@@ -15,11 +16,13 @@ public static function configureOptions(OptionsResolver $resolver)
1516
$resolver->setDefined([
1617
'bypassDocumentValidation',
1718
'ordered',
19+
'writeConcern',
1820
]);
1921

2022
$resolver
2123
->setAllowedTypes('bypassDocumentValidation', 'bool')
22-
->setAllowedTypes('ordered', 'bool');
24+
->setAllowedTypes('ordered', 'bool')
25+
->setAllowedTypes('writeConcern', WriteConcern::class);
2326

2427
$resolver
2528
->setDefault('bypassDocumentValidation', true)

src/BulkWrite/BulkWriteResult.php renamed to src/Write/Bulk/BulkWriteResult.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\BulkWrite;
3+
namespace Tequilla\MongoDB\Write\Bulk;
44

55
use MongoDB\Driver\WriteConcernError;
66
use MongoDB\Driver\WriteError;
@@ -104,7 +104,7 @@ public function getUpsertedIds()
104104
}
105105

106106
/**
107-
* @return WriteConcernError
107+
* @return WriteConcernError|null
108108
*/
109109
public function getWriteConcernError()
110110
{

src/WriteModel/DeleteMany.php renamed to src/Write/Model/DeleteMany.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\WriteModel;
3+
namespace Tequilla\MongoDB\Write\Model;
44

5-
use Tequilla\MongoDB\Options\Write\DeleteManyOptions;
5+
use Tequilla\MongoDB\Write\Options\DeleteManyOptions;
66
use Tequilla\MongoDB\Util\ValidatorUtils;
77

8-
class DeleteMany
8+
class DeleteMany implements WriteModelInterface
99
{
10-
use BulkDeleteTrait;
10+
use Traits\BulkDeleteTrait;
1111

1212
/**
1313
* @param array|object $filter

src/WriteModel/DeleteOne.php renamed to src/Write/Model/DeleteOne.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\WriteModel;
3+
namespace Tequilla\MongoDB\Write\Model;
44

5-
use Tequilla\MongoDB\Options\Write\DeleteOneOptions;
5+
use Tequilla\MongoDB\Write\Options\DeleteOneOptions;
66
use Tequilla\MongoDB\Util\ValidatorUtils;
77

88
class DeleteOne implements WriteModelInterface
99
{
10-
use BulkDeleteTrait;
10+
use Traits\BulkDeleteTrait;
1111

1212
/**
1313
* @param array|object $filter

src/WriteModel/InsertOne.php renamed to src/Write/Model/InsertOne.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\WriteModel;
3+
namespace Tequilla\MongoDB\Write\Model;
44

5-
use Tequilla\MongoDB\BulkWrite\BulkWrite;
6-
use Tequilla\MongoDB\WriteModel\WriteModelInterface;
5+
use Tequilla\MongoDB\Write\Bulk\BulkWrite;
76
use Tequilla\MongoDB\Util\ValidatorUtils;
87

98
class InsertOne implements WriteModelInterface

src/WriteModel/ReplaceOne.php renamed to src/Write/Model/ReplaceOne.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\WriteModel;
3+
namespace Tequilla\MongoDB\Write\Model;
44

5-
use Tequilla\MongoDB\BulkWrite\BulkWrite;
6-
use Tequilla\MongoDB\Options\Write\ReplaceOneOptions;
5+
use Tequilla\MongoDB\Write\Bulk\BulkWrite;
6+
use Tequilla\MongoDB\Write\Options\ReplaceOneOptions;
77
use Tequilla\MongoDB\Util\ValidatorUtils;
88

99
class ReplaceOne implements WriteModelInterface

src/WriteModel/BulkDeleteTrait.php renamed to src/Write/Model/Traits/BulkDeleteTrait.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\WriteModel;
3+
namespace Tequilla\MongoDB\Write\Model\Traits;
44

5-
use Tequilla\MongoDB\BulkWrite\BulkWrite;
5+
use Tequilla\MongoDB\Write\Bulk\BulkWrite;
66

77
trait BulkDeleteTrait
88
{

src/WriteModel/BulkUpdateTrait.php renamed to src/Write/Model/Traits/BulkUpdateTrait.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?php
22

3-
namespace Tequilla\MongoDB\WriteModel;
3+
namespace Tequilla\MongoDB\Write\Model\Traits;
44

5-
use Tequilla\MongoDB\BulkWrite\BulkWrite;
5+
use Tequilla\MongoDB\Write\Bulk\BulkWrite;
66

77
trait BulkUpdateTrait
88
{
@@ -24,7 +24,7 @@ trait BulkUpdateTrait
2424
/**
2525
* @see \Tequilla\MongoDB\WriteModel\WriteModelInterface::writeToBulk()
2626
*
27-
* @param BulkWrite $bulk
27+
* @param \Tequilla\MongoDB\Write\Bulk\BulkWrite $bulk
2828
*/
2929
public function writeToBulk(BulkWrite $bulk)
3030
{

0 commit comments

Comments
 (0)