Failed Conditions
Pull Request — develop (#6873)
by
unknown
112:44 queued 47:41
created

testBasicQueryCache()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 60
Code Lines 43

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 43
nc 1
nop 0
dl 0
loc 60
rs 9.5555
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM\Functional;
6
7
use Doctrine\ORM\AbstractQuery;
8
use Doctrine\ORM\Cache;
9
use Doctrine\ORM\Cache\EntityCacheEntry;
10
use Doctrine\ORM\Cache\EntityCacheKey;
11
use Doctrine\ORM\Cache\QueryCacheKey;
12
use Doctrine\ORM\Query;
13
use Doctrine\ORM\Query\ResultSetMapping;
14
use Doctrine\Tests\Models\Cache\Attraction;
15
use Doctrine\Tests\Models\Cache\City;
16
use Doctrine\Tests\Models\Cache\Country;
17
use Doctrine\Tests\Models\Cache\State;
18
use ProxyManager\Proxy\GhostObjectInterface;
0 ignored issues
show
Bug introduced by
The type ProxyManager\Proxy\GhostObjectInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
19
20
/**
21
 * @group DDC-2183
22
 */
23
class SecondLevelCacheQueryCacheTest extends SecondLevelCacheAbstractTest
24
{
25
    public function testBasicQueryCache()
26
    {
27
        $this->evictRegions();
28
        $this->loadFixturesCountries();
29
30
        $this->secondLevelCacheLogger->clearStats();
31
        $this->em->clear();
32
33
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
34
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
35
36
        $queryCount = $this->getCurrentQueryCount();
37
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
38
        $result1    = $this->em->createQuery($dql)->setCacheable(true)->getResult();
39
40
        self::assertCount(2, $result1);
41
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
42
        self::assertEquals($this->countries[0]->getId(), $result1[0]->getId());
43
        self::assertEquals($this->countries[1]->getId(), $result1[1]->getId());
44
        self::assertEquals($this->countries[0]->getName(), $result1[0]->getName());
45
        self::assertEquals($this->countries[1]->getName(), $result1[1]->getName());
46
47
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
48
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
49
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
50
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
51
52
        $this->em->clear();
53
54
        $result2  = $this->em->createQuery($dql)
55
            ->setCacheable(true)
56
            ->getResult();
57
58
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
59
        self::assertCount(2, $result2);
60
61
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
62
        self::assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
63
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
64
65
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
66
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
67
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
68
69
        self::assertInstanceOf(Country::class, $result2[0]);
70
        self::assertInstanceOf(Country::class, $result2[1]);
71
72
        self::assertEquals($result1[0]->getId(), $result2[0]->getId());
73
        self::assertEquals($result1[1]->getId(), $result2[1]->getId());
74
75
        self::assertEquals($result1[0]->getName(), $result2[0]->getName());
76
        self::assertEquals($result1[1]->getName(), $result2[1]->getName());
77
78
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
79
        self::assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
80
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
81
82
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
83
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
84
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
85
    }
86
87
    public function testQueryCacheModeGet()
88
    {
89
        $this->evictRegions();
90
        $this->loadFixturesCountries();
91
        $this->evictRegions();
92
93
        $this->secondLevelCacheLogger->clearStats();
94
        $this->em->clear();
95
96
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
97
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
98
99
        $queryCount = $this->getCurrentQueryCount();
100
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
101
        $queryGet   = $this->em->createQuery($dql)
102
            ->setCacheMode(Cache::MODE_GET)
103
            ->setCacheable(true);
104
105
        // MODE_GET should never add items to the cache.
106
        self::assertCount(2, $queryGet->getResult());
107
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
108
109
        self::assertCount(2, $queryGet->getResult());
110
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
111
112
        $result = $this->em->createQuery($dql)
113
            ->setCacheable(true)
114
            ->getResult();
115
116
        self::assertCount(2, $result);
117
        self::assertEquals($queryCount + 3, $this->getCurrentQueryCount());
118
119
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
120
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
121
122
        // MODE_GET should read items if exists.
123
        self::assertCount(2, $queryGet->getResult());
124
        self::assertEquals($queryCount + 3, $this->getCurrentQueryCount());
125
    }
126
127
    public function testQueryCacheModePut()
128
    {
129
        $this->evictRegions();
130
        $this->loadFixturesCountries();
131
        $this->evictRegions();
132
133
        $this->secondLevelCacheLogger->clearStats();
134
        $this->em->clear();
135
136
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
137
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
138
139
        $queryCount = $this->getCurrentQueryCount();
140
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
141
        $result     = $this->em->createQuery($dql)
142
            ->setCacheable(true)
143
            ->getResult();
144
145
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
146
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
147
148
        self::assertCount(2, $result);
149
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
150
151
        $queryPut = $this->em->createQuery($dql)
152
            ->setCacheMode(Cache::MODE_PUT)
153
            ->setCacheable(true);
154
155
        // MODE_PUT should never read itens from cache.
156
        self::assertCount(2, $queryPut->getResult());
157
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
158
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
159
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
160
161
        self::assertCount(2, $queryPut->getResult());
162
        self::assertEquals($queryCount + 3, $this->getCurrentQueryCount());
163
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
164
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
165
    }
166
167
    public function testQueryCacheModeRefresh()
168
    {
169
        $this->evictRegions();
170
        $this->loadFixturesCountries();
171
        $this->evictRegions();
172
173
        $this->secondLevelCacheLogger->clearStats();
174
        $this->em->clear();
175
176
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
177
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
178
179
        $region     = $this->cache->getEntityCacheRegion(Country::class);
180
        $queryCount = $this->getCurrentQueryCount();
181
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
182
        $result     = $this->em->createQuery($dql)
183
            ->setCacheable(true)
184
            ->getResult();
185
186
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
187
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
188
189
        self::assertCount(2, $result);
190
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
191
192
        $countryId1     = $this->countries[0]->getId();
193
        $countryId2     = $this->countries[1]->getId();
194
        $countryName1   = $this->countries[0]->getName();
195
        $countryName2   = $this->countries[1]->getName();
196
197
        $key1           = new EntityCacheKey(Country::class, ['id'=>$countryId1]);
198
        $key2           = new EntityCacheKey(Country::class, ['id'=>$countryId2]);
199
        $entry1         = new EntityCacheEntry(Country::class, ['id'=>$countryId1, 'name'=>'outdated']);
200
        $entry2         = new EntityCacheEntry(Country::class, ['id'=>$countryId2, 'name'=>'outdated']);
201
202
        $region->put($key1, $entry1);
203
        $region->put($key2, $entry2);
204
        $this->em->clear();
205
206
        $queryRefresh = $this->em->createQuery($dql)
207
            ->setCacheMode(Cache::MODE_REFRESH)
208
            ->setCacheable(true);
209
210
        // MODE_REFRESH should never read itens from cache.
211
        $result1 = $queryRefresh->getResult();
212
        self::assertCount(2, $result1);
213
        self::assertEquals($countryName1, $result1[0]->getName());
214
        self::assertEquals($countryName2, $result1[1]->getName());
215
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
216
217
        $this->em->clear();
218
219
        $result2 = $queryRefresh->getResult();
220
        self::assertCount(2, $result2);
221
        self::assertEquals($countryName1, $result2[0]->getName());
222
        self::assertEquals($countryName2, $result2[1]->getName());
223
        self::assertEquals($queryCount + 3, $this->getCurrentQueryCount());
224
    }
225
226
    public function testBasicQueryCachePutEntityCache()
227
    {
228
        $this->evictRegions();
229
        $this->loadFixturesCountries();
230
231
        $this->evictRegions();
232
        $this->secondLevelCacheLogger->clearStats();
233
        $this->em->clear();
234
235
        $queryCount = $this->getCurrentQueryCount();
236
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
237
        $result1    = $this->em->createQuery($dql)->setCacheable(true)->getResult();
238
239
        self::assertCount(2, $result1);
240
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
241
        self::assertEquals($this->countries[0]->getId(), $result1[0]->getId());
242
        self::assertEquals($this->countries[1]->getId(), $result1[1]->getId());
243
        self::assertEquals($this->countries[0]->getName(), $result1[0]->getName());
244
        self::assertEquals($this->countries[1]->getName(), $result1[1]->getName());
245
246
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
247
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
248
249
        self::assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
250
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
251
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
252
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
253
        self::assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(Country::class)));
254
255
        $this->em->clear();
256
257
        $result2  = $this->em->createQuery($dql)
258
            ->setCacheable(true)
259
            ->getResult();
260
261
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
262
        self::assertCount(2, $result2);
263
264
        self::assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
265
        self::assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
266
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
267
268
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
269
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
270
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
271
272
        self::assertInstanceOf(Country::class, $result2[0]);
273
        self::assertInstanceOf(Country::class, $result2[1]);
274
275
        self::assertEquals($result1[0]->getId(), $result2[0]->getId());
276
        self::assertEquals($result1[1]->getId(), $result2[1]->getId());
277
278
        self::assertEquals($result1[0]->getName(), $result2[0]->getName());
279
        self::assertEquals($result1[1]->getName(), $result2[1]->getName());
280
281
        self::assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
282
        self::assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
283
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
284
285
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
286
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
287
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
288
    }
