ResultCacheTest.php 7.1KB

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