From f1246d57c2509886152cc715ba5e913beb1566be Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Tue, 21 May 2024 12:30:01 +0200 Subject: [PATCH 1/4] Fix return type of Query::getLockMode() (#11462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … for DBAL 4 --- src/Query.php | 5 +++-- tests/Tests/ORM/Query/QueryTest.php | 30 +++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/Query.php b/src/Query.php index 5b0ceb7a97c..a869316d3e7 100644 --- a/src/Query.php +++ b/src/Query.php @@ -635,9 +635,10 @@ public function setLockMode(LockMode|int $lockMode): self /** * Get the current lock mode for this query. * - * @return int|null The current lock mode of this query or NULL if no specific lock mode is set. + * @return LockMode|int|null The current lock mode of this query or NULL if no specific lock mode is set. + * @psalm-return LockMode::*|null */ - public function getLockMode(): int|null + public function getLockMode(): LockMode|int|null { $lockMode = $this->getHint(self::HINT_LOCK_MODE); diff --git a/tests/Tests/ORM/Query/QueryTest.php b/tests/Tests/ORM/Query/QueryTest.php index 0336c3da6c8..961aafd32ed 100644 --- a/tests/Tests/ORM/Query/QueryTest.php +++ b/tests/Tests/ORM/Query/QueryTest.php @@ -12,9 +12,12 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Driver; use Doctrine\DBAL\Driver\Result; +use Doctrine\DBAL\LockMode; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\Query; use Doctrine\ORM\Query\Parameter; use Doctrine\ORM\Query\QueryException; use Doctrine\ORM\UnitOfWork; @@ -39,8 +42,7 @@ class QueryTest extends OrmTestCase { - /** @var EntityManagerMock */ - protected $entityManager; + private EntityManagerMock $entityManager; protected function setUp(): void { @@ -80,6 +82,30 @@ public function testSetParameters(): void self::assertEquals($parameters, $query->getParameters()); } + /** @psalm-param LockMode::* $lockMode */ + #[DataProvider('provideLockModes')] + public function testSetLockMode(LockMode|int $lockMode): void + { + $query = $this->entityManager->wrapInTransaction(static function (EntityManagerInterface $em) use ($lockMode): Query { + $query = $em->createQuery('select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1'); + $query->setLockMode($lockMode); + + return $query; + }); + + self::assertSame($lockMode, $query->getLockMode()); + self::assertSame($lockMode, $query->getHint(Query::HINT_LOCK_MODE)); + } + + /** @psalm-return list */ + public static function provideLockModes(): array + { + return [ + [LockMode::PESSIMISTIC_READ], + [LockMode::PESSIMISTIC_WRITE], + ]; + } + public function testFree(): void { $query = $this->entityManager->createQuery('select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1'); From ee4b03aa788840d090a915c83029b1d8f7d75d62 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Tue, 21 May 2024 12:30:16 +0200 Subject: [PATCH 2/4] Backport test for Query::setLockMode() (#11463) --- tests/Tests/ORM/Query/QueryTest.php | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/Tests/ORM/Query/QueryTest.php b/tests/Tests/ORM/Query/QueryTest.php index 7a1ffa0d702..b1c72f4ad14 100644 --- a/tests/Tests/ORM/Query/QueryTest.php +++ b/tests/Tests/ORM/Query/QueryTest.php @@ -13,10 +13,13 @@ use Doctrine\DBAL\ArrayParameterType; use Doctrine\DBAL\Cache\QueryCacheProfile; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\LockMode; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Types\Types; use Doctrine\Deprecations\PHPUnit\VerifyDeprecations; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Internal\Hydration\IterableResult; +use Doctrine\ORM\Query; use Doctrine\ORM\Query\Parameter; use Doctrine\ORM\Query\QueryException; use Doctrine\ORM\UnitOfWork; @@ -88,6 +91,33 @@ public function testSetParameters(): void self::assertEquals($parameters, $query->getParameters()); } + /** + * @psalm-param LockMode::* $lockMode + * + * @dataProvider provideLockModes + */ + public function testSetLockMode(int $lockMode): void + { + $query = $this->entityManager->wrapInTransaction(static function (EntityManagerInterface $em) use ($lockMode): Query { + $query = $em->createQuery('select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1'); + $query->setLockMode($lockMode); + + return $query; + }); + + self::assertSame($lockMode, $query->getLockMode()); + self::assertSame($lockMode, $query->getHint(Query::HINT_LOCK_MODE)); + } + + /** @psalm-return list */ + public static function provideLockModes(): array + { + return [ + [LockMode::PESSIMISTIC_READ], + [LockMode::PESSIMISTIC_WRITE], + ]; + } + public function testFree(): void { $query = $this->entityManager->createQuery('select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1'); From 552eae37a3bada11e5262e9dc860167c95e9b1b1 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Tue, 21 May 2024 12:30:36 +0200 Subject: [PATCH 3/4] Test with actual lock modes (#11465) --- .../Entity/EntityPersisterTestCase.php | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php b/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php index 6b5ea40a589..9294df28e15 100644 --- a/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php +++ b/tests/Tests/ORM/Cache/Persister/Entity/EntityPersisterTestCase.php @@ -6,6 +6,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Criteria; +use Doctrine\DBAL\LockMode; use Doctrine\ORM\Cache\Persister\CachedPersister; use Doctrine\ORM\Cache\Persister\Entity\AbstractEntityPersister; use Doctrine\ORM\Cache\Persister\Entity\CachedEntityPersister; @@ -99,7 +100,7 @@ public function testInvokeGetSelectSQL(): void ->with( self::identicalTo(['name' => 'Foo']), self::identicalTo([0]), - self::identicalTo(1), + self::identicalTo(LockMode::OPTIMISTIC), self::identicalTo(2), self::identicalTo(3), self::identicalTo([4]) @@ -109,7 +110,7 @@ public function testInvokeGetSelectSQL(): void self::assertSame('SELECT * FROM foo WERE name = ?', $persister->getSelectSQL( ['name' => 'Foo'], [0], - 1, + LockMode::OPTIMISTIC, 2, 3, [4] @@ -228,13 +229,21 @@ public function testInvokeLoad(): void self::identicalTo($entity), self::identicalTo([0]), self::identicalTo([1]), - self::identicalTo(2), + self::identicalTo(LockMode::PESSIMISTIC_READ), self::identicalTo(3), self::identicalTo([4]) ) ->willReturn($entity); - self::assertSame($entity, $persister->load(['id' => 1], $entity, [0], [1], 2, 3, [4])); + self::assertSame($entity, $persister->load( + ['id' => 1], + $entity, + [0], + [1], + LockMode::PESSIMISTIC_READ, + 3, + [4] + )); } public function testInvokeLoadAll(): void @@ -391,9 +400,9 @@ public function testInvokeLock(): void $this->entityPersister->expects(self::once()) ->method('lock') - ->with(self::identicalTo($identifier), self::identicalTo(1)); + ->with(self::identicalTo($identifier), self::identicalTo(LockMode::OPTIMISTIC)); - $persister->lock($identifier, 1); + $persister->lock($identifier, LockMode::OPTIMISTIC); } public function testInvokeExists(): void From 11270425e5f00f30faf8d54a09d56b8d79bf41e9 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Tue, 21 May 2024 12:30:56 +0200 Subject: [PATCH 4/4] Fix failed merge (#11464) --- src/UnitOfWork.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UnitOfWork.php b/src/UnitOfWork.php index d1659de272b..4ec0906843b 100644 --- a/src/UnitOfWork.php +++ b/src/UnitOfWork.php @@ -2653,7 +2653,7 @@ private function eagerLoadCollections(array $collections, ToManyInverseSideMappi $entities[] = $collection->getOwner(); } - $found = $this->getEntityPersister($targetEntity)->loadAll([$mappedBy => $entities], $mapping['orderBy'] ?? null); + $found = $this->getEntityPersister($targetEntity)->loadAll([$mappedBy => $entities], $mapping->orderBy); $targetClass = $this->em->getClassMetadata($targetEntity); $targetProperty = $targetClass->getReflectionProperty($mappedBy);