289
290
    /**
291
     * @group 5854
292
     */
293
    public function testMultipleNestedDQLAliases()
294
    {
295
        $this->loadFixturesCountries();
296
        $this->loadFixturesStates();
297
        $this->loadFixturesCities();
298
        $this->loadFixturesAttractions();
299
300
        $queryRegionName      = $this->getDefaultQueryRegionName();
0 ignored issues
show
Unused Code introduced by
The assignment to $queryRegionName is dead and can be removed.
Loading history...
301
        $cityRegionName       = $this->getEntityRegion(City::class);
0 ignored issues
show
Unused Code introduced by
The assignment to $cityRegionName is dead and can be removed.
Loading history...
302
        $stateRegionName      = $this->getEntityRegion(State::class);
0 ignored issues
show
Unused Code introduced by
The assignment to $stateRegionName is dead and can be removed.
Loading history...
303
        $attractionRegionName = $this->getEntityRegion(Attraction::class);
0 ignored issues
show
Unused Code introduced by
The assignment to $attractionRegionName is dead and can be removed.
Loading history...
304
305
        $this->secondLevelCacheLogger->clearStats();
306
        $this->evictRegions();
307
        $this->em->clear();
308
309
        $queryCount = $this->getCurrentQueryCount();
310
        $dql        = 'SELECT s, c, a FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c JOIN c.attractions a';
311
        $result1    = $this->em->createQuery($dql)
312
            ->setCacheable(true)
313
            ->getResult();
314
315
        self::assertCount(2, $result1);
316
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
317
318
        self::assertTrue($this->cache->containsEntity(State::class, $this->states[0]->getId()));
319
        self::assertTrue($this->cache->containsEntity(State::class, $this->states[1]->getId()));
320
321
        self::assertTrue($this->cache->containsEntity(City::class, $this->cities[0]->getId()));
322
        self::assertTrue($this->cache->containsEntity(City::class, $this->cities[1]->getId()));
323
        self::assertTrue($this->cache->containsEntity(City::class, $this->cities[2]->getId()));
324
        self::assertTrue($this->cache->containsEntity(City::class, $this->cities[3]->getId()));
325
326
        self::assertTrue($this->cache->containsEntity(Attraction::class, $this->attractions[0]->getId()));
327
        self::assertTrue($this->cache->containsEntity(Attraction::class, $this->attractions[1]->getId()));
328
        self::assertTrue($this->cache->containsEntity(Attraction::class, $this->attractions[2]->getId()));
329
        self::assertTrue($this->cache->containsEntity(Attraction::class, $this->attractions[3]->getId()));
330
331
        self::assertInstanceOf(State::class, $result1[0]);
332
        self::assertInstanceOf(State::class, $result1[1]);
333
334
        self::assertCount(2, $result1[0]->getCities());
335
        self::assertCount(2, $result1[1]->getCities());
336
337
        self::assertInstanceOf(City::class, $result1[0]->getCities()->get(0));
338
        self::assertInstanceOf(City::class, $result1[0]->getCities()->get(1));
339
        self::assertInstanceOf(City::class, $result1[1]->getCities()->get(0));
340
        self::assertInstanceOf(City::class, $result1[1]->getCities()->get(1));
341
342
        self::assertCount(2, $result1[0]->getCities()->get(0)->getAttractions());
343
        self::assertCount(2, $result1[0]->getCities()->get(1)->getAttractions());
344
        self::assertCount(2, $result1[1]->getCities()->get(0)->getAttractions());
345
        self::assertCount(1, $result1[1]->getCities()->get(1)->getAttractions());
346
347
        $this->em->clear();
348
349
        $result2  = $this->em->createQuery($dql)
350
            ->setCacheable(true)
351
            ->getResult();
352
353
        self::assertCount(2, $result2);
354
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
355
356
        self::assertInstanceOf(State::class, $result2[0]);
357
        self::assertInstanceOf(State::class, $result2[1]);
358
359
        self::assertCount(2, $result2[0]->getCities());
360
        self::assertCount(2, $result2[1]->getCities());
361
362
        self::assertInstanceOf(City::class, $result2[0]->getCities()->get(0));
363
        self::assertInstanceOf(City::class, $result2[0]->getCities()->get(1));
364
        self::assertInstanceOf(City::class, $result2[1]->getCities()->get(0));
365
        self::assertInstanceOf(City::class, $result2[1]->getCities()->get(1));
366
367
        self::assertCount(2, $result2[0]->getCities()->get(0)->getAttractions());
368
        self::assertCount(2, $result2[0]->getCities()->get(1)->getAttractions());
369
        self::assertCount(2, $result2[1]->getCities()->get(0)->getAttractions());
370
        self::assertCount(1, $result2[1]->getCities()->get(1)->getAttractions());
371
    }
