ResultCacheTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <?php
  2. namespace Doctrine\Tests\ORM\Functional;
  3. use Doctrine\Tests\Models\CMS\CmsUser;
  4. use Doctrine\Tests\Models\CMS\CmsArticle;
  5. use Doctrine\Common\Cache\ArrayCache;
  6. require_once __DIR__ . '/../../TestInit.php';
  7. /**
  8. * ResultCacheTest
  9. *
  10. * @author robo
  11. */
  12. class ResultCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase
  13. {
  14. /**
  15. * @var \ReflectionProperty
  16. */
  17. private $cacheDataReflection;
  18. protected function setUp() {
  19. $this->cacheDataReflection = new \ReflectionProperty("Doctrine\Common\Cache\ArrayCache", "data");
  20. $this->cacheDataReflection->setAccessible(true);
  21. $this->useModelSet('cms');
  22. parent::setUp();
  23. }
  24. /**
  25. * @param ArrayCache $cache
  26. * @return integer
  27. */
  28. private function getCacheSize(ArrayCache $cache)
  29. {
  30. return sizeof($this->cacheDataReflection->getValue($cache));
  31. }
  32. public function testResultCache()
  33. {
  34. $user = new CmsUser;
  35. $user->name = 'Roman';
  36. $user->username = 'romanb';
  37. $user->status = 'dev';
  38. $this->_em->persist($user);
  39. $this->_em->flush();
  40. $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
  41. $cache = new ArrayCache();
  42. $query->setResultCacheDriver($cache)->setResultCacheId('my_cache_id');
  43. $this->assertFalse($cache->contains('my_cache_id'));
  44. $users = $query->getResult();
  45. $this->assertTrue($cache->contains('my_cache_id'));
  46. $this->assertEquals(1, count($users));
  47. $this->assertEquals('Roman', $users[0]->name);
  48. $this->_em->clear();
  49. $query2 = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
  50. $query2->setResultCacheDriver($cache)->setResultCacheId('my_cache_id');
  51. $users = $query2->getResult();
  52. $this->assertTrue($cache->contains('my_cache_id'));
  53. $this->assertEquals(1, count($users));
  54. $this->assertEquals('Roman', $users[0]->name);
  55. }
  56. public function testSetResultCacheId()
  57. {
  58. $cache = new ArrayCache;
  59. $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
  60. $query->setResultCacheDriver($cache);
  61. $query->setResultCacheId('testing_result_cache_id');
  62. $this->assertFalse($cache->contains('testing_result_cache_id'));
  63. $users = $query->getResult();
  64. $this->assertTrue($cache->contains('testing_result_cache_id'));
  65. }
  66. public function testUseResultCache()
  67. {
  68. $cache = new \Doctrine\Common\Cache\ArrayCache();
  69. $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
  70. $query->useResultCache(true);
  71. $query->setResultCacheDriver($cache);
  72. $query->setResultCacheId('testing_result_cache_id');
  73. $users = $query->getResult();
  74. $this->assertTrue($cache->contains('testing_result_cache_id'));
  75. $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
  76. }
  77. /**
  78. * @group DDC-1026
  79. */
  80. public function testUseResultCacheParams()
  81. {
  82. $cache = new \Doctrine\Common\Cache\ArrayCache();
  83. $sqlCount = count($this->_sqlLoggerStack->queries);
  84. $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux WHERE ux.id = ?1');
  85. $query->setParameter(1, 1);
  86. $query->setResultCacheDriver($cache);
  87. $query->useResultCache(true);
  88. $query->getResult();
  89. $query->setParameter(1, 2);
  90. $query->getResult();
  91. $this->assertEquals($sqlCount + 2, count($this->_sqlLoggerStack->queries), "Two non-cached queries.");
  92. $query->setParameter(1, 1);
  93. $query->useResultCache(true);
  94. $query->getResult();
  95. $query->setParameter(1, 2);
  96. $query->getResult();
  97. $this->assertEquals($sqlCount + 2, count($this->_sqlLoggerStack->queries), "The next two sql should have been cached, but were not.");
  98. }
  99. public function testNativeQueryResultCaching()
  100. {
  101. $rsm = new \Doctrine\ORM\Query\ResultSetMapping();
  102. $rsm->addScalarResult('id', 'u');
  103. $query = $this->_em->createNativeQuery('select u.id FROM cms_users u WHERE u.id = ?', $rsm);
  104. $query->setParameter(1, 10);
  105. $cache = new ArrayCache();
  106. $query->setResultCacheDriver($cache)->useResultCache(true);
  107. $this->assertEquals(0, $this->getCacheSize($cache));
  108. $query->getResult();
  109. $this->assertEquals(1, $this->getCacheSize($cache));
  110. return $query;
  111. }
  112. /**
  113. * @param string $query
  114. * @depends testNativeQueryResultCaching
  115. */
  116. public function testResultCacheNotDependsOnQueryHints($query)
  117. {
  118. $cache = $query->getResultCacheDriver();
  119. $cacheCount = $this->getCacheSize($cache);
  120. $query->setHint('foo', 'bar');
  121. $query->getResult();
  122. $this->assertEquals($cacheCount, $this->getCacheSize($cache));
  123. }
  124. /**
  125. * @param <type> $query
  126. * @depends testNativeQueryResultCaching
  127. */
  128. public function testResultCacheDependsOnParameters($query)
  129. {
  130. $cache = $query->getResultCacheDriver();
  131. $cacheCount = $this->getCacheSize($cache);
  132. $query->setParameter(1, 50);
  133. $query->getResult();
  134. $this->assertEquals($cacheCount + 1, $this->getCacheSize($cache));
  135. }
  136. /**
  137. * @param <type> $query
  138. * @depends testNativeQueryResultCaching
  139. */
  140. public function testResultCacheNotDependsOnHydrationMode($query)
  141. {
  142. $cache = $query->getResultCacheDriver();
  143. $cacheCount = $this->getCacheSize($cache);
  144. $this->assertNotEquals(\Doctrine\ORM\Query::HYDRATE_ARRAY, $query->getHydrationMode());
  145. $query->getArrayResult();
  146. $this->assertEquals($cacheCount, $this->getCacheSize($cache));
  147. }
  148. /**
  149. * @group DDC-909
  150. */
  151. public function testResultCacheWithObjectParameter()
  152. {
  153. $user1 = new CmsUser;
  154. $user1->name = 'Roman';
  155. $user1->username = 'romanb';
  156. $user1->status = 'dev';
  157. $user2 = new CmsUser;
  158. $user2->name = 'Benjamin';
  159. $user2->username = 'beberlei';
  160. $user2->status = 'dev';
  161. $article = new CmsArticle();
  162. $article->text = "foo";
  163. $article->topic = "baz";
  164. $article->user = $user1;
  165. $this->_em->persist($article);
  166. $this->_em->persist($user1);
  167. $this->_em->persist($user2);
  168. $this->_em->flush();
  169. $query = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = ?1');
  170. $query->setParameter(1, $user1);
  171. $cache = new ArrayCache();
  172. $query->setResultCacheDriver($cache)->useResultCache(true);
  173. $articles = $query->getResult();
  174. $this->assertEquals(1, count($articles));
  175. $this->assertEquals('baz', $articles[0]->topic);
  176. $this->_em->clear();
  177. $query2 = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = ?1');
  178. $query2->setParameter(1, $user1);
  179. $query2->setResultCacheDriver($cache)->useResultCache(true);
  180. $articles = $query2->getResult();
  181. $this->assertEquals(1, count($articles));
  182. $this->assertEquals('baz', $articles[0]->topic);
  183. $query3 = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsArticle a WHERE a.user = ?1');
  184. $query3->setParameter(1, $user2);
  185. $query3->setResultCacheDriver($cache)->useResultCache(true);
  186. $articles = $query3->getResult();
  187. $this->assertEquals(0, count($articles));
  188. }
  189. }