-
Notifications
You must be signed in to change notification settings - Fork 1
/
EntityPreloadBlogOneHasManyTest.php
140 lines (108 loc) · 5 KB
/
EntityPreloadBlogOneHasManyTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php declare(strict_types = 1);
namespace ShipMonkTests\DoctrineEntityPreloader;
use Doctrine\ORM\Mapping\ClassMetadata;
use ShipMonkTests\DoctrineEntityPreloader\Fixtures\Blog\Article;
use ShipMonkTests\DoctrineEntityPreloader\Fixtures\Blog\Category;
use ShipMonkTests\DoctrineEntityPreloader\Lib\TestCase;
class EntityPreloadBlogOneHasManyTest extends TestCase
{
public function testOneHasManyUnoptimized(): void
{
$this->createDummyBlogData(categoryCount: 5, articleInEachCategoryCount: 5);
$categories = $this->getEntityManager()->getRepository(Category::class)->findAll();
$this->readArticleTitles($categories);
self::assertAggregatedQueries([
['count' => 1, 'query' => 'SELECT * FROM category t0'],
['count' => 5, 'query' => 'SELECT * FROM article t0 WHERE t0.category_id = ?'],
]);
}
public function testOneHasManyWithWithManualPreload(): void
{
$this->createDummyBlogData(categoryCount: 5, articleInEachCategoryCount: 5);
$categories = $this->getEntityManager()->getRepository(Category::class)->findAll();
$this->getEntityManager()->createQueryBuilder()
->select('article')
->from(Article::class, 'article')
->where('article.category IN (:categories)')
->setParameter('categories', $categories)
->getQuery()
->getResult();
$this->readArticleTitles($categories);
self::assertAggregatedQueries([
['count' => 1, 'query' => 'SELECT * FROM category t0'],
['count' => 1, 'query' => 'SELECT * FROM article a0_ WHERE a0_.category_id IN (?, ?, ?, ?, ?)'],
['count' => 5, 'query' => 'SELECT * FROM article t0 WHERE t0.category_id = ?'],
]);
}
public function testOneHasManyWithWithManualPreloadUsingPartial(): void
{
$this->skipIfPartialEntitiesAreNotSupported();
$this->createDummyBlogData(categoryCount: 5, articleInEachCategoryCount: 5);
$categories = $this->getEntityManager()->getRepository(Category::class)->findAll();
$this->getEntityManager()->createQueryBuilder()
->select('PARTIAL category.{id}', 'article')
->from(Category::class, 'category')
->leftJoin('category.articles', 'article')
->where('category IN (:categories)')
->setParameter('categories', $categories)
->getQuery()
->getResult();
$this->readArticleTitles($categories);
self::assertAggregatedQueries([
['count' => 1, 'query' => 'SELECT * FROM category t0'],
['count' => 1, 'query' => 'SELECT * FROM category c0_ LEFT JOIN article a1_ ON c0_.id = a1_.category_id WHERE c0_.id IN (?, ?, ?, ?, ?)'],
]);
}
public function testOneHasManyWithFetchJoin(): void
{
$this->createDummyBlogData(categoryCount: 5, articleInEachCategoryCount: 5);
$categories = $this->getEntityManager()->createQueryBuilder()
->select('category', 'article')
->from(Category::class, 'category')
->leftJoin('category.articles', 'article')
->getQuery()
->getResult();
$this->readArticleTitles($categories);
self::assertAggregatedQueries([
['count' => 1, 'query' => 'SELECT * FROM category c0_ LEFT JOIN article a1_ ON c0_.id = a1_.category_id'],
]);
}
public function testOneHasManyWithEagerFetchMode(): void
{
$this->createDummyBlogData(categoryCount: 5, articleInEachCategoryCount: 5);
$categories = $this->getEntityManager()->createQueryBuilder()
->select('category')
->from(Category::class, 'category')
->getQuery()
->setFetchMode(Category::class, 'articles', ClassMetadata::FETCH_EAGER)
->getResult();
$this->readArticleTitles($categories);
self::assertAggregatedQueries([
['count' => 1, 'query' => 'SELECT * FROM category c0_'],
['count' => 1, 'query' => 'SELECT * FROM article t0 WHERE t0.category_id IN (?, ?, ?, ?, ?)'],
]);
}
public function testOneHasManyWithPreload(): void
{
$this->createDummyBlogData(categoryCount: 5, articleInEachCategoryCount: 5);
$categories = $this->getEntityManager()->getRepository(Category::class)->findAll();
$this->getEntityPreloader()->preload($categories, 'articles');
$this->readArticleTitles($categories);
self::assertAggregatedQueries([
['count' => 1, 'query' => 'SELECT * FROM category t0'],
['count' => 1, 'query' => 'SELECT * FROM article a0_ WHERE a0_.category_id IN (?, ?, ?, ?, ?)'],
]);
}
/**
* @param array<Category> $categories
*/
private function readArticleTitles(array $categories): void
{
foreach ($categories as $category) {
$category->getName();
foreach ($category->getArticles() as $article) {
$article->getTitle();
}
}
}
}