372
373
    public function testBasicQueryParams()
374
    {
375
        $this->evictRegions();
376
377
        $this->loadFixturesCountries();
378
        $this->em->clear();
379
380
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
381
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
382
383
        $queryCount = $this->getCurrentQueryCount();
384
        $name       = $this->countries[0]->getName();
385
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c WHERE c.name = :name';
386
        $result1    = $this->em->createQuery($dql)
387
                ->setCacheable(true)
388
                ->setParameter('name', $name)
389
                ->getResult();
390
391
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
392
        self::assertEquals($this->countries[0]->getId(), $result1[0]->getId());
393
        self::assertEquals($this->countries[0]->getName(), $result1[0]->getName());
394
395
        $this->em->clear();
396
397
        $result2  = $this->em->createQuery($dql)->setCacheable(true)
398
                ->setParameter('name', $name)
399
                ->getResult();
400
401
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
402
        self::assertCount(1, $result2);
403
404
        self::assertInstanceOf(Country::class, $result2[0]);
405
406
        self::assertEquals($result1[0]->getId(), $result2[0]->getId());
407
        self::assertEquals($result1[0]->getName(), $result2[0]->getName());
408
    }
409
410
    public function testLoadFromDatabaseWhenEntityMissing()
411
    {
412
        $this->evictRegions();
413
414
        $this->loadFixturesCountries();
415
        $this->em->clear();
416
417
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
418
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
419
420
        $queryCount = $this->getCurrentQueryCount();
421
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
422
        $result1    = $this->em->createQuery($dql)->setCacheable(true)->getResult();
423
424
        self::assertCount(2, $result1);
425
        self::assertEquals($queryCount + 1 , $this->getCurrentQueryCount());
426
        self::assertEquals($this->countries[0]->getId(), $result1[0]->getId());
427
        self::assertEquals($this->countries[1]->getId(), $result1[1]->getId());
428
        self::assertEquals($this->countries[0]->getName(), $result1[0]->getName());
429
        self::assertEquals($this->countries[1]->getName(), $result1[1]->getName());
430
431
        self::assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
432
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
433
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
434
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
435
436
        $this->cache->evictEntity(Country::class, $result1[0]->getId());
437
        self::assertFalse($this->cache->containsEntity(Country::class, $result1[0]->getId()));
438
439
        $this->em->clear();
440
441
        $result2  = $this->em->createQuery($dql)
442
            ->setCacheable(true)
443
            ->getResult();
444
445
        self::assertEquals($queryCount + 2 , $this->getCurrentQueryCount());
446
        self::assertCount(2, $result2);
447
448
        self::assertEquals(5, $this->secondLevelCacheLogger->getPutCount());
449
        self::assertEquals(3, $this->secondLevelCacheLogger->getMissCount());
450
        self::assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
451
        self::assertEquals(2, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
452
453
        self::assertInstanceOf(Country::class, $result2[0]);
454
        self::assertInstanceOf(Country::class, $result2[1]);
455
456
        self::assertEquals($result1[0]->getId(), $result2[0]->getId());
457
        self::assertEquals($result1[1]->getId(), $result2[1]->getId());
458
459
        self::assertEquals($result1[0]->getName(), $result2[0]->getName());
460
        self::assertEquals($result1[1]->getName(), $result2[1]->getName());
461
462
        self::assertEquals($queryCount + 2 , $this->getCurrentQueryCount());
463
    }
464
465
    public function testBasicQueryFetchJoinsOneToMany()
466
    {
467
        $this->loadFixturesCountries();
468
        $this->loadFixturesStates();
469
        $this->loadFixturesCities();
470
471
        $this->evictRegions();
472
        $this->em->clear();
473
474
        $queryCount = $this->getCurrentQueryCount();
475
        $dql        = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c';
476
        $result1    = $this->em->createQuery($dql)
477
                ->setCacheable(true)
478
                ->getResult();
479
480
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
481
        self::assertInstanceOf(State::class, $result1[0]);
482
        self::assertInstanceOf(State::class, $result1[1]);
483
        self::assertCount(2, $result1[0]->getCities());
484
        self::assertCount(2, $result1[1]->getCities());
485
486
        self::assertInstanceOf(City::class, $result1[0]->getCities()->get(0));
487
        self::assertInstanceOf(City::class, $result1[0]->getCities()->get(1));
488
        self::assertInstanceOf(City::class, $result1[1]->getCities()->get(0));
489
        self::assertInstanceOf(City::class, $result1[1]->getCities()->get(1));
490
491
        self::assertNotNull($result1[0]->getCities()->get(0)->getId());
492
        self::assertNotNull($result1[0]->getCities()->get(1)->getId());
493
        self::assertNotNull($result1[1]->getCities()->get(0)->getId());
494
        self::assertNotNull($result1[1]->getCities()->get(1)->getId());
495
496
        self::assertNotNull($result1[0]->getCities()->get(0)->getName());
497
        self::assertNotNull($result1[0]->getCities()->get(1)->getName());
498
        self::assertNotNull($result1[1]->getCities()->get(0)->getName());
499
        self::assertNotNull($result1[1]->getCities()->get(1)->getName());
500
501
        $this->em->clear();
502
503
        $result2  = $this->em->createQuery($dql)
504
                ->setCacheable(true)
505
                ->getResult();
506
507
        self::assertInstanceOf(State::class, $result2[0]);
508
        self::assertInstanceOf(State::class, $result2[1]);
509
        self::assertCount(2, $result2[0]->getCities());
510
        self::assertCount(2, $result2[1]->getCities());
511
512
        self::assertInstanceOf(City::class, $result2[0]->getCities()->get(0));
513
        self::assertInstanceOf(City::class, $result2[0]->getCities()->get(1));
514
        self::assertInstanceOf(City::class, $result2[1]->getCities()->get(0));
515
        self::assertInstanceOf(City::class, $result2[1]->getCities()->get(1));
516
517
        self::assertNotNull($result2[0]->getCities()->get(0)->getId());
518
        self::assertNotNull($result2[0]->getCities()->get(1)->getId());
519
        self::assertNotNull($result2[1]->getCities()->get(0)->getId());
520
        self::assertNotNull($result2[1]->getCities()->get(1)->getId());
521
522
        self::assertNotNull($result2[0]->getCities()->get(0)->getName());
523
        self::assertNotNull($result2[0]->getCities()->get(1)->getName());
524
        self::assertNotNull($result2[1]->getCities()->get(0)->getName());
525
        self::assertNotNull($result2[1]->getCities()->get(1)->getName());
526
527
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
528
    }
529
530
    public function testBasicQueryFetchJoinsManyToOne()
531
    {
532
        $this->loadFixturesCountries();
533
        $this->loadFixturesStates();
534
        $this->loadFixturesCities();
535
        $this->em->clear();
536
537
        $this->evictRegions();
538
        $this->secondLevelCacheLogger->clearStats();
539
540
        $queryCount = $this->getCurrentQueryCount();
541
        $dql        = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s';
542
        $result1    = $this->em->createQuery($dql)
543
                ->setCacheable(true)
544
                ->getResult();
545
546
        self::assertCount(4, $result1);
547
        self::assertInstanceOf(City::class, $result1[0]);
548
        self::assertInstanceOf(City::class, $result1[1]);
549
        self::assertInstanceOf(State::class, $result1[0]->getState());
550
        self::assertInstanceOf(State::class, $result1[1]->getState());
551
552
        self::assertTrue($this->cache->containsEntity(City::class, $result1[0]->getId()));
553
        self::assertTrue($this->cache->containsEntity(City::class, $result1[1]->getId()));
554
        self::assertTrue($this->cache->containsEntity(State::class, $result1[0]->getState()->getId()));
555
        self::assertTrue($this->cache->containsEntity(State::class, $result1[1]->getState()->getId()));
556
557
        self::assertEquals(7, $this->secondLevelCacheLogger->getPutCount());
558
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
559
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
560
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
561
        self::assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(State::class)));
