Skip to content

Commit

Permalink
[DDC-2996] Fix bug in UnitOfWork#recomputeSingleEntityChangeSet
Browse files Browse the repository at this point in the history
When calling UnitOfWork#recomputeSingleEntityChangeSet on an entity
that didn't have a changeset before, the computation was ignored.
This method however is suggested to be used in "onFlush" and "preFlush"
events in the documentation.

Also fix a bug where recomputeSingleEntityChangeSet was used
before calculating a real changeset for an object.
  • Loading branch information
beberlei committed Mar 23, 2014
1 parent e415da7 commit d473824
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 5 deletions.
11 changes: 8 additions & 3 deletions lib/Doctrine/ORM/UnitOfWork.php
Original file line number Diff line number Diff line change
Expand Up @@ -925,6 +925,10 @@ public function recomputeSingleEntityChangeSet(ClassMetadata $class, $entity)
}
}

if ( ! isset($this->originalEntityData[$oid])) {
throw new \RuntimeException('Cannot call recomputeSingleEntityChangeSet before computeChangeSet on an entity.');
}

$originalData = $this->originalEntityData[$oid];
$changeSet = array();

Expand All @@ -937,11 +941,12 @@ public function recomputeSingleEntityChangeSet(ClassMetadata $class, $entity)
}

if ($changeSet) {
if (isset($this->entityChangeSets[$oid])) {
$this->entityChangeSets[$oid] = array_merge($this->entityChangeSets[$oid], $changeSet);
}
$this->entityChangeSets[$oid] = (isset($this->entityChangeSets[$oid]))
? array_merge($this->entityChangeSets[$oid], $changeSet)
: $changeSet;

$this->originalEntityData[$oid] = $actualData;
$this->entityUpdates[$oid] = $entity;
}
}

Expand Down
90 changes: 90 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2996Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Event\LifecycleEventArgs;

/**
* @group DDC-2996
*/
class DDC2996Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
public function testIssue()
{
$this->_schemaTool->createSchema(array(
$this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC2996User'),
$this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC2996UserPreference'),
));

$pref = new DDC2996UserPreference();
$pref->user = new DDC2996User();
$pref->value = "foo";

$this->_em->persist($pref);
$this->_em->persist($pref->user);
$this->_em->flush();

$pref->value = "bar";
$this->_em->flush();

$this->assertEquals(1, $pref->user->counter);

$this->_em->clear();

$pref = $this->_em->find(__NAMESPACE__ . '\\DDC2996UserPreference', $pref->id);
$this->assertEquals(1, $pref->user->counter);
}
}

/**
* @Entity
*/
class DDC2996User
{
/**
* @Id @GeneratedValue @Column(type="integer")
*/
public $id;
/**
* @Column(type="integer")
*/
public $counter = 0;
}

/**
* @Entity @HasLifecycleCallbacks
*/
class DDC2996UserPreference
{
/**
* @Id @GeneratedValue @Column(type="integer")
*/
public $id;
/**
* @Column(type="string")
*/
public $value;

/**
* @ManyToOne(targetEntity="DDC2996User")
*/
public $user;

/**
* @PreFlush
*/
public function preFlush($event)
{
$em = $event->getEntityManager();
$uow = $em->getUnitOfWork();

if ($uow->getOriginalEntityData($this->user)) {
$this->user->counter++;
$uow->recomputeSingleEntityChangeSet(
$em->getClassMetadata(get_class($this->user)),
$this->user
);
}
}
}
2 changes: 0 additions & 2 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3033Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Event\LifecycleEventArgs;

require_once __DIR__ . '/../../../TestInit.php';

/**
* @group DDC-3033
*/
Expand Down

0 comments on commit d473824

Please sign in to comment.