From 0b3577f2d2551f720f4cd0b80fcc9c1722e04986 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Thu, 5 Apr 2012 22:40:40 +0200 Subject: [PATCH] [DDC-1766] Rewrite getHydrationCacheId() to use existing processParameterValue() method. Other code style changes. --- lib/Doctrine/ORM/AbstractQuery.php | 29 +++++++------------ lib/Doctrine/ORM/Configuration.php | 22 ++++++++++++++ .../ORM/Functional/HydrationCacheTest.php | 26 +++++++++++++---- 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/lib/Doctrine/ORM/AbstractQuery.php b/lib/Doctrine/ORM/AbstractQuery.php index 7068b6439..07af294b1 100644 --- a/lib/Doctrine/ORM/AbstractQuery.php +++ b/lib/Doctrine/ORM/AbstractQuery.php @@ -20,8 +20,8 @@ namespace Doctrine\ORM; use Doctrine\DBAL\Types\Type, - Doctrine\ORM\Query\QueryException, Doctrine\DBAL\Cache\QueryCacheProfile, + Doctrine\ORM\Query\QueryException, Doctrine\ORM\Internal\Hydration\CacheHydrator; /** @@ -30,7 +30,6 @@ use Doctrine\DBAL\Types\Type, * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 - * @version $Revision$ * @author Benjamin Eberlei * @author Guilherme Blanco * @author Jonathan Wage @@ -329,7 +328,7 @@ abstract class AbstractQuery public function setHydrationCacheProfile(QueryCacheProfile $profile = null) { if ( ! $profile->getResultCacheDriver()) { - $resultCacheDriver = $this->_em->getConfiguration()->getResultCacheImpl(); + $resultCacheDriver = $this->_em->getConfiguration()->getHydrationCacheImpl(); $profile = $profile->setResultCacheDriver($resultCacheDriver); } @@ -717,9 +716,9 @@ abstract class AbstractQuery if ($this->_hydrationCacheProfile !== null) { list($cacheKey, $realCacheKey) = $this->getHydrationCacheId(); - $qcp = $this->getHydrationCacheProfile(); - $cache = $qcp->getResultCacheDriver(); - $result = $cache->fetch($cacheKey); + $queryCacheProfile = $this->getHydrationCacheProfile(); + $cache = $queryCacheProfile->getResultCacheDriver(); + $result = $cache->fetch($cacheKey); if (isset($result[$realCacheKey])) { return $result[$realCacheKey]; @@ -729,9 +728,9 @@ abstract class AbstractQuery $result = array(); } - $setCacheEntry = function($data) use ($cache, $result, $cacheKey, $realCacheKey, $qcp) { + $setCacheEntry = function($data) use ($cache, $result, $cacheKey, $realCacheKey, $queryCacheProfile) { $result[$realCacheKey] = $data; - $cache->save($cacheKey, $result, $qcp->getLifetime()); + $cache->save($cacheKey, $result, $queryCacheProfile->getLifetime()); }; } @@ -764,24 +763,16 @@ abstract class AbstractQuery $params = $this->getParameters(); foreach ($params AS $key => $value) { - if (is_object($value) && $this->_em->getMetadataFactory()->hasMetadataFor(get_class($value))) { - if ($this->_em->getUnitOfWork()->getEntityState($value) == UnitOfWork::STATE_MANAGED) { - $idValues = $this->_em->getUnitOfWork()->getEntityIdentifier($value); - } else { - $class = $this->_em->getClassMetadata(get_class($value)); - $idValues = $class->getIdentifierValues($value); - } - $params[$key] = $idValues; - } + $params[$key] = $this->processParameterValue($value); } $sql = $this->getSQL(); + $queryCacheProfile = $this->getHydrationCacheProfile(); $hints = $this->getHints(); $hints['hydrationMode'] = $this->getHydrationMode(); - $qcp = $this->getHydrationCacheProfile(); ksort($hints); - return $qcp->generateCacheKeys($sql, $params, $hints); + return $queryCacheProfile->generateCacheKeys($sql, $params, $hints); } /** diff --git a/lib/Doctrine/ORM/Configuration.php b/lib/Doctrine/ORM/Configuration.php index b0e1f0fd0..f4e473e5a 100644 --- a/lib/Doctrine/ORM/Configuration.php +++ b/lib/Doctrine/ORM/Configuration.php @@ -246,6 +246,28 @@ class Configuration extends \Doctrine\DBAL\Configuration $this->_attributes['queryCacheImpl'] = $cacheImpl; } + /** + * Gets the cache driver implementation that is used for the hydration cache (SQL cache). + * + * @return \Doctrine\Common\Cache\Cache + */ + public function getHydrationCacheImpl() + { + return isset($this->_attributes['hydrationCacheImpl']) + ? $this->_attributes['hydrationCacheImpl'] + : null; + } + + /** + * Sets the cache driver implementation that is used for the hydration cache (SQL cache). + * + * @param \Doctrine\Common\Cache\Cache $cacheImpl + */ + public function setHydrationCacheImpl(Cache $cacheImpl) + { + $this->_attributes['hydrationCacheImpl'] = $cacheImpl; + } + /** * Gets the cache driver implementation that is used for metadata caching. * diff --git a/tests/Doctrine/Tests/ORM/Functional/HydrationCacheTest.php b/tests/Doctrine/Tests/ORM/Functional/HydrationCacheTest.php index f16124706..897421164 100644 --- a/tests/Doctrine/Tests/ORM/Functional/HydrationCacheTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/HydrationCacheTest.php @@ -15,11 +15,6 @@ class HydrationCacheTest extends OrmFunctionalTestCase { $this->useModelSet('cms'); parent::setUp(); - } - - public function testHydrationCache() - { - $cache = new ArrayCache(); $user = new CmsUser; $user->name = "Benjamin"; @@ -29,8 +24,11 @@ class HydrationCacheTest extends OrmFunctionalTestCase $this->_em->persist($user); $this->_em->flush(); $this->_em->clear(); + } - + public function testHydrationCache() + { + $cache = new ArrayCache(); $dql = "SELECT u FROM Doctrine\Tests\Models\Cms\CmsUser u"; $users = $this->_em->createQuery($dql) @@ -66,7 +64,23 @@ class HydrationCacheTest extends OrmFunctionalTestCase ->setHydrationCacheProfile(new QueryCacheProfile(null, 'cachekey', $cache)) ->getArrayResult(); $this->assertEquals($c + 2, $this->getCurrentQueryCount(), "Hydration now cached"); + } + public function testHydrationParametersSerialization() + { + $cache = new ArrayCache(); + $user = new CmsUser(); + $user->id = 1; + + $dql = "SELECT u FROM Doctrine\Tests\Models\Cms\CmsUser u WHERE u.id = ?1"; + $query = $this->_em->createQuery($dql) + ->setParameter(1, $user) + ->setHydrationCacheProfile(new QueryCacheProfile(null, null, $cache)); + + $query->getResult(); + $c = $this->getCurrentQueryCount(); + $query->getResult(); + $this->assertEquals($c, $this->getCurrentQueryCount(), "Should not execute query. Its cached!"); } }