562
        self::assertEquals(4, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(City::class)));
563
564
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
565
566
        $this->em->clear();
567
        $this->secondLevelCacheLogger->clearStats();
568
569
        $result2  = $this->em->createQuery($dql)
570
                ->setCacheable(true)
571
                ->getResult();
572
573
        self::assertCount(4, $result1);
574
        self::assertInstanceOf(City::class, $result2[0]);
575
        self::assertInstanceOf(City::class, $result2[1]);
576
        self::assertInstanceOf(State::class, $result2[0]->getState());
577
        self::assertInstanceOf(State::class, $result2[1]->getState());
578
579
        self::assertNotNull($result2[0]->getId());
580
        self::assertNotNull($result2[0]->getId());
581
        self::assertNotNull($result2[1]->getState()->getId());
582
        self::assertNotNull($result2[1]->getState()->getId());
583
584
        self::assertNotNull($result2[0]->getName());
585
        self::assertNotNull($result2[0]->getName());
586
        self::assertNotNull($result2[1]->getState()->getName());
587
        self::assertNotNull($result2[1]->getState()->getName());
588
589
        self::assertEquals($result1[0]->getName(), $result2[0]->getName());
590
        self::assertEquals($result1[1]->getName(), $result2[1]->getName());
591
        self::assertEquals($result1[0]->getState()->getName(), $result2[0]->getState()->getName());
