3 namespace Doctrine\Tests\ORM\Functional;
5 use Doctrine\Tests\Models\CMS\CmsUser;
6 use Doctrine\Common\Cache\ArrayCache;
8 require_once __DIR__ . '/../../TestInit.php';
15 class QueryCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase
18 * @var \ReflectionProperty
20 private $cacheDataReflection;
22 protected function setUp()
24 $this->cacheDataReflection = new \ReflectionProperty("Doctrine\Common\Cache\ArrayCache", "data");
25 $this->cacheDataReflection->setAccessible(true);
27 $this->useModelSet('cms');
33 * @param ArrayCache $cache
36 private function getCacheSize(ArrayCache $cache)
38 return sizeof($this->cacheDataReflection->getValue($cache));
42 public function testQueryCache_DependsOnHints()
44 $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
46 $cache = new ArrayCache();
47 $query->setQueryCacheDriver($cache);
50 $this->assertEquals(2, $this->getCacheSize($cache));
52 $query->setHint('foo', 'bar');
55 $this->assertEquals(3, $this->getCacheSize($cache));
61 * @param <type> $query
62 * @depends testQueryCache_DependsOnHints
64 public function testQueryCache_DependsOnFirstResult($query)
66 $cache = $query->getQueryCacheDriver();
67 $cacheCount = $this->getCacheSize($cache);
69 $query->setFirstResult(10);
70 $query->setMaxResults(9999);
73 $this->assertEquals($cacheCount + 1, $this->getCacheSize($cache));
77 * @param <type> $query
78 * @depends testQueryCache_DependsOnHints
80 public function testQueryCache_DependsOnMaxResults($query)
82 $cache = $query->getQueryCacheDriver();
83 $cacheCount = $this->getCacheSize($cache);
85 $query->setMaxResults(10);
88 $this->assertEquals($cacheCount + 1, $this->getCacheSize($cache));
92 * @param <type> $query
93 * @depends testQueryCache_DependsOnHints
95 public function testQueryCache_DependsOnHydrationMode($query)
97 $cache = $query->getQueryCacheDriver();
98 $cacheCount = $this->getCacheSize($cache);
100 $query->getArrayResult();
101 $this->assertEquals($cacheCount + 1, $this->getCacheSize($cache));
104 public function testQueryCache_NoHitSaveParserResult()
106 $this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache());
108 $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
110 $cache = new \Doctrine\Common\Cache\ArrayCache();
112 $query->setQueryCacheDriver($cache);
114 $users = $query->getResult();
116 $data = $this->cacheDataReflection->getValue($cache);
117 $this->assertEquals(2, count($data));
119 $this->assertInstanceOf('Doctrine\ORM\Query\ParserResult', array_pop($data));
122 public function testQueryCache_HitDoesNotSaveParserResult()
124 $this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache());
126 $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
128 $sqlExecMock = $this->getMock('Doctrine\ORM\Query\Exec\AbstractSqlExecutor', array('execute'));
129 $sqlExecMock->expects($this->once())
131 ->will($this->returnValue( 10 ));
133 $parserResultMock = $this->getMock('Doctrine\ORM\Query\ParserResult');
134 $parserResultMock->expects($this->once())
135 ->method('getSqlExecutor')
136 ->will($this->returnValue($sqlExecMock));
138 $cache = $this->getMock('Doctrine\Common\Cache\CacheProvider',
139 array('doFetch', 'doContains', 'doSave', 'doDelete', 'doFlush', 'doGetStats'));
140 $cache->expects($this->at(0))->method('doFetch')->will($this->returnValue(1));
141 $cache->expects($this->at(1))
143 ->with($this->isType('string'))
144 ->will($this->returnValue($parserResultMock));
145 $cache->expects($this->never())
148 $query->setQueryCacheDriver($cache);
150 $users = $query->getResult();