3 namespace Doctrine\Tests\ORM\Functional;
5 use Doctrine\Tests\Models\CMS\CmsUser;
6 use Doctrine\Tests\Models\CMS\CmsArticle;
7 use Doctrine\Common\Cache\ArrayCache;
9 require_once __DIR__ . '/../../TestInit.php';
16 class ResultCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase
19 * @var \ReflectionProperty
21 private $cacheDataReflection;
23 protected function setUp() {
24 $this->cacheDataReflection = new \ReflectionProperty("Doctrine\Common\Cache\ArrayCache", "data");
25 $this->cacheDataReflection->setAccessible(true);
26 $this->useModelSet('cms');
31 * @param ArrayCache $cache
34 private function getCacheSize(ArrayCache $cache)
36 return sizeof($this->cacheDataReflection->getValue($cache));
39 public function testResultCache()
42 $user->name = 'Roman';
43 $user->username = 'romanb';
44 $user->status = 'dev';
45 $this->_em->persist($user);
49 $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
51 $cache = new ArrayCache();
53 $query->setResultCacheDriver($cache)->setResultCacheId('my_cache_id');
55 $this->assertFalse($cache->contains('my_cache_id'));
57 $users = $query->getResult();
59 $this->assertTrue($cache->contains('my_cache_id'));
60 $this->assertEquals(1, count($users));
61 $this->assertEquals('Roman', $users[0]->name);
65 $query2 = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
66 $query2->setResultCacheDriver($cache)->setResultCacheId('my_cache_id');
68 $users = $query2->getResult();
70 $this->assertTrue($cache->contains('my_cache_id'));
71 $this->assertEquals(1, count($users));
72 $this->assertEquals('Roman', $users[0]->name);
75 public function testSetResultCacheId()
77 $cache = new ArrayCache;
79 $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
80 $query->setResultCacheDriver($cache);
81 $query->setResultCacheId('testing_result_cache_id');
83 $this->assertFalse($cache->contains('testing_result_cache_id'));
85 $users = $query->getResult();
87 $this->assertTrue($cache->contains('testing_result_cache_id'));
90 public function testUseResultCache()
92 $cache = new \Doctrine\Common\Cache\ArrayCache();
94 $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
95 $query->useResultCache(true);
96 $query->setResultCacheDriver($cache);
97 $query->setResultCacheId('testing_result_cache_id');
98 $users = $query->getResult();
100 $this->assertTrue($cache->contains('testing_result_cache_id'));
102 $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
108 public function testUseResultCacheParams()
110 $cache = new \Doctrine\Common\Cache\ArrayCache();
112 $sqlCount = count($this->_sqlLoggerStack->queries);
113 $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux WHERE ux.id = ?1');
114 $query->setParameter(1, 1);
115 $query->setResultCacheDriver($cache);
116 $query->useResultCache(true);
119 $query->setParameter(1, 2);
122 $this->assertEquals($sqlCount + 2, count($this->_sqlLoggerStack->queries), "Two non-cached queries.");
124 $query->setParameter(1, 1);
125 $query->useResultCache(true);
128 $query->setParameter(1, 2);
131 $this->assertEquals($sqlCount + 2, count($this->_sqlLoggerStack->queries), "The next two sql should have been cached, but were not.");
134 public function testNativeQueryResultCaching()
136 $rsm = new \Doctrine\ORM\Query\ResultSetMapping();
137 $rsm->addScalarResult('id', 'u');
138 $query = $this->_em->createNativeQuery('select u.id FROM cms_users u WHERE u.id = ?', $rsm);
139 $query->setParameter(1, 10);
141 $cache = new ArrayCache();
142 $query->setResultCacheDriver($cache)->useResultCache(true);
144 $this->assertEquals(0, $this->getCacheSize($cache));
146 $this->assertEquals(2, $this->getCacheSize($cache));
152 * @param string $query
153 * @depends testNativeQueryResultCaching
155 public function testResultCacheNotDependsOnQueryHints($query)
157 $cache = $query->getResultCacheDriver();
158 $cacheCount = $this->getCacheSize($cache);
160 $query->setHint('foo', 'bar');
163 $this->assertEquals($cacheCount, $this->getCacheSize($cache));
167 * @param <type> $query
168 * @depends testNativeQueryResultCaching
170 public function testResultCacheDependsOnParameters($query)
172 $cache = $query->getResultCacheDriver();
173 $cacheCount = $this->getCacheSize($cache);
175 $query->setParameter(1, 50);
178 $this->assertEquals($cacheCount + 1, $this->getCacheSize($cache));
182 * @param <type> $query
183 * @depends testNativeQueryResultCaching
185 public function testResultCacheNotDependsOnHydrationMode($query)
187 $cache = $query->getResultCacheDriver();
188 $cacheCount = $this->getCacheSize($cache);
190 $this->assertNotEquals(\Doctrine\ORM\Query::HYDRATE_ARRAY, $query->getHydrationMode());
191 $query->getArrayResult();
193 $this->assertEquals($cacheCount, $this->getCacheSize($cache));
199 public function testResultCacheWithObjectParameter()
201 $user1 = new CmsUser;
202 $user1->name = 'Roman';
203 $user1->username = 'romanb';
204 $user1->status = 'dev';
206 $user2 = new CmsUser;
207 $user2->name = 'Benjamin';
208 $user2->username = 'beberlei';
209 $user2->status = 'dev';
211 $article = new CmsArticle();
212 $article->text = "foo";
213 $article->topic = "baz";
214 $article->user = $user1;
216 $this->_em->persist($article);
217 $this->_em->persist($user1);
218 $this->_em->persist($user2);
221 $query = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = ?1');
222 $query->setParameter(1, $user1);
224 $cache = new ArrayCache();
226 $query->setResultCacheDriver($cache)->useResultCache(true);
228 $articles = $query->getResult();
230 $this->assertEquals(1, count($articles));
231 $this->assertEquals('baz', $articles[0]->topic);
235 $query2 = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = ?1');
236 $query2->setParameter(1, $user1);
238 $query2->setResultCacheDriver($cache)->useResultCache(true);
240 $articles = $query2->getResult();
242 $this->assertEquals(1, count($articles));
243 $this->assertEquals('baz', $articles[0]->topic);
245 $query3 = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = ?1');
246 $query3->setParameter(1, $user2);
248 $query3->setResultCacheDriver($cache)->useResultCache(true);
250 $articles = $query3->getResult();
252 $this->assertEquals(0, count($articles));