1
0
mirror of synced 2025-02-09 08:49:26 +03:00

Merge branch 'fix/#5579-fix-performance-of-single-entity-flush-with-notify-tracking-policy'

Close #5579
This commit is contained in:
Marco Pivetta 2017-08-18 09:30:43 +02:00
commit 60e29b40a0
No known key found for this signature in database
GPG Key ID: 4167D3337FD9D629
2 changed files with 73 additions and 6 deletions

View File

@ -324,7 +324,7 @@ class UnitOfWork implements PropertyChangedListener
}
// Compute changes done since last commit.
if ($entity === null) {
if (null === $entity) {
$this->computeChangeSets();
} elseif (is_object($entity)) {
$this->computeSingleEntityChangeSet($entity);
@ -414,17 +414,40 @@ class UnitOfWork implements PropertyChangedListener
$this->dispatchPostFlushEvent();
// Clear up
$this->postCommitCleanup($entity);
}
/**
* @param null|object|object[] $entity
*/
private function postCommitCleanup($entity) : void
{
$this->entityInsertions =
$this->entityUpdates =
$this->entityDeletions =
$this->extraUpdates =
$this->entityChangeSets =
$this->collectionUpdates =
$this->collectionDeletions =
$this->visitedCollections =
$this->scheduledForSynchronization =
$this->orphanRemovals = [];
if (null === $entity) {
$this->entityChangeSets = $this->scheduledForSynchronization = [];
return;
}
$entities = \is_object($entity)
? [$entity]
: $entity;
foreach ($entities as $object) {
$oid = \spl_object_hash($object);
$this->clearEntityChangeSet($oid);
unset($this->scheduledForSynchronization[$this->em->getClassMetadata(\get_class($object))->rootEntityName][$oid]);
}
}
/**
@ -3101,7 +3124,7 @@ class UnitOfWork implements PropertyChangedListener
*/
public function clearEntityChangeSet($oid)
{
$this->entityChangeSets[$oid] = [];
unset($this->entityChangeSets[$oid]);
}
/* PropertyChangedListener implementation */

View File

@ -163,7 +163,8 @@ class UnitOfWorkTest extends OrmTestCase
$this->_unitOfWork->persist($entity);
$this->_unitOfWork->commit();
$this->assertEquals(1, count($persister->getInserts()));
$this->assertCount(1, $persister->getInserts());
$persister->reset();
$this->assertTrue($this->_unitOfWork->isInIdentityMap($entity));
@ -360,6 +361,49 @@ class UnitOfWorkTest extends OrmTestCase
$this->assertFalse($this->_unitOfWork->isScheduledForInsert($entity2));
}
/**
* @group #5579
*/
public function testEntityChangeSetIsNotClearedAfterFlushOnSingleEntity() : void
{
$entity1 = new NotifyChangedEntity;
$entity2 = new NotifyChangedEntity;
$entity1->setData('thedata');
$entity2->setData('thedata');
$this->_unitOfWork->persist($entity1);
$this->_unitOfWork->persist($entity2);
$this->_unitOfWork->commit($entity1);
self::assertEmpty($this->_unitOfWork->getEntityChangeSet($entity1));
self::assertCount(1, $this->_unitOfWork->getEntityChangeSet($entity2));
}
/**
* @group #5579
*/
public function testEntityChangeSetIsNotClearedAfterFlushOnArrayOfEntities() : void
{
$entity1 = new NotifyChangedEntity;
$entity2 = new NotifyChangedEntity;
$entity3 = new NotifyChangedEntity;
$entity1->setData('thedata');
$entity2->setData('thedata');
$entity3->setData('thedata');
$this->_unitOfWork->persist($entity1);
$this->_unitOfWork->persist($entity2);
$this->_unitOfWork->persist($entity3);
$this->_unitOfWork->commit([$entity1, $entity3]);
self::assertEmpty($this->_unitOfWork->getEntityChangeSet($entity1));
self::assertEmpty($this->_unitOfWork->getEntityChangeSet($entity3));
self::assertCount(1, $this->_unitOfWork->getEntityChangeSet($entity2));
}
/**
* Data Provider
*