From 30fccf8e8346b61f8fa91deba605dc80411c3324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Paris?= Date: Fri, 13 Oct 2017 22:24:08 +0200 Subject: [PATCH 1/4] Proove orphan-removal on many-to-one is useless --- .../Models/OrnementalOrphanRemoval/Person.php | 8 ++ .../OrnementalOrphanRemoval/PhoneNumber.php | 11 +++ .../Functional/ManyToOneOrphanRemovalTest.php | 83 +++++++++++++++++++ ...els.OrnementalOrphanRemoval.Person.dcm.xml | 12 +++ ...rnementalOrphanRemoval.PhoneNumber.dcm.xml | 13 +++ .../Doctrine/Tests/OrmFunctionalTestCase.php | 13 ++- 6 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/Person.php create mode 100644 tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/PhoneNumber.php create mode 100644 tests/Doctrine/Tests/ORM/Functional/ManyToOneOrphanRemovalTest.php create mode 100644 tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml create mode 100644 tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml diff --git a/tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/Person.php b/tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/Person.php new file mode 100644 index 000000000..68904001d --- /dev/null +++ b/tests/Doctrine/Tests/Models/OrnementalOrphanRemoval/Person.php @@ -0,0 +1,8 @@ + [ + Person::class, + PhoneNumber::class, + ] + ]; + + protected function setUp() + { + $this->useModelSet('ornemental_orphan_removal'); + + parent::setUp(); + + $person = new Person; + + $phone1 = new PhoneNumber; + $phone1->phonenumber = '123456'; + + $phone2 = new PhoneNumber; + $phone2->phonenumber = '234567'; + + $phone1->person = $person; + $phone2->person = $person; + + $this->_em->persist($phone1); + $this->_em->persist($phone2); + $this->_em->persist($person); + $this->_em->flush(); + + $this->personId = $person->id; + $this->_em->clear(); + } + + public function testOrphanRemovalIsPurelyOrnemental() + { + $person = $this->_em->getReference(Person::class, $this->personId); + + $this->_em->remove($person); + $this->_em->flush(); + $this->_em->clear(); + + $query = $this->_em->createQuery( + 'SELECT u FROM Doctrine\Tests\Models\OrnementalOrphanRemoval\Person u' + ); + $result = $query->getResult(); + + $this->assertEquals(0, count($result), 'Person should be removed by EntityManager'); + + $query = $this->_em->createQuery( + 'SELECT p FROM Doctrine\Tests\Models\OrnementalOrphanRemoval\PhoneNumber p' + ); + $result = $query->getResult(); + + $this->assertEquals(2, count($result), 'Orphan removal should not kick in'); + } + + protected function _getEntityManager( + Connection $connection = null, + MappingDriver $mappingDriver = null + ) { + return parent::_getEntityManager($connection, new XmlDriver( + __DIR__.DIRECTORY_SEPARATOR.'xml' + )); + } +} diff --git a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml new file mode 100644 index 000000000..feb77552a --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml new file mode 100644 index 000000000..a9eb1eee6 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/tests/Doctrine/Tests/OrmFunctionalTestCase.php b/tests/Doctrine/Tests/OrmFunctionalTestCase.php index e9299b1c6..d45ebac63 100644 --- a/tests/Doctrine/Tests/OrmFunctionalTestCase.php +++ b/tests/Doctrine/Tests/OrmFunctionalTestCase.php @@ -3,6 +3,7 @@ namespace Doctrine\Tests; use Doctrine\Common\Cache\ArrayCache; +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver; use Doctrine\DBAL\Driver\Connection; use Doctrine\DBAL\Driver\PDOSqlite\Driver as SqliteDriver; use Doctrine\DBAL\Logging\DebugStack; @@ -488,6 +489,11 @@ abstract class OrmFunctionalTestCase extends OrmTestCase $conn->executeUpdate('DELETE FROM ddc3346_users'); } + if (isset($this->_usedModelSets['ornemental_orphan_removal'])) { + $conn->executeUpdate('DELETE FROM ornemental_orphan_removal_person'); + $conn->executeUpdate('DELETE FROM ornemental_orphan_removal_phone_number'); + } + if (isset($this->_usedModelSets['quote'])) { $conn->executeUpdate( sprintf( @@ -678,7 +684,10 @@ abstract class OrmFunctionalTestCase extends OrmTestCase * * @throws \Doctrine\ORM\ORMException */ - protected function _getEntityManager(Connection $connection = null) { + protected function _getEntityManager( + Connection $connection = null, + MappingDriver $mappingDriver = null + ) { // NOTE: Functional tests use their own shared metadata cache, because // the actual database platform used during execution has effect on some // metadata mapping behaviors (like the choice of the ID generation). @@ -732,7 +741,7 @@ abstract class OrmFunctionalTestCase extends OrmTestCase } $config->setMetadataDriverImpl( - $config->newDefaultAnnotationDriver( + $mappingDriver ?? $config->newDefaultAnnotationDriver( [ realpath(__DIR__ . '/Models/Cache'), realpath(__DIR__ . '/Models/GeoNames') From 6b5c97055c07728cf0dec816e9c6b3cbf4a22bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Paris?= Date: Sat, 14 Oct 2017 11:03:52 +0200 Subject: [PATCH 2/4] Set null on delete, at database level --- ...e.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml index a9eb1eee6..87168315c 100644 --- a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml @@ -8,6 +8,8 @@ - + + + From 57e9feffb29b6b80fa4cd5ecd3cba5d80e96e96f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Paris?= Date: Sat, 14 Oct 2017 11:11:58 +0200 Subject: [PATCH 3/4] Avoid uuid generation pg needs an extra module to do this, so let's spare us that and set them manually. --- .../Tests/ORM/Functional/ManyToOneOrphanRemovalTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Doctrine/Tests/ORM/Functional/ManyToOneOrphanRemovalTest.php b/tests/Doctrine/Tests/ORM/Functional/ManyToOneOrphanRemovalTest.php index 4fbb51cb1..36039b2b2 100644 --- a/tests/Doctrine/Tests/ORM/Functional/ManyToOneOrphanRemovalTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/ManyToOneOrphanRemovalTest.php @@ -30,11 +30,14 @@ class ManyToOneOrphanRemovalTest extends OrmFunctionalTestCase parent::setUp(); $person = new Person; + $person->id = 'ca41a293-799f-4d68-bf79-626c3ad223ec'; $phone1 = new PhoneNumber; + $phone1->id = 'f4132478-c492-4dfe-aab5-a5b79ae129e7'; $phone1->phonenumber = '123456'; $phone2 = new PhoneNumber; + $phone2->id = '7faa4cd3-a155-4fbf-bc42-aa4269a4454d'; $phone2->phonenumber = '234567'; $phone1->person = $person; From ffd3d34f34b324f732e8b36736b27dcf868db7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Paris?= Date: Sat, 14 Oct 2017 11:25:09 +0200 Subject: [PATCH 4/4] Disable uuid generation Apparently, setting a value by hand is not enough to avoid it. --- ...Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml | 2 +- ...ine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml index feb77552a..6d151af12 100644 --- a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.Person.dcm.xml @@ -6,7 +6,7 @@ https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd"> - + diff --git a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml index 87168315c..2e404254a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Functional/xml/Doctrine.Tests.Models.OrnementalOrphanRemoval.PhoneNumber.dcm.xml @@ -6,7 +6,7 @@ https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd"> - +