/tests/Doctrine/Tests/ORM/Functional/SecondLevelCacheJoinTableInheritanceTest.php

https://github.com/jaikdean/doctrine2 · PHP · 233 lines · 176 code · 53 blank · 4 comment · 0 complexity · b4f4ff08343fd8e6a0286c48f92d3eaf MD5 · raw file

  1. <?php
  2. declare(strict_types=1);
  3. namespace Doctrine\Tests\ORM\Functional;
  4. use Doctrine\ORM\PersistentCollection;
  5. use Doctrine\Tests\Models\Cache\Attraction;
  6. use Doctrine\Tests\Models\Cache\AttractionContactInfo;
  7. use Doctrine\Tests\Models\Cache\AttractionInfo;
  8. use Doctrine\Tests\Models\Cache\AttractionLocationInfo;
  9. use function count;
  10. use function get_class;
  11. /**
  12. * @group DDC-2183
  13. */
  14. class SecondLevelCacheJoinTableInheritanceTest extends SecondLevelCacheAbstractTest
  15. {
  16. public function testUseSameRegion() : void
  17. {
  18. $infoRegion = $this->cache->getEntityCacheRegion(AttractionInfo::class);
  19. $contactRegion = $this->cache->getEntityCacheRegion(AttractionContactInfo::class);
  20. $locationRegion = $this->cache->getEntityCacheRegion(AttractionLocationInfo::class);
  21. self::assertEquals($infoRegion->getName(), $contactRegion->getName());
  22. self::assertEquals($infoRegion->getName(), $locationRegion->getName());
  23. }
  24. public function testPutOnPersistJoinTableInheritance() : void
  25. {
  26. $this->loadFixturesCountries();
  27. $this->loadFixturesStates();
  28. $this->loadFixturesCities();
  29. $this->loadFixturesAttractions();
  30. $this->loadFixturesAttractionsInfo();
  31. $this->em->clear();
  32. self::assertTrue($this->cache->containsEntity(AttractionInfo::class, $this->attractionsInfo[0]->getId()));
  33. self::assertTrue($this->cache->containsEntity(AttractionInfo::class, $this->attractionsInfo[1]->getId()));
  34. self::assertTrue($this->cache->containsEntity(AttractionInfo::class, $this->attractionsInfo[2]->getId()));
  35. self::assertTrue($this->cache->containsEntity(AttractionInfo::class, $this->attractionsInfo[3]->getId()));
  36. }
  37. public function testJoinTableCountaisRootClass() : void
  38. {
  39. $this->loadFixturesCountries();
  40. $this->loadFixturesStates();
  41. $this->loadFixturesCities();
  42. $this->loadFixturesAttractions();
  43. $this->loadFixturesAttractionsInfo();
  44. $this->em->clear();
  45. foreach ($this->attractionsInfo as $info) {
  46. self::assertTrue($this->cache->containsEntity(AttractionInfo::class, $info->getId()));
  47. self::assertTrue($this->cache->containsEntity(get_class($info), $info->getId()));
  48. }
  49. }
  50. public function testPutAndLoadJoinTableEntities() : void
  51. {
  52. $this->loadFixturesCountries();
  53. $this->loadFixturesStates();
  54. $this->loadFixturesCities();
  55. $this->loadFixturesAttractions();
  56. $this->loadFixturesAttractionsInfo();
  57. $this->em->clear();
  58. $this->cache->evictEntityRegion(AttractionInfo::class);
  59. $entityId1 = $this->attractionsInfo[0]->getId();
  60. $entityId2 = $this->attractionsInfo[1]->getId();
  61. self::assertFalse($this->cache->containsEntity(AttractionInfo::class, $entityId1));
  62. self::assertFalse($this->cache->containsEntity(AttractionInfo::class, $entityId2));
  63. self::assertFalse($this->cache->containsEntity(AttractionContactInfo::class, $entityId1));
  64. self::assertFalse($this->cache->containsEntity(AttractionContactInfo::class, $entityId2));
  65. $queryCount = $this->getCurrentQueryCount();
  66. $entity1 = $this->em->find(AttractionInfo::class, $entityId1);
  67. $entity2 = $this->em->find(AttractionInfo::class, $entityId2);
  68. //load entity and relation whit sub classes
  69. self::assertEquals($queryCount + 4, $this->getCurrentQueryCount());
  70. self::assertTrue($this->cache->containsEntity(AttractionInfo::class, $entityId1));
  71. self::assertTrue($this->cache->containsEntity(AttractionInfo::class, $entityId2));
  72. self::assertTrue($this->cache->containsEntity(AttractionContactInfo::class, $entityId1));
  73. self::assertTrue($this->cache->containsEntity(AttractionContactInfo::class, $entityId2));
  74. self::assertInstanceOf(AttractionInfo::class, $entity1);
  75. self::assertInstanceOf(AttractionInfo::class, $entity2);
  76. self::assertInstanceOf(AttractionContactInfo::class, $entity1);
  77. self::assertInstanceOf(AttractionContactInfo::class, $entity2);
  78. self::assertEquals($this->attractionsInfo[0]->getId(), $entity1->getId());
  79. self::assertEquals($this->attractionsInfo[0]->getFone(), $entity1->getFone());
  80. self::assertEquals($this->attractionsInfo[1]->getId(), $entity2->getId());
  81. self::assertEquals($this->attractionsInfo[1]->getFone(), $entity2->getFone());
  82. $this->em->clear();
  83. $queryCount = $this->getCurrentQueryCount();
  84. $entity3 = $this->em->find(AttractionInfo::class, $entityId1);
  85. $entity4 = $this->em->find(AttractionInfo::class, $entityId2);
  86. self::assertEquals($queryCount, $this->getCurrentQueryCount());
  87. self::assertInstanceOf(AttractionInfo::class, $entity3);
  88. self::assertInstanceOf(AttractionInfo::class, $entity4);
  89. self::assertInstanceOf(AttractionContactInfo::class, $entity3);
  90. self::assertInstanceOf(AttractionContactInfo::class, $entity4);
  91. self::assertNotSame($entity1, $entity3);
  92. self::assertEquals($entity1->getId(), $entity3->getId());
  93. self::assertEquals($entity1->getFone(), $entity3->getFone());
  94. self::assertNotSame($entity2, $entity4);
  95. self::assertEquals($entity2->getId(), $entity4->getId());
  96. self::assertEquals($entity2->getFone(), $entity4->getFone());
  97. }
  98. public function testQueryCacheFindAllJoinTableEntities() : void
  99. {
  100. $this->loadFixturesCountries();
  101. $this->loadFixturesStates();
  102. $this->loadFixturesCities();
  103. $this->loadFixturesAttractions();
  104. $this->loadFixturesAttractionsInfo();
  105. $this->evictRegions();
  106. $this->em->clear();
  107. $queryCount = $this->getCurrentQueryCount();
  108. $dql = 'SELECT i, a FROM Doctrine\Tests\Models\Cache\AttractionInfo i JOIN i.attraction a';
  109. $result1 = $this->em->createQuery($dql)
  110. ->setCacheable(true)
  111. ->getResult();
  112. self::assertCount(count($this->attractionsInfo), $result1);
  113. self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
  114. $this->em->clear();
  115. $result2 = $this->em->createQuery($dql)
  116. ->setCacheable(true)
  117. ->getResult();
  118. self::assertCount(count($this->attractionsInfo), $result2);
  119. self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
  120. self::assertContainsOnlyInstancesOf(AttractionInfo::class, $result2);
  121. }
  122. public function testOneToManyRelationJoinTable() : void
  123. {
  124. $this->loadFixturesCountries();
  125. $this->loadFixturesStates();
  126. $this->loadFixturesCities();
  127. $this->loadFixturesAttractions();
  128. $this->loadFixturesAttractionsInfo();
  129. $this->evictRegions();
  130. $this->em->clear();
  131. $entity = $this->em->find(Attraction::class, $this->attractions[0]->getId());
  132. self::assertInstanceOf(Attraction::class, $entity);
  133. self::assertInstanceOf(PersistentCollection::class, $entity->getInfos());
  134. self::assertCount(1, $entity->getInfos());
  135. $ownerId = $this->attractions[0]->getId();
  136. $queryCount = $this->getCurrentQueryCount();
  137. self::assertTrue($this->cache->containsEntity(Attraction::class, $ownerId));
  138. self::assertTrue($this->cache->containsCollection(Attraction::class, 'infos', $ownerId));
  139. self::assertInstanceOf(AttractionContactInfo::class, $entity->getInfos()->get(0));
  140. self::assertEquals($this->attractionsInfo[0]->getFone(), $entity->getInfos()->get(0)->getFone());
  141. $this->em->clear();
  142. $entity = $this->em->find(Attraction::class, $this->attractions[0]->getId());
  143. self::assertInstanceOf(Attraction::class, $entity);
  144. self::assertInstanceOf(PersistentCollection::class, $entity->getInfos());
  145. self::assertCount(1, $entity->getInfos());
  146. self::assertInstanceOf(AttractionContactInfo::class, $entity->getInfos()->get(0));
  147. self::assertEquals($this->attractionsInfo[0]->getFone(), $entity->getInfos()->get(0)->getFone());
  148. }
  149. public function testQueryCacheShouldBeEvictedOnTimestampUpdate() : void
  150. {
  151. $this->loadFixturesCountries();
  152. $this->loadFixturesStates();
  153. $this->loadFixturesCities();
  154. $this->loadFixturesAttractions();
  155. $this->loadFixturesAttractionsInfo();
  156. $this->evictRegions();
  157. $this->em->clear();
  158. $queryCount = $this->getCurrentQueryCount();
  159. $dql = 'SELECT attractionInfo FROM Doctrine\Tests\Models\Cache\AttractionInfo attractionInfo';
  160. $result1 = $this->em->createQuery($dql)
  161. ->setCacheable(true)
  162. ->getResult();
  163. self::assertCount(count($this->attractionsInfo), $result1);
  164. self::assertEquals($queryCount + 5, $this->getCurrentQueryCount());
  165. $contact = new AttractionContactInfo(
  166. '1234-1234',
  167. $this->em->find(Attraction::class, $this->attractions[5]->getId())
  168. );
  169. $this->em->persist($contact);
  170. $this->em->flush();
  171. $this->em->clear();
  172. $queryCount = $this->getCurrentQueryCount();
  173. $result2 = $this->em->createQuery($dql)
  174. ->setCacheable(true)
  175. ->getResult();
  176. self::assertCount(count($this->attractionsInfo) + 1, $result2);
  177. self::assertEquals($queryCount + 6, $this->getCurrentQueryCount());
  178. self::assertContainsOnlyInstancesOf(AttractionInfo::class, $result2);
  179. }
  180. }