592
        self::assertEquals($result1[1]->getState()->getName(), $result2[1]->getState()->getName());
593
594
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
595
    }
596
597
    public function testReloadQueryIfToOneIsNotFound()
598
    {
599
        $this->loadFixturesCountries();
600
        $this->loadFixturesStates();
601
        $this->loadFixturesCities();
602
        $this->em->clear();
603
604
        $this->evictRegions();
605
        $this->secondLevelCacheLogger->clearStats();
606
607
        $queryCount = $this->getCurrentQueryCount();
608
        $dql        = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s';
609
        $result1    = $this->em->createQuery($dql)
610
                ->setCacheable(true)
611
                ->getResult();
612
613
        self::assertCount(4, $result1);
614
        self::assertInstanceOf(City::class, $result1[0]);
615
        self::assertInstanceOf(City::class, $result1[1]);
616
        self::assertInstanceOf(State::class, $result1[0]->getState());
617
        self::assertInstanceOf(State::class, $result1[1]->getState());
618
619
        self::assertTrue($this->cache->containsEntity(City::class, $result1[0]->getId()));
620
        self::assertTrue($this->cache->containsEntity(City::class, $result1[1]->getId()));
621
        self::assertTrue($this->cache->containsEntity(State::class, $result1[0]->getState()->getId()));
622
        self::assertTrue($this->cache->containsEntity(State::class, $result1[1]->getState()->getId()));
623
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
624
625
        $this->em->clear();
626
627
        $this->cache->evictEntityRegion(State::class);
628
629
        $result2  = $this->em->createQuery($dql)
630
                ->setCacheable(true)
631
                ->getResult();
632
633
        self::assertCount(4, $result1);
634
        self::assertInstanceOf(City::class, $result2[0]);
635
        self::assertInstanceOf(City::class, $result2[1]);
636
        self::assertInstanceOf(State::class, $result2[0]->getState());
637
        self::assertInstanceOf(State::class, $result2[1]->getState());
638
639
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
640
    }
641
642
    public function testReloadQueryIfToManyAssociationItemIsNotFound()
643
    {
644
        $this->loadFixturesCountries();
645
        $this->loadFixturesStates();
646
        $this->loadFixturesCities();
647
648
        $this->evictRegions();
649
        $this->em->clear();
650
651
        $queryCount = $this->getCurrentQueryCount();
652
        $dql        = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c';
653
        $result1    = $this->em->createQuery($dql)
654
                ->setCacheable(true)
655
                ->getResult();
656
657
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
658
        self::assertInstanceOf(State::class, $result1[0]);
659
        self::assertInstanceOf(State::class, $result1[1]);
660
        self::assertCount(2, $result1[0]->getCities());
661
        self::assertCount(2, $result1[1]->getCities());
662
663
        self::assertInstanceOf(City::class, $result1[0]->getCities()->get(0));
664
        self::assertInstanceOf(City::class, $result1[0]->getCities()->get(1));
665
        self::assertInstanceOf(City::class, $result1[1]->getCities()->get(0));
666
        self::assertInstanceOf(City::class, $result1[1]->getCities()->get(1));
667
668
        $this->em->clear();
669
670
        $this->cache->evictEntityRegion(City::class);
671
672
        $result2  = $this->em->createQuery($dql)
673
                ->setCacheable(true)
674
                ->getResult();
675
676
        self::assertInstanceOf(State::class, $result2[0]);
677
        self::assertInstanceOf(State::class, $result2[1]);
678
        self::assertCount(2, $result2[0]->getCities());
679
        self::assertCount(2, $result2[1]->getCities());
680
681
        self::assertInstanceOf(City::class, $result2[0]->getCities()->get(0));
682
        self::assertInstanceOf(City::class, $result2[0]->getCities()->get(1));
683
        self::assertInstanceOf(City::class, $result2[1]->getCities()->get(0));
684
        self::assertInstanceOf(City::class, $result2[1]->getCities()->get(1));
685
686
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
687
    }
688
689
    public function testBasicNativeQueryCache()
