PHPLIB-1505 Add driver option builderEncoder#1382
Conversation
| $client = new Client(static::getUri(), $uriOptions); | ||
| $driverOptions = [ | ||
| 'builderEncoder' => $builderEncoder = $this->createMock(Encoder::class), | ||
| 'typeMap' => ['root' => 'array'], |
There was a problem hiding this comment.
typeMap option was not tested here.
| protected function getInvalidArrayValues(bool $includeNull = false): array | ||
| { | ||
| return array_merge([123, 3.14, 'foo', true, new stdClass()], $includeNull ? [null] : []); | ||
| return [123, 3.14, 'foo', true, new stdClass(), ...($includeNull ? [null] : [])]; |
There was a problem hiding this comment.
Reformatting data provider using array unpacking.
There was a problem hiding this comment.
I feel bad for forgetting PHP has this feature now 😅
55bbda4 to
fe5e143
Compare
fe5e143 to
43d6c74
Compare
alcaeus
left a comment
There was a problem hiding this comment.
I'd suggest making the encoder property readonly, but LGTM other than that.
src/Client.php
Outdated
| * | ||
| * Supported driver-specific options: | ||
| * | ||
| * * builderEncoder (MongoDB\Builder\Encoder): Encoder for query builder |
There was a problem hiding this comment.
Suggestion to call out there's a default value being used:
| * * builderEncoder (MongoDB\Builder\Encoder): Encoder for query builder | |
| * * builderEncoder (MongoDB\Builder\Encoder): Encoder for query and aggregation builders. If not given, the default encoder will be used. |
If you accept this, it would make sense to apply this to the Database and Collection classes as well.
src/Client.php
Outdated
|
|
||
| private array $typeMap; | ||
|
|
||
| private Encoder $builderEncoder; |
There was a problem hiding this comment.
PHP 8.1 allows us to make this readonly:
| private Encoder $builderEncoder; | |
| private readonly Encoder $builderEncoder; |
There was a problem hiding this comment.
Also, just thought of this after seeing the Psalm errors in the follow-up PR, but specifying a template for the Encoder might be helpful:
| private Encoder $builderEncoder; | |
| /** @psalm-var Encoder<array|stdClass|Document|PackedArray, mixed> */ | |
| private readonly Encoder $builderEncoder; |
There was a problem hiding this comment.
I had to check the Encoder interface template types. Seems correct.
| protected function getInvalidArrayValues(bool $includeNull = false): array | ||
| { | ||
| return array_merge([123, 3.14, 'foo', true, new stdClass()], $includeNull ? [null] : []); | ||
| return [123, 3.14, 'foo', true, new stdClass(), ...($includeNull ? [null] : [])]; |
There was a problem hiding this comment.
I feel bad for forgetting PHP has this feature now 😅
43d6c74 to
c8571a7
Compare
c8571a7 to
c767ffe
Compare
| $driverOptions['driver'] = $this->mergeDriverInfo($driverOptions['driver'] ?? []); | ||
|
|
||
| $this->uri = $uri ?? self::DEFAULT_URI; | ||
| $this->builderEncoder = $driverOptions['builderEncoder'] ?? new BuilderEncoder(); |
Check notice
Code scanning / Psalm
MixedPropertyTypeCoercion
| throw InvalidArgumentException::invalidType('"writeConcern" option', $options['writeConcern'], WriteConcern::class); | ||
| } | ||
|
|
||
| $this->builderEncoder = $options['builderEncoder'] ?? new BuilderEncoder(); |
Check notice
Code scanning / Psalm
MixedPropertyTypeCoercion
| throw InvalidArgumentException::invalidType('"writeConcern" option', $options['writeConcern'], WriteConcern::class); | ||
| } | ||
|
|
||
| $this->builderEncoder = $options['builderEncoder'] ?? new BuilderEncoder(); |
Check notice
Code scanning / Psalm
MixedPropertyTypeCoercion
* v1.x: (87 commits) Performance: Keep collections and indexes between GridFS tests (#1421) Add final annotations to non-internal Operation classes (#1410) Fix types accepted by $round (#1401) Replace arrayHasKey with assertArrayHasKey in tests (#1403) PHPLIB-1514 Make data providers static (#1404) PHPLIB-1515 Replace assertObjectHasAttribute with assertObjectHasProperty (#1405) Restore Prose22_RangeExplicitEncryptionTest (#1400) Remove Prose22_RangeExplicitEncryptionTest that requires ext-mongodb < 1.20 (#1394) Use `match` instead of `switch` when a simple value is returned (#1393) Remove PHPUnit functions polyfill (#1395) Update branch names for GHA workflows (#1390) PHPLIB-1419 Encode Agg builder objects in Collection methods (#1383) PHPLIB-1420 Integrate query builder for non-aggregation APIs (#1385) Fix optional parameter declared before required parameter (#1384) PHPLIB-1505 Add driver option "builderEncoder" (#1382) Exclude rector.php from the artifact Check generated files are up-to-date Replace composer package mongodb/builder Skip Pedentry method sort for generated files Remove composer constraints already imposed by the main package ...
* v1.x: (90 commits) Merge v1.20 into v1.x (#1447) PHPLIB-1525 Removes dependency to Symfony PHPUnit bridge (#1413) Change deprecated assertObjectHasAttribute to assertObjectHasProperty (#1432) Performance: Keep collections and indexes between GridFS tests (#1421) Add final annotations to non-internal Operation classes (#1410) Fix types accepted by $round (#1401) Replace arrayHasKey with assertArrayHasKey in tests (#1403) PHPLIB-1514 Make data providers static (#1404) PHPLIB-1515 Replace assertObjectHasAttribute with assertObjectHasProperty (#1405) Restore Prose22_RangeExplicitEncryptionTest (#1400) Remove Prose22_RangeExplicitEncryptionTest that requires ext-mongodb < 1.20 (#1394) Use `match` instead of `switch` when a simple value is returned (#1393) Remove PHPUnit functions polyfill (#1395) Update branch names for GHA workflows (#1390) PHPLIB-1419 Encode Agg builder objects in Collection methods (#1383) PHPLIB-1420 Integrate query builder for non-aggregation APIs (#1385) Fix optional parameter declared before required parameter (#1384) PHPLIB-1505 Add driver option "builderEncoder" (#1382) Exclude rector.php from the artifact Check generated files are up-to-date ...
* v1.x: (90 commits) Merge v1.20 into v1.x (#1447) PHPLIB-1525 Removes dependency to Symfony PHPUnit bridge (#1413) Change deprecated assertObjectHasAttribute to assertObjectHasProperty (#1432) Performance: Keep collections and indexes between GridFS tests (#1421) Add final annotations to non-internal Operation classes (#1410) Fix types accepted by $round (#1401) Replace arrayHasKey with assertArrayHasKey in tests (#1403) PHPLIB-1514 Make data providers static (#1404) PHPLIB-1515 Replace assertObjectHasAttribute with assertObjectHasProperty (#1405) Restore Prose22_RangeExplicitEncryptionTest (#1400) Remove Prose22_RangeExplicitEncryptionTest that requires ext-mongodb < 1.20 (#1394) Use `match` instead of `switch` when a simple value is returned (#1393) Remove PHPUnit functions polyfill (#1395) Update branch names for GHA workflows (#1390) PHPLIB-1419 Encode Agg builder objects in Collection methods (#1383) PHPLIB-1420 Integrate query builder for non-aggregation APIs (#1385) Fix optional parameter declared before required parameter (#1384) PHPLIB-1505 Add driver option "builderEncoder" (#1382) Exclude rector.php from the artifact Check generated files are up-to-date ...
Fix PHPLIB-1505
The new option
builderEncodercontains aMongoDB\Codec\Encoderobject that will be used to encode queries and pipelines. When not set, it defaults to a new instance ofMongoDB\Builder\BuilderEncoder.