From cbdd8bc041842354e2d440249fa06e55e0261b7c Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Tue, 4 Mar 2014 21:45:25 -0500 Subject: [PATCH] [SLC] Fix query association proxy --- lib/Doctrine/ORM/Cache/DefaultQueryCache.php | 14 ++++-- .../SecondLevelCacheQueryCacheTest.php | 48 +++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Cache/DefaultQueryCache.php b/lib/Doctrine/ORM/Cache/DefaultQueryCache.php index 789792103..a6b833d27 100644 --- a/lib/Doctrine/ORM/Cache/DefaultQueryCache.php +++ b/lib/Doctrine/ORM/Cache/DefaultQueryCache.php @@ -108,6 +108,7 @@ class DefaultQueryCache implements QueryCache $entityName = reset($rsm->aliasMap); $hasRelation = ( ! empty($rsm->relationMap)); $persister = $this->uow->getEntityPersister($entityName); + $metadata = ( ! $hasRelation) ? $persister->getClassMetadata() : null; $region = $persister->getCacheRegion(); $regionName = $region->getName(); @@ -126,15 +127,22 @@ class DefaultQueryCache implements QueryCache if ($this->cacheLogger !== null) { $this->cacheLogger->entityCacheHit($regionName, $entityKey); } + $data = $entityEntry->data; if ( ! $hasRelation) { - $result[$index] = $this->uow->createEntity($entityEntry->class, $entityEntry->data, self::$hints); + foreach ($metadata->associationMappings as $name => $assoc) { + if ( ! ($assoc['type'] & ClassMetadata::TO_ONE) || ! isset($assoc['cache']) || ! isset($data[$name])) { + continue; + } + + $data[$name] = $this->em->getReference($data[$name]->class, $data[$name]->identifier); + } + + $result[$index] = $this->uow->createEntity($entityEntry->class, $data, self::$hints); continue; } - $data = $entityEntry->data; - foreach ($entry['associations'] as $name => $assoc) { $assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']); diff --git a/tests/Doctrine/Tests/ORM/Functional/SecondLevelCacheQueryCacheTest.php b/tests/Doctrine/Tests/ORM/Functional/SecondLevelCacheQueryCacheTest.php index 77c54ad7f..3f0aa3896 100644 --- a/tests/Doctrine/Tests/ORM/Functional/SecondLevelCacheQueryCacheTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/SecondLevelCacheQueryCacheTest.php @@ -827,6 +827,54 @@ class SecondLevelCacheQueryCacheTest extends SecondLevelCacheAbstractTest $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('bar_region')); } + public function testToOneAssociationShouldUseProxyForCacheableMetaResultColumn() + { + $this->evictRegions(); + $this->loadFixturesCountries(); + $this->loadFixturesStates(); + + $this->_em->clear(); + + $stateId = $this->states[0]->getId(); + $countryName = $this->states[0]->getCountry()->getName(); + $dql = 'SELECT s FROM Doctrine\Tests\Models\Cache\State s WHERE s.id = :id'; + $query = $this->_em->createQuery($dql); + $queryCount = $this->getCurrentQueryCount(); + + $query1 = clone $query; + $state1 = $query1 + ->setParameter('id', $stateId) + ->setCacheable(true) + ->setMaxResults(1) + ->getSingleResult(); + + $this->assertNotNull($state1); + $this->assertNotNull($state1->getCountry()); + $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount()); + $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state1); + $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $state1->getCountry()); + $this->assertEquals($countryName, $state1->getCountry()->getName()); + $this->assertEquals($stateId, $state1->getId()); + + $this->_em->clear(); + + $queryCount = $this->getCurrentQueryCount(); + $query2 = clone $query; + $state2 = $query2 + ->setParameter('id', $stateId) + ->setCacheable(true) + ->setMaxResults(1) + ->getSingleResult(); + + $this->assertNotNull($state2); + $this->assertNotNull($state2->getCountry()); + $this->assertEquals($queryCount, $this->getCurrentQueryCount()); + $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state2); + $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $state2->getCountry()); + $this->assertEquals($countryName, $state2->getCountry()->getName()); + $this->assertEquals($stateId, $state2->getId()); + } + public function testHintClearEntityRegionUpdateStatement() { $this->evictRegions();