690
    {
691
        $this->evictRegions();
692
        $this->loadFixturesCountries();
693
694
        $this->secondLevelCacheLogger->clearStats();
695
        $this->em->clear();
696
697
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
698
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
699
700
        $rsm = new ResultSetMapping;
701
        $rsm->addEntityResult(Country::class, 'c');
702
        $rsm->addFieldResult('c', 'name', 'name');
703
        $rsm->addFieldResult('c', 'id', 'id');
704
705
        $queryCount = $this->getCurrentQueryCount();
706
        $sql        = 'SELECT id, name FROM cache_country';
707
        $result1    = $this->em->createNativeQuery($sql, $rsm)->setCacheable(true)->getResult();
708
709
        self::assertCount(2, $result1);
710
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
711
        self::assertEquals($this->countries[0]->getId(), $result1[0]->getId());
712
        self::assertEquals($this->countries[1]->getId(), $result1[1]->getId());
713
        self::assertEquals($this->countries[0]->getName(), $result1[0]->getName());
714
        self::assertEquals($this->countries[1]->getName(), $result1[1]->getName());
715
716
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
717
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
718
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
719
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
720
721
        $this->em->clear();
722
723
        $result2  = $this->em->createNativeQuery($sql, $rsm)
724
            ->setCacheable(true)
725
            ->getResult();
726
727
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
728
        self::assertCount(2, $result2);
729
730
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
731
        self::assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
732
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
733
734
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
735
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
736
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
737
738
        self::assertInstanceOf(Country::class, $result2[0]);
739
        self::assertInstanceOf(Country::class, $result2[1]);
740
741
        self::assertEquals($result1[0]->getId(), $result2[0]->getId());
742
        self::assertEquals($result1[1]->getId(), $result2[1]->getId());
743
744
        self::assertEquals($result1[0]->getName(), $result2[0]->getName());
745
        self::assertEquals($result1[1]->getName(), $result2[1]->getName());
746
747
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
748
        self::assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
749
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
750
751
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
752
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
753
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
754
    }
755
756
    public function testQueryDependsOnFirstAndMaxResultResult()
757
    {
758
        $this->evictRegions();
759
        $this->loadFixturesCountries();
760
761
        $this->secondLevelCacheLogger->clearStats();
762
        $this->em->clear();
763
764
        $queryCount = $this->getCurrentQueryCount();
765
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
766
        $result1    = $this->em->createQuery($dql)
0 ignored issues
show
Unused Code introduced by
The assignment to $result1 is dead and can be removed.
Loading history...
767
            ->setCacheable(true)
768
            ->setFirstResult(1)
769
            ->setMaxResults(1)
770
            ->getResult();
771
772
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
773
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
774
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
775
776
        $this->em->clear();
777
778
        $result2  = $this->em->createQuery($dql)
0 ignored issues
show
Unused Code introduced by
The assignment to $result2 is dead and can be removed.
Loading history...
779
            ->setCacheable(true)
780
            ->setFirstResult(2)
781
            ->setMaxResults(1)
782
            ->getResult();
783
784
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
785
        self::assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
786
        self::assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
787
788
        $this->em->clear();
789
790
        $result3  = $this->em->createQuery($dql)
0 ignored issues
show
Unused Code introduced by
The assignment to $result3 is dead and can be removed.
Loading history...
791
            ->setCacheable(true)
792
            ->getResult();
793
794
        self::assertEquals($queryCount + 3, $this->getCurrentQueryCount());
795
        self::assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
796
        self::assertEquals(3, $this->secondLevelCacheLogger->getMissCount());
797
    }
798
799
    public function testQueryCacheLifetime()
800
    {
801
        $this->evictRegions();
802
        $this->loadFixturesCountries();
803
804
        $this->secondLevelCacheLogger->clearStats();
805
        $this->em->clear();
806
807
        $getHash = function(AbstractQuery $query){
808
            $method = new \ReflectionMethod($query, 'getHash');
809
            $method->setAccessible(true);
810
811
            return $method->invoke($query);
812
        };
813
814
        $queryCount = $this->getCurrentQueryCount();
815
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
816
        $query      = $this->em->createQuery($dql);
817
        $result1    = $query->setCacheable(true)
818
            ->setLifetime(3600)
819
            ->getResult();
820
821
        self::assertNotEmpty($result1);
822
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
823
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
824
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
825
826
        $this->em->clear();
827
828
        $key   = new QueryCacheKey($getHash($query), 3600);
829
        $entry = $this->cache->getQueryCache()
830
            ->getRegion()
831
            ->get($key);
832
833
        self::assertInstanceOf(Cache\QueryCacheEntry::class, $entry);
834
        $entry->time = $entry->time / 2;
0 ignored issues
show
Bug introduced by
Accessing time on the interface Doctrine\ORM\Cache\CacheEntry suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
835
836
        $this->cache->getQueryCache()
837
            ->getRegion()
838
            ->put($key, $entry);
839
840
        $result2  = $this->em->createQuery($dql)
841
            ->setCacheable(true)
842
            ->setLifetime(3600)
843
            ->getResult();
844
845
        self::assertNotEmpty($result2);
846
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
847
        self::assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
848
        self::assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
849
    }
850
851
    public function testQueryCacheRegion()
852
    {
853
        $this->evictRegions();
854
        $this->loadFixturesCountries();
855
856
        $this->secondLevelCacheLogger->clearStats();
857
        $this->em->clear();
858
859
        $queryCount = $this->getCurrentQueryCount();
860
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
861
        $query      = $this->em->createQuery($dql);
862
863
        $query1     = clone $query;
864
        $result1    = $query1->setCacheable(true)
865
            ->setCacheRegion('foo_region')
866
            ->getResult();
867
868
        self::assertNotEmpty($result1);
869
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
870
        self::assertEquals(0, $this->secondLevelCacheLogger->getHitCount());
871
        self::assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
872
        self::assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
873
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('foo_region'));
874
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('foo_region'));
875
876
        $query2     = clone $query;
877
        $result2    = $query2->setCacheable(true)
