Skip to content

Commit 8e37d53

Browse files
committed
Improve type of Collection Bulk Write operations
1 parent ed5c46b commit 8e37d53

File tree

4 files changed

+44
-90
lines changed

4 files changed

+44
-90
lines changed

psalm-baseline.xml

Lines changed: 22 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -449,107 +449,47 @@
449449
</MixedMethodCall>
450450
</file>
451451
<file src="src/Operation/BulkWrite.php">
452+
<LessSpecificReturnStatement>
453+
<code><![CDATA[$operations]]></code>
454+
</LessSpecificReturnStatement>
452455
<MixedArgument>
453-
<code><![CDATA[$args]]></code>
454-
<code><![CDATA[$args]]></code>
455-
<code><![CDATA[$args]]></code>
456-
<code><![CDATA[$args[0]]]></code>
457-
<code><![CDATA[$args[0]]]></code>
458-
<code><![CDATA[$args[0]]]></code>
459-
<code><![CDATA[$args[0]]]></code>
460-
<code><![CDATA[$args[1]]]></code>
461-
<code><![CDATA[$args[1]]]></code>
462-
<code><![CDATA[$args[1]]]></code>
463-
<code><![CDATA[$args[1]]]></code>
464-
<code><![CDATA[$args[1]]]></code>
465456
<code><![CDATA[$args[1]]]></code>
466457
<code><![CDATA[$args[1]]]></code>
467-
<code><![CDATA[$args[2]]]></code>
468458
</MixedArgument>
469-
<MixedArrayAccess>
470-
<code><![CDATA[$args[0]]]></code>
471-
<code><![CDATA[$args[0]]]></code>
472-
<code><![CDATA[$args[0]]]></code>
473-
<code><![CDATA[$args[0]]]></code>
474-
<code><![CDATA[$args[0]]]></code>
475-
<code><![CDATA[$args[0]]]></code>
476-
<code><![CDATA[$args[0]]]></code>
477-
<code><![CDATA[$args[0]]]></code>
478-
<code><![CDATA[$args[0]]]></code>
479-
<code><![CDATA[$args[1]]]></code>
480-
<code><![CDATA[$args[1]]]></code>
481-
<code><![CDATA[$args[1]]]></code>
482-
<code><![CDATA[$args[1]]]></code>
483-
<code><![CDATA[$args[1]]]></code>
484-
<code><![CDATA[$args[1]]]></code>
485-
<code><![CDATA[$args[1]]]></code>
486-
<code><![CDATA[$args[1]]]></code>
487-
<code><![CDATA[$args[1]]]></code>
488-
<code><![CDATA[$args[1]]]></code>
489-
<code><![CDATA[$args[1]]]></code>
490-
<code><![CDATA[$args[1]]]></code>
491-
<code><![CDATA[$args[1]]]></code>
492-
<code><![CDATA[$args[2]]]></code>
493-
<code><![CDATA[$args[2]]]></code>
494-
<code><![CDATA[$args[2]]]></code>
495-
<code><![CDATA[$args[2]]]></code>
496-
<code><![CDATA[$args[2]]]></code>
497-
<code><![CDATA[$args[2]]]></code>
498-
<code><![CDATA[$args[2]]]></code>
499-
<code><![CDATA[$args[2]['upsert']]]></code>
500-
<code><![CDATA[$args[2]['upsert']]]></code>
501-
<code><![CDATA[$args[2]['upsert']]]></code>
502-
<code><![CDATA[$args[2]['upsert']]]></code>
503-
</MixedArrayAccess>
504-
<MixedArrayAssignment>
505-
<code><![CDATA[$args[1]]]></code>
506-
<code><![CDATA[$args[1]]]></code>
507-
<code><![CDATA[$args[1]]]></code>
508-
<code><![CDATA[$args[1]]]></code>
509-
<code><![CDATA[$args[1]['limit']]]></code>
510-
<code><![CDATA[$args[2]]]></code>
511-
<code><![CDATA[$args[2]]]></code>
512-
<code><![CDATA[$args[2]]]></code>
513-
<code><![CDATA[$args[2]]]></code>
514-
<code><![CDATA[$args[2]]]></code>
515-
<code><![CDATA[$args[2]]]></code>
516-
<code><![CDATA[$args[2]['multi']]]></code>
517-
<code><![CDATA[$args[2]['multi']]]></code>
518-
<code><![CDATA[$operations[$i][$type][0]]]></code>
519-
<code><![CDATA[$operations[$i][$type][0]]]></code>
520-
<code><![CDATA[$operations[$i][$type][0]]]></code>
521-
<code><![CDATA[$operations[$i][$type][0]]]></code>
522-
<code><![CDATA[$operations[$i][$type][1]]]></code>
523-
<code><![CDATA[$operations[$i][$type][1]]]></code>
524-
<code><![CDATA[$operations[$i][$type][1]]]></code>
525-
<code><![CDATA[$operations[$i][$type][2]]]></code>
526-
<code><![CDATA[$operations[$i][$type][2]]]></code>
527-
</MixedArrayAssignment>
528459
<MixedAssignment>
529-
<code><![CDATA[$args]]></code>
530-
<code><![CDATA[$args]]></code>
531460
<code><![CDATA[$args[1]]]></code>
532-
<code><![CDATA[$args[2]]]></code>
533-
<code><![CDATA[$args[2]]]></code>
534461
<code><![CDATA[$insertedIds[$i]]]></code>
535462
<code><![CDATA[$operations[$i][$type][0]]]></code>
536463
<code><![CDATA[$operations[$i][$type][0]]]></code>
537464
<code><![CDATA[$operations[$i][$type][0]]]></code>
538465
<code><![CDATA[$operations[$i][$type][1]]]></code>
539-
<code><![CDATA[$operations[$i][$type][1]]]></code>
540-
<code><![CDATA[$operations[$i][$type][2]]]></code>
541-
<code><![CDATA[$operations[$i][$type][2]]]></code>
542466
<code><![CDATA[$options[$option]]]></code>
543467
<code><![CDATA[$options['session']]]></code>
544468
<code><![CDATA[$options['writeConcern']]]></code>
545469
</MixedAssignment>
546470
<MixedMethodCall>
547471
<code><![CDATA[isInTransaction]]></code>
548472
</MixedMethodCall>
549-
<MixedOperand>
550-
<code><![CDATA[$args[2]]]></code>
473+
<MoreSpecificReturnType>
474+
<code><![CDATA[list<OperationType>]]></code>
475+
</MoreSpecificReturnType>
476+
<NullArgument>
477+
<code><![CDATA[$type]]></code>
478+
</NullArgument>
479+
<PossiblyInvalidArgument>
480+
<code><![CDATA[$args[0]]]></code>
481+
<code><![CDATA[$args[1]]]></code>
482+
<code><![CDATA[$args[1]]]></code>
483+
</PossiblyInvalidArgument>
484+
<PossiblyNullArgument>
485+
<code><![CDATA[$args[1]]]></code>
486+
<code><![CDATA[$args[1]]]></code>
487+
</PossiblyNullArgument>
488+
<PossiblyUndefinedArrayOffset>
489+
<code><![CDATA[$args[1]]]></code>
490+
<code><![CDATA[$args[1]]]></code>
551491
<code><![CDATA[$args[2]]]></code>
552-
</MixedOperand>
492+
</PossiblyUndefinedArrayOffset>
553493
</file>
554494
<file src="src/Operation/ClientBulkWriteCommand.php">
555495
<MixedMethodCall>