878
            ->setCacheRegion('bar_region')
879
            ->getResult();
880
881
        self::assertNotEmpty($result2);
882
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
883
        self::assertEquals(0, $this->secondLevelCacheLogger->getHitCount());
884
        self::assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
885
        self::assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
886
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('bar_region'));
887
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('bar_region'));
888
889
        $query3     = clone $query;
890
        $result3    = $query3->setCacheable(true)
891
            ->setCacheRegion('foo_region')
892
            ->getResult();
893
894
        self::assertNotEmpty($result3);
895
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
896
        self::assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
897
        self::assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
898
        self::assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
899
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount('foo_region'));
900
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('foo_region'));
901
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('foo_region'));
902
903
        $query4     = clone $query;
904
        $result4    = $query4->setCacheable(true)
0 ignored issues
show
Unused Code introduced by
The assignment to $result4 is dead and can be removed.
Loading history...
905
            ->setCacheRegion('bar_region')
906
            ->getResult();
907
908
        self::assertNotEmpty($result3);
909
        self::assertEquals($queryCount + 2, $this->getCurrentQueryCount());
910
        self::assertEquals(6, $this->secondLevelCacheLogger->getHitCount());
911
        self::assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
912
        self::assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
913
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount('bar_region'));
914
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('bar_region'));
915
        self::assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('bar_region'));
916
    }
917
918
    public function testResolveAssociationCacheEntry()
919
    {
920
        $this->evictRegions();
921
        $this->loadFixturesCountries();
922
        $this->loadFixturesStates();
923
924
        $this->em->clear();
925
926
        $stateId     = $this->states[0]->getId();
927
        $countryName = $this->states[0]->getCountry()->getName();
928
        $dql         = 'SELECT s FROM Doctrine\Tests\Models\Cache\State s WHERE s.id = :id';
929
        $query       = $this->em->createQuery($dql);
930
        $queryCount  = $this->getCurrentQueryCount();
931
932
        $query1 = clone $query;
933
        $state1 = $query1
934
            ->setParameter('id', $stateId)
935
            ->setCacheable(true)
936
            ->setMaxResults(1)
937
            ->getSingleResult();
938
939
        self::assertNotNull($state1);
940
        self::assertNotNull($state1->getCountry());
941
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
942
        self::assertInstanceOf(State::class, $state1);
943
        self::assertInstanceOf(GhostObjectInterface::class, $state1->getCountry());
944
        self::assertEquals($countryName, $state1->getCountry()->getName());
945
        self::assertEquals($stateId, $state1->getId());
946
947
        $this->em->clear();
948
949
        $queryCount = $this->getCurrentQueryCount();
950
        $query2     = clone $query;
951
        $state2     = $query2
952
            ->setParameter('id', $stateId)
953
            ->setCacheable(true)
954
            ->setMaxResults(1)
955
            ->getSingleResult();
956
957
        self::assertNotNull($state2);
958
        self::assertNotNull($state2->getCountry());
959
        self::assertEquals($queryCount, $this->getCurrentQueryCount());
960
        self::assertInstanceOf(State::class, $state2);
961
        self::assertInstanceOf(GhostObjectInterface::class, $state2->getCountry());
962
        self::assertEquals($countryName, $state2->getCountry()->getName());
963
        self::assertEquals($stateId, $state2->getId());
964
    }
965
966
    public function testResolveToOneAssociationCacheEntry()
967
    {
968
        $this->evictRegions();
969
        $this->loadFixturesCountries();
970
        $this->loadFixturesStates();
971
        $this->loadFixturesCities();
972
        $this->evictRegions();
973
974
        $this->em->clear();
975
976
        $cityId      = $this->cities[0]->getId();
977
        $dql         = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s WHERE c.id = :id';
978
        $query       = $this->em->createQuery($dql);
979
        $queryCount  = $this->getCurrentQueryCount();
980
981
        $query1 = clone $query;
982
        $city1 = $query1
983
            ->setParameter('id', $cityId)
984
            ->setCacheable(true)
985
            ->setMaxResults(1)
986
            ->getSingleResult();
987
988
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
989
        self::assertInstanceOf(City::class, $city1);
990
        self::assertInstanceOf(State::class, $city1->getState());
991
        self::assertInstanceOf(City::class, $city1->getState()->getCities()->get(0));
992
        self::assertInstanceOf(State::class, $city1->getState()->getCities()->get(0)->getState());
993
994
        $this->em->clear();
995
996
        $queryCount = $this->getCurrentQueryCount();
997
        $query2     = clone $query;
998
        $city2      = $query2
999
            ->setParameter('id', $cityId)
1000
            ->setCacheable(true)
1001
            ->setMaxResults(1)
1002
            ->getSingleResult();
1003
1004
        self::assertEquals($queryCount, $this->getCurrentQueryCount());
1005
        self::assertInstanceOf(City::class, $city2);
1006
        self::assertInstanceOf(State::class, $city2->getState());
1007
        self::assertInstanceOf(City::class, $city2->getState()->getCities()->get(0));
1008
        self::assertInstanceOf(State::class, $city2->getState()->getCities()->get(0)->getState());
1009
    }
1010
1011
    public function testResolveToManyAssociationCacheEntry()
1012
    {
1013
        $this->evictRegions();
1014
        $this->loadFixturesCountries();
1015
        $this->loadFixturesStates();
1016
        $this->loadFixturesCities();
1017
        $this->evictRegions();
1018
1019
        $this->em->clear();
1020
1021
        $stateId     = $this->states[0]->getId();
1022
        $dql         = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c WHERE s.id = :id';
1023
        $query       = $this->em->createQuery($dql);
1024
        $queryCount  = $this->getCurrentQueryCount();
1025
1026
        $query1 = clone $query;
1027
        $state1 = $query1
1028
            ->setParameter('id', $stateId)
1029
            ->setCacheable(true)
1030
            ->setMaxResults(1)
1031
            ->getSingleResult();
1032
1033
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
1034
        self::assertInstanceOf(State::class, $state1);
1035
        self::assertInstanceOf(GhostObjectInterface::class, $state1->getCountry());
1036
        self::assertInstanceOf(City::class, $state1->getCities()->get(0));
1037
        self::assertInstanceOf(State::class, $state1->getCities()->get(0)->getState());
1038
        self::assertSame($state1, $state1->getCities()->get(0)->getState());
1039
1040
        $this->em->clear();
1041
1042
        $queryCount = $this->getCurrentQueryCount();
1043
        $query2     = clone $query;
1044
        $state2     = $query2
1045
            ->setParameter('id', $stateId)
1046
            ->setCacheable(true)
1047
            ->setMaxResults(1)
1048
            ->getSingleResult();
1049
1050
        self::assertEquals($queryCount, $this->getCurrentQueryCount());
1051
        self::assertInstanceOf(State::class, $state2);
1052
        self::assertInstanceOf(GhostObjectInterface::class, $state2->getCountry());
1053
        self::assertInstanceOf(City::class, $state2->getCities()->get(0));
1054
        self::assertInstanceOf(State::class, $state2->getCities()->get(0)->getState());
1055
        self::assertSame($state2, $state2->getCities()->get(0)->getState());
1056
    }
1057
1058 View Code Duplication
    public function testHintClearEntityRegionUpdateStatement()
1059
    {
1060
        $this->evictRegions();
1061
        $this->loadFixturesCountries();
1062
1063
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
1064
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
1065
1066
        $this->em->createQuery('DELETE Doctrine\Tests\Models\Cache\Country u WHERE u.id = 4')
1067
            ->setHint(Query::HINT_CACHE_EVICT, true)
1068
            ->execute();
1069
1070
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
1071
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
1072
    }
1073
1074 View Code Duplication
    public function testHintClearEntityRegionDeleteStatement()
1075
    {
1076
        $this->evictRegions();
1077
        $this->loadFixturesCountries();
1078
1079
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
1080
        self::assertTrue($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
1081
1082
        $this->em->createQuery("UPDATE Doctrine\Tests\Models\Cache\Country u SET u.name = 'foo' WHERE u.id = 1")
1083
            ->setHint(Query::HINT_CACHE_EVICT, true)
1084
            ->execute();
1085
1086
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[0]->getId()));
1087
        self::assertFalse($this->cache->containsEntity(Country::class, $this->countries[1]->getId()));
1088
    }
1089
1090
    /**
1091
     * @expectedException \Doctrine\ORM\Cache\CacheException
1092
     * @expectedExceptionMessage Second level cache does not support partial entities.
1093
     */
1094
    public function testCacheablePartialQueryException()
1095
    {
1096
        $this->evictRegions();
1097
        $this->loadFixturesCountries();
1098
1099
        $this->em->createQuery("SELECT PARTIAL c.{id} FROM Doctrine\Tests\Models\Cache\Country c")
1100
            ->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
1101
            ->setCacheable(true)
1102
            ->getResult();
1103
    }
1104
1105
    /**
1106
     * @expectedException \Doctrine\ORM\Cache\CacheException
1107
     * @expectedExceptionMessage Second-level cache query supports only select statements.
1108
     */
1109
    public function testNonCacheableQueryDeleteStatementException()
1110
    {
1111
        $this->em->createQuery("DELETE Doctrine\Tests\Models\Cache\Country u WHERE u.id = 4")
1112
            ->setCacheable(true)
1113
            ->getResult();
1114
    }
1115
1116
    /**
1117
     * @expectedException \Doctrine\ORM\Cache\CacheException
1118
     * @expectedExceptionMessage Second-level cache query supports only select statements.
1119
     */
1120
    public function testNonCacheableQueryUpdateStatementException()
1121
    {
1122
        $this->em->createQuery("UPDATE Doctrine\Tests\Models\Cache\Country u SET u.name = 'foo' WHERE u.id = 4")
1123
            ->setCacheable(true)
1124
            ->getResult();
1125
    }
1126
1127
    public function testQueryCacheShouldBeEvictedOnTimestampUpdate()
1128
    {
1129
        $this->loadFixturesCountries();
1130
        $this->em->clear();
1131
1132
        $queryCount = $this->getCurrentQueryCount();
1133
        $dql        = 'SELECT country FROM Doctrine\Tests\Models\Cache\Country country';
1134
1135
        $result1    = $this->em->createQuery($dql)
1136
            ->setCacheable(true)
1137
            ->getResult();
1138
1139
        self::assertCount(2, $result1);
1140
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
1141
1142
        $this->em->persist(new Country('France'));
1143
        $this->em->flush();
1144
        $this->em->clear();
1145
1146
        $queryCount = $this->getCurrentQueryCount();
1147
1148
        $result2 = $this->em->createQuery($dql)
1149
            ->setCacheable(true)
1150
            ->getResult();
1151
1152
        self::assertCount(3, $result2);
1153
        self::assertEquals($queryCount + 1, $this->getCurrentQueryCount());
1154
1155
        foreach ($result2 as $entity) {
1156
            self::assertInstanceOf(Country::class, $entity);
1157
        }
1158
    }
1159
}
1160