src/Collection.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
use function is_array;
7878
use function strlen;
7979

80+
/** @psalm-import-type OperationType from BulkWrite */
8081
class Collection
8182
{
8283
private const DEFAULT_TYPE_MAP = [
@@ -254,7 +255,7 @@ public function aggregate(array|Pipeline $pipeline, array $options = []): Cursor
254255
* Executes multiple write operations.
255256
*
256257
* @see BulkWrite::__construct() for supported options
257-
* @param array[] $operations List of write operations
258+
* @param list<OperationType> $operations List of write operations
258259
* @param array $options Command options
259260
* @throws UnsupportedException if options are not supported by the selected server
260261
* @throws InvalidArgumentException for parameter/option parsing errors

src/Operation/BulkWrite.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
* Operation for executing multiple write operations.
4646
*
4747
* @see \MongoDB\Collection::bulkWrite()
48+
*
49+
* @psalm-type Document = object|array
50+
* @psalm-type OperationType = array{deleteMany: array{0: Document, 1?: array}}|array{deleteOne: array{0: Document, 1?: array}}|array{insertOne: array{0: Document}}|array{replaceOne: array{0: Document, 1: Document, 2?: array}}|array{updateMany: array{0: Document, 1: Document, 2?: array}}|array{updateOne: array{0: Document, 1: Document, 2?: array}}
4851
*/
4952
final class BulkWrite
5053
{
@@ -55,7 +58,7 @@ final class BulkWrite
5558
public const UPDATE_MANY = 'updateMany';
5659
public const UPDATE_ONE = 'updateOne';
5760

58-
/** @var array[] */
61+
/** @psalm-var list<OperationType> */
5962
private array $operations;
6063

6164
private array $options;
@@ -132,10 +135,11 @@ final class BulkWrite
132135
*
133136
* * writeConcern (MongoDB\Driver\WriteConcern): Write concern.
134137
*
135-
* @param string $databaseName Database name
136-
* @param string $collectionName Collection name
137-
* @param array[] $operations List of write operations
138-
* @param array $options Command options
138+
* @param string $databaseName Database name
139+
* @param string $collectionName Collection name
140+
* @param array $operations List of write operations
141+
* @psalm-param list<OperationType> $operations
142+
* @param array $options Command options
139143
* @throws InvalidArgumentException for parameter/option parsing errors
140144
*/
141145
public function __construct(private string $databaseName, private string $collectionName, array $operations, array $options = [])
@@ -276,8 +280,8 @@ private function createExecuteOptions(): array
276280
}
277281

278282
/**
279-
* @param array[] $operations
280-
* @return array[]
283+
* @psalm-param list<OperationType> $operations
284+
* @psalm-return list<OperationType>
281285
*/
282286
private function validateOperations(array $operations, ?DocumentCodec $codec, Encoder $builderEncoder): array
283287
{

tests/Operation/BulkWriteTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@ public function testMultipleOperationsInOneElement(): void
4141
]);
4242
}
4343

44+
public function testEmptyOperation(): void
45+
{
46+
$this->expectException(InvalidArgumentException::class);
47+
$this->expectExceptionMessage('Expected one element in $operation[0], actually: 0');
48+
new BulkWrite($this->getDatabaseName(), $this->getCollectionName(), [
49+
[],
50+
]);
51+
}
52+
4453
public function testUnknownOperation(): void
4554
{
4655
$this->expectException(InvalidArgumentException::class);

0 commit comments

Comments
 (0)