Completed
Pull Request — master (#5856)
by Fabio
16:00 queued 08:04
created

testLoadFromDatabaseWhenEntityMissing()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 54
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 54
c 0
b 0
f 0
rs 9.6716
cc 1
eloc 38
nc 1
nop 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
namespace Doctrine\Tests\ORM\Functional;
4
5
use Doctrine\ORM\AbstractQuery;
6
use Doctrine\ORM\Query\ResultSetMapping;
7
use Doctrine\Tests\Models\Cache\City;
8
use Doctrine\Tests\Models\Cache\State;
9
use Doctrine\Tests\Models\Cache\Country;
10
use Doctrine\Tests\Models\Cache\Attraction;
11
use Doctrine\ORM\Cache\QueryCacheKey;
12
use Doctrine\ORM\Cache\EntityCacheKey;
13
use Doctrine\ORM\Cache\EntityCacheEntry;
14
use Doctrine\ORM\Query;
15
use Doctrine\ORM\Cache;
16
17
/**
18
 * @group DDC-2183
19
 */
20
class SecondLevelCacheQueryCacheTest extends SecondLevelCacheAbstractTest
21
{
22
    public function testBasicQueryCache()
23
    {
24
        $this->evictRegions();
25
        $this->loadFixturesCountries();
26
27
        $this->secondLevelCacheLogger->clearStats();
28
        $this->_em->clear();
29
30
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
31
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
32
33
        $queryCount = $this->getCurrentQueryCount();
34
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
35
        $result1    = $this->_em->createQuery($dql)->setCacheable(true)->getResult();
36
37
        $this->assertCount(2, $result1);
38
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
39
        $this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
40
        $this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
41
        $this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
42
        $this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
43
44
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
45
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
46
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
47
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
48
49
        $this->_em->clear();
50
51
        $result2  = $this->_em->createQuery($dql)
52
            ->setCacheable(true)
53
            ->getResult();
54
55
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
56
        $this->assertCount(2, $result2);
57
58
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
59
        $this->assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
60
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
61
62
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
63
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
64
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
65
66
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
67
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
68
69
        $this->assertEquals($result1[0]->getId(), $result2[0]->getId());
70
        $this->assertEquals($result1[1]->getId(), $result2[1]->getId());
71
72
        $this->assertEquals($result1[0]->getName(), $result2[0]->getName());
73
        $this->assertEquals($result1[1]->getName(), $result2[1]->getName());
74
75
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
76
        $this->assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
77
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
78
79
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
80
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
81
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
82
    }
83
84
    public function testQueryCacheModeGet()
85
    {
86
        $this->evictRegions();
87
        $this->loadFixturesCountries();
88
        $this->evictRegions();
89
90
        $this->secondLevelCacheLogger->clearStats();
91
        $this->_em->clear();
92
93
        $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
94
        $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
95
96
        $queryCount = $this->getCurrentQueryCount();
97
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
98
        $queryGet   = $this->_em->createQuery($dql)
99
            ->setCacheMode(Cache::MODE_GET)
100
            ->setCacheable(true);
101
102
        // MODE_GET should never add items to the cache.
103
        $this->assertCount(2, $queryGet->getResult());
104
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
105
106
        $this->assertCount(2, $queryGet->getResult());
107
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
108
109
        $result = $this->_em->createQuery($dql)
110
            ->setCacheable(true)
111
            ->getResult();
112
113
        $this->assertCount(2, $result);
114
        $this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
115
116
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
117
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
118
119
        // MODE_GET should read items if exists.
120
        $this->assertCount(2, $queryGet->getResult());
121
        $this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
122
    }
123
124
    public function testQueryCacheModePut()
125
    {
126
        $this->evictRegions();
127
        $this->loadFixturesCountries();
128
        $this->evictRegions();
129
130
        $this->secondLevelCacheLogger->clearStats();
131
        $this->_em->clear();
132
133
        $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
134
        $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
135
136
        $queryCount = $this->getCurrentQueryCount();
137
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
138
        $result     = $this->_em->createQuery($dql)
139
            ->setCacheable(true)
140
            ->getResult();
141
142
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
143
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
144
145
        $this->assertCount(2, $result);
146
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
147
148
        $queryPut = $this->_em->createQuery($dql)
149
            ->setCacheMode(Cache::MODE_PUT)
150
            ->setCacheable(true);
151
152
        // MODE_PUT should never read itens from cache.
153
        $this->assertCount(2, $queryPut->getResult());
154
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
155
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
156
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
157
158
        $this->assertCount(2, $queryPut->getResult());
159
        $this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
160
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
161
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
162
    }
163
164
    public function testQueryCacheModeRefresh()
165
    {
166
        $this->evictRegions();
167
        $this->loadFixturesCountries();
168
        $this->evictRegions();
169
170
        $this->secondLevelCacheLogger->clearStats();
171
        $this->_em->clear();
172
173
        $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
174
        $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
175
176
        $region     = $this->cache->getEntityCacheRegion(Country::CLASSNAME);
177
        $queryCount = $this->getCurrentQueryCount();
178
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
179
        $result     = $this->_em->createQuery($dql)
180
            ->setCacheable(true)
181
            ->getResult();
182
183
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
184
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
185
186
        $this->assertCount(2, $result);
187
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
188
189
        $countryId1     = $this->countries[0]->getId();
190
        $countryId2     = $this->countries[1]->getId();
191
        $countryName1   = $this->countries[0]->getName();
192
        $countryName2   = $this->countries[1]->getName();
193
194
        $key1           = new EntityCacheKey(Country::CLASSNAME, array('id'=>$countryId1));
195
        $key2           = new EntityCacheKey(Country::CLASSNAME, array('id'=>$countryId2));
196
        $entry1         = new EntityCacheEntry(Country::CLASSNAME, array('id'=>$countryId1, 'name'=>'outdated'));
197
        $entry2         = new EntityCacheEntry(Country::CLASSNAME, array('id'=>$countryId2, 'name'=>'outdated'));
198
199
        $region->put($key1, $entry1);
200
        $region->put($key2, $entry2);
201
        $this->_em->clear();
202
203
        $queryRefresh = $this->_em->createQuery($dql)
204
            ->setCacheMode(Cache::MODE_REFRESH)
205
            ->setCacheable(true);
206
207
        // MODE_REFRESH should never read itens from cache.
208
        $result1 = $queryRefresh->getResult();
209
        $this->assertCount(2, $result1);
210
        $this->assertEquals($countryName1, $result1[0]->getName());
211
        $this->assertEquals($countryName2, $result1[1]->getName());
212
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
213
214
        $this->_em->clear();
215
216
        $result2 = $queryRefresh->getResult();
217
        $this->assertCount(2, $result2);
218
        $this->assertEquals($countryName1, $result2[0]->getName());
219
        $this->assertEquals($countryName2, $result2[1]->getName());
220
        $this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
221
    }
222
223
    public function testBasicQueryCachePutEntityCache()
224
    {
225
        $this->evictRegions();
226
        $this->loadFixturesCountries();
227
228
        $this->evictRegions();
229
        $this->secondLevelCacheLogger->clearStats();
230
        $this->_em->clear();
231
232
        $queryCount = $this->getCurrentQueryCount();
233
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
234
        $result1    = $this->_em->createQuery($dql)->setCacheable(true)->getResult();
235
236
        $this->assertCount(2, $result1);
237
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
238
        $this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
239
        $this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
240
        $this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
241
        $this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
242
243
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
244
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
245
246
        $this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
247
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
248
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
249
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
250
        $this->assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(Country::CLASSNAME)));
251
252
        $this->_em->clear();
253
254
        $result2  = $this->_em->createQuery($dql)
255
            ->setCacheable(true)
256
            ->getResult();
257
258
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
259
        $this->assertCount(2, $result2);
260
261
        $this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
262
        $this->assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
263
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
264
265
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
266
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
267
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
268
269
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
270
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
271
272
        $this->assertEquals($result1[0]->getId(), $result2[0]->getId());
273
        $this->assertEquals($result1[1]->getId(), $result2[1]->getId());
274
275
        $this->assertEquals($result1[0]->getName(), $result2[0]->getName());
276
        $this->assertEquals($result1[1]->getName(), $result2[1]->getName());
277
278
        $this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
279
        $this->assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
280
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
281
282
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
283
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
284
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
285
    }
286
287
    /**
288
     * @group 5854
289
     */
290
    public function testMultipleNestedDQLAliases()
291
    {
292
        $this->loadFixturesCountries();
293
        $this->loadFixturesStates();
294
        $this->loadFixturesCities();
295
        $this->loadFixturesAttractions();
296
297
        $queryRegionName      = $this->getDefaultQueryRegionName();
0 ignored issues
show
Unused Code introduced by
$queryRegionName is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
298
        $cityRegionName       = $this->getEntityRegion(City::CLASSNAME);
0 ignored issues
show
Unused Code introduced by
$cityRegionName is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
299
        $stateRegionName      = $this->getEntityRegion(State::CLASSNAME);
0 ignored issues
show
Unused Code introduced by
$stateRegionName is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
300
        $attractionRegionName = $this->getEntityRegion(Attraction::CLASSNAME);
0 ignored issues
show
Unused Code introduced by
$attractionRegionName is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
301
302
        $this->secondLevelCacheLogger->clearStats();
303
        $this->evictRegions();
304
        $this->_em->clear();
305
306
        $queryCount = $this->getCurrentQueryCount();
307
        $dql        = 'SELECT s, c, a FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c JOIN c.attractions a';
308
        $result1    = $this->_em->createQuery($dql)
309
            ->setCacheable(true)
310
            ->getResult();
311
312
        $this->assertCount(2, $result1);
313
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
314
315
        $this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $this->states[0]->getId()));
316
        $this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $this->states[1]->getId()));
317
318
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[0]->getId()));
319
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[1]->getId()));
320
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[2]->getId()));
321
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[3]->getId()));
322
323
        $this->assertTrue($this->cache->containsEntity(Attraction::CLASSNAME, $this->attractions[0]->getId()));
324
        $this->assertTrue($this->cache->containsEntity(Attraction::CLASSNAME, $this->attractions[1]->getId()));
325
        $this->assertTrue($this->cache->containsEntity(Attraction::CLASSNAME, $this->attractions[2]->getId()));
326
        $this->assertTrue($this->cache->containsEntity(Attraction::CLASSNAME, $this->attractions[3]->getId()));
327
328
        $this->assertInstanceOf(State::CLASSNAME, $result1[0]);
329
        $this->assertInstanceOf(State::CLASSNAME, $result1[1]);
330
331
        $this->assertCount(2, $result1[0]->getCities());
332
        $this->assertCount(2, $result1[1]->getCities());
333
334
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(0));
335
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(1));
336
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(0));
337
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(1));
338
339
        $this->assertCount(2, $result1[0]->getCities()->get(0)->getAttractions());
340
        $this->assertCount(2, $result1[0]->getCities()->get(1)->getAttractions());
341
        $this->assertCount(2, $result1[1]->getCities()->get(0)->getAttractions());
342
        $this->assertCount(1, $result1[1]->getCities()->get(1)->getAttractions());
343
344
        $this->_em->clear();
345
346
        $result2  = $this->_em->createQuery($dql)
347
            ->setCacheable(true)
348
            ->getResult();
349
350
        $this->assertCount(2, $result2);
351
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
352
353
        $this->assertInstanceOf(State::CLASSNAME, $result2[0]);
354
        $this->assertInstanceOf(State::CLASSNAME, $result2[1]);
355
356
        $this->assertCount(2, $result2[0]->getCities());
357
        $this->assertCount(2, $result2[1]->getCities());
358
359
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(0));
360
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(1));
361
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(0));
362
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(1));
363
364
        $this->assertCount(2, $result2[0]->getCities()->get(0)->getAttractions());
365
        $this->assertCount(2, $result2[0]->getCities()->get(1)->getAttractions());
366
        $this->assertCount(2, $result2[1]->getCities()->get(0)->getAttractions());
367
        $this->assertCount(1, $result2[1]->getCities()->get(1)->getAttractions());
368
    }
369
370
    public function testBasicQueryParams()
371
    {
372
        $this->evictRegions();
373
374
        $this->loadFixturesCountries();
375
        $this->_em->clear();
376
377
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
378
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
379
380
        $queryCount = $this->getCurrentQueryCount();
381
        $name       = $this->countries[0]->getName();
382
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c WHERE c.name = :name';
383
        $result1    = $this->_em->createQuery($dql)
384
                ->setCacheable(true)
385
                ->setParameter('name', $name)
386
                ->getResult();
387
388
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
389
        $this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
390
        $this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
391
392
        $this->_em->clear();
393
394
        $result2  = $this->_em->createQuery($dql)->setCacheable(true)
395
                ->setParameter('name', $name)
396
                ->getResult();
397
398
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
399
        $this->assertCount(1, $result2);
400
401
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
402
403
        $this->assertEquals($result1[0]->getId(), $result2[0]->getId());
404
        $this->assertEquals($result1[0]->getName(), $result2[0]->getName());
405
    }
406
407
    public function testLoadFromDatabaseWhenEntityMissing()
408
    {
409
        $this->evictRegions();
410
411
        $this->loadFixturesCountries();
412
        $this->_em->clear();
413
414
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
415
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
416
417
        $queryCount = $this->getCurrentQueryCount();
418
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
419
        $result1    = $this->_em->createQuery($dql)->setCacheable(true)->getResult();
420
421
        $this->assertCount(2, $result1);
422
        $this->assertEquals($queryCount + 1 , $this->getCurrentQueryCount());
423
        $this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
424
        $this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
425
        $this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
426
        $this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
427
428
        $this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
429
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
430
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
431
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
432
433
        $this->cache->evictEntity(Country::CLASSNAME, $result1[0]->getId());
434
        $this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $result1[0]->getId()));
435
436
        $this->_em->clear();
437
438
        $result2  = $this->_em->createQuery($dql)
439
            ->setCacheable(true)
440
            ->getResult();
441
442
        $this->assertEquals($queryCount + 2 , $this->getCurrentQueryCount());
443
        $this->assertCount(2, $result2);
444
445
        $this->assertEquals(5, $this->secondLevelCacheLogger->getPutCount());
446
        $this->assertEquals(3, $this->secondLevelCacheLogger->getMissCount());
447
        $this->assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
448
        $this->assertEquals(2, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
449
450
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
451
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
452
453
        $this->assertEquals($result1[0]->getId(), $result2[0]->getId());
454
        $this->assertEquals($result1[1]->getId(), $result2[1]->getId());
455
456
        $this->assertEquals($result1[0]->getName(), $result2[0]->getName());
457
        $this->assertEquals($result1[1]->getName(), $result2[1]->getName());
458
459
        $this->assertEquals($queryCount + 2 , $this->getCurrentQueryCount());
460
    }
461
462
    public function testBasicQueryFetchJoinsOneToMany()
463
    {
464
        $this->loadFixturesCountries();
465
        $this->loadFixturesStates();
466
        $this->loadFixturesCities();
467
468
        $this->evictRegions();
469
        $this->_em->clear();
470
471
        $queryCount = $this->getCurrentQueryCount();
472
        $dql        = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c';
473
        $result1    = $this->_em->createQuery($dql)
474
                ->setCacheable(true)
475
                ->getResult();
476
477
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
478
        $this->assertInstanceOf(State::CLASSNAME, $result1[0]);
479
        $this->assertInstanceOf(State::CLASSNAME, $result1[1]);
480
        $this->assertCount(2, $result1[0]->getCities());
481
        $this->assertCount(2, $result1[1]->getCities());
482
483
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(0));
484
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(1));
485
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(0));
486
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(1));
487
488
        $this->assertNotNull($result1[0]->getCities()->get(0)->getId());
489
        $this->assertNotNull($result1[0]->getCities()->get(1)->getId());
490
        $this->assertNotNull($result1[1]->getCities()->get(0)->getId());
491
        $this->assertNotNull($result1[1]->getCities()->get(1)->getId());
492
493
        $this->assertNotNull($result1[0]->getCities()->get(0)->getName());
494
        $this->assertNotNull($result1[0]->getCities()->get(1)->getName());
495
        $this->assertNotNull($result1[1]->getCities()->get(0)->getName());
496
        $this->assertNotNull($result1[1]->getCities()->get(1)->getName());
497
498
        $this->_em->clear();
499
500
        $result2  = $this->_em->createQuery($dql)
501
                ->setCacheable(true)
502
                ->getResult();
503
504
        $this->assertInstanceOf(State::CLASSNAME, $result2[0]);
505
        $this->assertInstanceOf(State::CLASSNAME, $result2[1]);
506
        $this->assertCount(2, $result2[0]->getCities());
507
        $this->assertCount(2, $result2[1]->getCities());
508
509
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(0));
510
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(1));
511
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(0));
512
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(1));
513
514
        $this->assertNotNull($result2[0]->getCities()->get(0)->getId());
515
        $this->assertNotNull($result2[0]->getCities()->get(1)->getId());
516
        $this->assertNotNull($result2[1]->getCities()->get(0)->getId());
517
        $this->assertNotNull($result2[1]->getCities()->get(1)->getId());
518
519
        $this->assertNotNull($result2[0]->getCities()->get(0)->getName());
520
        $this->assertNotNull($result2[0]->getCities()->get(1)->getName());
521
        $this->assertNotNull($result2[1]->getCities()->get(0)->getName());
522
        $this->assertNotNull($result2[1]->getCities()->get(1)->getName());
523
524
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
525
    }
526
527
    public function testBasicQueryFetchJoinsManyToOne()
528
    {
529
        $this->loadFixturesCountries();
530
        $this->loadFixturesStates();
531
        $this->loadFixturesCities();
532
        $this->_em->clear();
533
534
        $this->evictRegions();
535
        $this->secondLevelCacheLogger->clearStats();
536
537
        $queryCount = $this->getCurrentQueryCount();
538
        $dql        = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s';
539
        $result1    = $this->_em->createQuery($dql)
540
                ->setCacheable(true)
541
                ->getResult();
542
543
        $this->assertCount(4, $result1);
544
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]);
545
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]);
546
        $this->assertInstanceOf(State::CLASSNAME, $result1[0]->getState());
547
        $this->assertInstanceOf(State::CLASSNAME, $result1[1]->getState());
548
549
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[0]->getId()));
550
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[1]->getId()));
551
        $this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[0]->getState()->getId()));
552
        $this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[1]->getState()->getId()));
553
554
        $this->assertEquals(7, $this->secondLevelCacheLogger->getPutCount());
555
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
556
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
557
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
558
        $this->assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(State::CLASSNAME)));
559
        $this->assertEquals(4, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(City::CLASSNAME)));
560
561
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
562
563
        $this->_em->clear();
564
        $this->secondLevelCacheLogger->clearStats();
565
566
        $result2  = $this->_em->createQuery($dql)
567
                ->setCacheable(true)
568
                ->getResult();
569
570
        $this->assertCount(4, $result1);
571
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]);
572
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]);
573
        $this->assertInstanceOf(State::CLASSNAME, $result2[0]->getState());
574
        $this->assertInstanceOf(State::CLASSNAME, $result2[1]->getState());
575
576
        $this->assertNotNull($result2[0]->getId());
577
        $this->assertNotNull($result2[0]->getId());
578
        $this->assertNotNull($result2[1]->getState()->getId());
579
        $this->assertNotNull($result2[1]->getState()->getId());
580
581
        $this->assertNotNull($result2[0]->getName());
582
        $this->assertNotNull($result2[0]->getName());
583
        $this->assertNotNull($result2[1]->getState()->getName());
584
        $this->assertNotNull($result2[1]->getState()->getName());
585
586
        $this->assertEquals($result1[0]->getName(), $result2[0]->getName());
587
        $this->assertEquals($result1[1]->getName(), $result2[1]->getName());
588
        $this->assertEquals($result1[0]->getState()->getName(), $result2[0]->getState()->getName());
589
        $this->assertEquals($result1[1]->getState()->getName(), $result2[1]->getState()->getName());
590
591
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
592
    }
593
594
    public function testReloadQueryIfToOneIsNotFound()
595
    {
596
        $this->loadFixturesCountries();
597
        $this->loadFixturesStates();
598
        $this->loadFixturesCities();
599
        $this->_em->clear();
600
601
        $this->evictRegions();
602
        $this->secondLevelCacheLogger->clearStats();
603
604
        $queryCount = $this->getCurrentQueryCount();
605
        $dql        = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s';
606
        $result1    = $this->_em->createQuery($dql)
607
                ->setCacheable(true)
608
                ->getResult();
609
610
        $this->assertCount(4, $result1);
611
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]);
612
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]);
613
        $this->assertInstanceOf(State::CLASSNAME, $result1[0]->getState());
614
        $this->assertInstanceOf(State::CLASSNAME, $result1[1]->getState());
615
616
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[0]->getId()));
617
        $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[1]->getId()));
618
        $this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[0]->getState()->getId()));
619
        $this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[1]->getState()->getId()));
620
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
621
622
        $this->_em->clear();
623
624
        $this->cache->evictEntityRegion(State::CLASSNAME);
625
626
        $result2  = $this->_em->createQuery($dql)
627
                ->setCacheable(true)
628
                ->getResult();
629
630
        $this->assertCount(4, $result1);
631
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]);
632
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]);
633
        $this->assertInstanceOf(State::CLASSNAME, $result2[0]->getState());
634
        $this->assertInstanceOf(State::CLASSNAME, $result2[1]->getState());
635
636
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
637
    }
638
639
    public function testReloadQueryIfToManyAssociationItemIsNotFound()
640
    {
641
        $this->loadFixturesCountries();
642
        $this->loadFixturesStates();
643
        $this->loadFixturesCities();
644
645
        $this->evictRegions();
646
        $this->_em->clear();
647
648
        $queryCount = $this->getCurrentQueryCount();
649
        $dql        = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c';
650
        $result1    = $this->_em->createQuery($dql)
651
                ->setCacheable(true)
652
                ->getResult();
653
654
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
655
        $this->assertInstanceOf(State::CLASSNAME, $result1[0]);
656
        $this->assertInstanceOf(State::CLASSNAME, $result1[1]);
657
        $this->assertCount(2, $result1[0]->getCities());
658
        $this->assertCount(2, $result1[1]->getCities());
659
660
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(0));
661
        $this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(1));
662
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(0));
663
        $this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(1));
664
665
        $this->_em->clear();
666
667
        $this->cache->evictEntityRegion(City::CLASSNAME);
668
669
        $result2  = $this->_em->createQuery($dql)
670
                ->setCacheable(true)
671
                ->getResult();
672
673
        $this->assertInstanceOf(State::CLASSNAME, $result2[0]);
674
        $this->assertInstanceOf(State::CLASSNAME, $result2[1]);
675
        $this->assertCount(2, $result2[0]->getCities());
676
        $this->assertCount(2, $result2[1]->getCities());
677
678
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(0));
679
        $this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(1));
680
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(0));
681
        $this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(1));
682
683
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
684
    }
685
686
    public function testBasicNativeQueryCache()
687
    {
688
        $this->evictRegions();
689
        $this->loadFixturesCountries();
690
691
        $this->secondLevelCacheLogger->clearStats();
692
        $this->_em->clear();
693
694
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
695
        $this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
696
697
        $rsm = new ResultSetMapping;
698
        $rsm->addEntityResult(Country::CLASSNAME, 'c');
699
        $rsm->addFieldResult('c', 'name', 'name');
700
        $rsm->addFieldResult('c', 'id', 'id');
701
702
        $queryCount = $this->getCurrentQueryCount();
703
        $sql        = 'SELECT id, name FROM cache_country';
704
        $result1    = $this->_em->createNativeQuery($sql, $rsm)->setCacheable(true)->getResult();
705
706
        $this->assertCount(2, $result1);
707
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
708
        $this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
709
        $this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
710
        $this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
711
        $this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
712
713
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
714
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
715
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
716
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
717
718
        $this->_em->clear();
719
720
        $result2  = $this->_em->createNativeQuery($sql, $rsm)
721
            ->setCacheable(true)
722
            ->getResult();
723
724
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
725
        $this->assertCount(2, $result2);
726
727
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
728
        $this->assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
729
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
730
731
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
732
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
733
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
734
735
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
736
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
737
738
        $this->assertEquals($result1[0]->getId(), $result2[0]->getId());
739
        $this->assertEquals($result1[1]->getId(), $result2[1]->getId());
740
741
        $this->assertEquals($result1[0]->getName(), $result2[0]->getName());
742
        $this->assertEquals($result1[1]->getName(), $result2[1]->getName());
743
744
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
745
        $this->assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
746
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
747
748
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
749
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
750
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
751
    }
752
753
    public function testQueryDependsOnFirstAndMaxResultResult()
754
    {
755
        $this->evictRegions();
756
        $this->loadFixturesCountries();
757
758
        $this->secondLevelCacheLogger->clearStats();
759
        $this->_em->clear();
760
761
        $queryCount = $this->getCurrentQueryCount();
762
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
763
        $result1    = $this->_em->createQuery($dql)
0 ignored issues
show
Unused Code introduced by
$result1 is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
764
            ->setCacheable(true)
765
            ->setFirstResult(1)
766
            ->setMaxResults(1)
767
            ->getResult();
768
769
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
770
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
771
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
772
773
        $this->_em->clear();
774
775
        $result2  = $this->_em->createQuery($dql)
0 ignored issues
show
Unused Code introduced by
$result2 is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
776
            ->setCacheable(true)
777
            ->setFirstResult(2)
778
            ->setMaxResults(1)
779
            ->getResult();
780
781
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
782
        $this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
783
        $this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
784
785
        $this->_em->clear();
786
787
        $result3  = $this->_em->createQuery($dql)
0 ignored issues
show
Unused Code introduced by
$result3 is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
788
            ->setCacheable(true)
789
            ->getResult();
790
791
        $this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
792
        $this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
793
        $this->assertEquals(3, $this->secondLevelCacheLogger->getMissCount());
794
    }
795
796
    public function testQueryCacheLifetime()
797
    {
798
        $this->evictRegions();
799
        $this->loadFixturesCountries();
800
801
        $this->secondLevelCacheLogger->clearStats();
802
        $this->_em->clear();
803
804
        $getHash = function(AbstractQuery $query){
805
            $method = new \ReflectionMethod($query, 'getHash');
806
            $method->setAccessible(true);
807
808
            return $method->invoke($query);
809
        };
810
811
        $queryCount = $this->getCurrentQueryCount();
812
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
813
        $query      = $this->_em->createQuery($dql);
814
        $result1    = $query->setCacheable(true)
815
            ->setLifetime(3600)
816
            ->getResult();
817
818
        $this->assertNotEmpty($result1);
819
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
820
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
821
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
822
823
        $this->_em->clear();
824
825
        $key   = new QueryCacheKey($getHash($query), 3600);
826
        $entry = $this->cache->getQueryCache()
827
            ->getRegion()
828
            ->get($key);
829
830
        $this->assertInstanceOf('Doctrine\ORM\Cache\QueryCacheEntry', $entry);
831
        $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?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
832
833
        $this->cache->getQueryCache()
834
            ->getRegion()
835
            ->put($key, $entry);
836
837
        $result2  = $this->_em->createQuery($dql)
838
            ->setCacheable(true)
839
            ->setLifetime(3600)
840
            ->getResult();
841
842
        $this->assertNotEmpty($result2);
843
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
844
        $this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
845
        $this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
846
    }
847
848
    public function testQueryCacheRegion()
849
    {
850
        $this->evictRegions();
851
        $this->loadFixturesCountries();
852
853
        $this->secondLevelCacheLogger->clearStats();
854
        $this->_em->clear();
855
856
        $queryCount = $this->getCurrentQueryCount();
857
        $dql        = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
858
        $query      = $this->_em->createQuery($dql);
859
860
        $query1     = clone $query;
861
        $result1    = $query1->setCacheable(true)
862
            ->setCacheRegion('foo_region')
863
            ->getResult();
864
865
        $this->assertNotEmpty($result1);
866
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
867
        $this->assertEquals(0, $this->secondLevelCacheLogger->getHitCount());
868
        $this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
869
        $this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
870
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('foo_region'));
871
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('foo_region'));
872
873
        $query2     = clone $query;
874
        $result2    = $query2->setCacheable(true)
875
            ->setCacheRegion('bar_region')
876
            ->getResult();
877
878
        $this->assertNotEmpty($result2);
879
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
880
        $this->assertEquals(0, $this->secondLevelCacheLogger->getHitCount());
881
        $this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
882
        $this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
883
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('bar_region'));
884
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('bar_region'));
885
886
        $query3     = clone $query;
887
        $result3    = $query3->setCacheable(true)
888
            ->setCacheRegion('foo_region')
889
            ->getResult();
890
891
        $this->assertNotEmpty($result3);
892
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
893
        $this->assertEquals(3, $this->secondLevelCacheLogger->getHitCount());
894
        $this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
895
        $this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
896
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount('foo_region'));
897
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('foo_region'));
898
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('foo_region'));
899
900
        $query4     = clone $query;
901
        $result4    = $query4->setCacheable(true)
0 ignored issues
show
Unused Code introduced by
$result4 is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
902
            ->setCacheRegion('bar_region')
903
            ->getResult();
904
905
        $this->assertNotEmpty($result3);
906
        $this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
907
        $this->assertEquals(6, $this->secondLevelCacheLogger->getHitCount());
908
        $this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
909
        $this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
910
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount('bar_region'));
911
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('bar_region'));
912
        $this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('bar_region'));
913
    }
914
915
    public function testResolveAssociationCacheEntry()
916
    {
917
        $this->evictRegions();
918
        $this->loadFixturesCountries();
919
        $this->loadFixturesStates();
920
921
        $this->_em->clear();
922
923
        $stateId     = $this->states[0]->getId();
924
        $countryName = $this->states[0]->getCountry()->getName();
925
        $dql         = 'SELECT s FROM Doctrine\Tests\Models\Cache\State s WHERE s.id = :id';
926
        $query       = $this->_em->createQuery($dql);
927
        $queryCount  = $this->getCurrentQueryCount();
928
929
        $query1 = clone $query;
930
        $state1 = $query1
931
            ->setParameter('id', $stateId)
932
            ->setCacheable(true)
933
            ->setMaxResults(1)
934
            ->getSingleResult();
935
936
        $this->assertNotNull($state1);
937
        $this->assertNotNull($state1->getCountry());
938
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
939
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state1);
940
        $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $state1->getCountry());
941
        $this->assertEquals($countryName, $state1->getCountry()->getName());
942
        $this->assertEquals($stateId, $state1->getId());
943
944
        $this->_em->clear();
945
946
        $queryCount = $this->getCurrentQueryCount();
947
        $query2     = clone $query;
948
        $state2     = $query2
949
            ->setParameter('id', $stateId)
950
            ->setCacheable(true)
951
            ->setMaxResults(1)
952
            ->getSingleResult();
953
954
        $this->assertNotNull($state2);
955
        $this->assertNotNull($state2->getCountry());
956
        $this->assertEquals($queryCount, $this->getCurrentQueryCount());
957
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state2);
958
        $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $state2->getCountry());
959
        $this->assertEquals($countryName, $state2->getCountry()->getName());
960
        $this->assertEquals($stateId, $state2->getId());
961
    }
962
963
    public function testResolveToOneAssociationCacheEntry()
964
    {
965
        $this->evictRegions();
966
        $this->loadFixturesCountries();
967
        $this->loadFixturesStates();
968
        $this->loadFixturesCities();
969
        $this->evictRegions();
970
971
        $this->_em->clear();
972
973
        $cityId      = $this->cities[0]->getId();
974
        $dql         = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s WHERE c.id = :id';
975
        $query       = $this->_em->createQuery($dql);
976
        $queryCount  = $this->getCurrentQueryCount();
977
978
        $query1 = clone $query;
979
        $city1 = $query1
980
            ->setParameter('id', $cityId)
981
            ->setCacheable(true)
982
            ->setMaxResults(1)
983
            ->getSingleResult();
984
985
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
986
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\City', $city1);
987
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $city1->getState());
988
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\City', $city1->getState()->getCities()->get(0));
989
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $city1->getState()->getCities()->get(0)->getState());
990
991
        $this->_em->clear();
992
993
        $queryCount = $this->getCurrentQueryCount();
994
        $query2     = clone $query;
995
        $city2      = $query2
996
            ->setParameter('id', $cityId)
997
            ->setCacheable(true)
998
            ->setMaxResults(1)
999
            ->getSingleResult();
1000
1001
        $this->assertEquals($queryCount, $this->getCurrentQueryCount());
1002
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\City', $city2);
1003
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $city2->getState());
1004
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\City', $city2->getState()->getCities()->get(0));
1005
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $city2->getState()->getCities()->get(0)->getState());
1006
    }
1007
1008
    public function testResolveToManyAssociationCacheEntry()
1009
    {
1010
        $this->evictRegions();
1011
        $this->loadFixturesCountries();
1012
        $this->loadFixturesStates();
1013
        $this->loadFixturesCities();
1014
        $this->evictRegions();
1015
1016
        $this->_em->clear();
1017
1018
        $stateId     = $this->states[0]->getId();
1019
        $dql         = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c WHERE s.id = :id';
1020
        $query       = $this->_em->createQuery($dql);
1021
        $queryCount  = $this->getCurrentQueryCount();
1022
1023
        $query1 = clone $query;
1024
        $state1 = $query1
1025
            ->setParameter('id', $stateId)
1026
            ->setCacheable(true)
1027
            ->setMaxResults(1)
1028
            ->getSingleResult();
1029
1030
        $this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
1031
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state1);
1032
        $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $state1->getCountry());
1033
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\City', $state1->getCities()->get(0));
1034
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state1->getCities()->get(0)->getState());
1035
        $this->assertSame($state1, $state1->getCities()->get(0)->getState());
1036
1037
        $this->_em->clear();
1038
1039
        $queryCount = $this->getCurrentQueryCount();
1040
        $query2     = clone $query;
1041
        $state2     = $query2
1042
            ->setParameter('id', $stateId)
1043
            ->setCacheable(true)
1044
            ->setMaxResults(1)
1045
            ->getSingleResult();
1046
1047
        $this->assertEquals($queryCount, $this->getCurrentQueryCount());
1048
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state2);
1049
        $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $state2->getCountry());
1050
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\City', $state2->getCities()->get(0));
1051
        $this->assertInstanceOf('Doctrine\Tests\Models\Cache\State', $state2->getCities()->get(0)->getState());
1052
        $this->assertSame($state2, $state2->getCities()->get(0)->getState());
1053
    }
1054
1055
    public function testHintClearEntityRegionUpdateStatement()
1056
    {
1057
        $this->evictRegions();
1058
        $this->loadFixturesCountries();
1059
1060
        $this->assertTrue($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[0]->getId()));
1061
        $this->assertTrue($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[1]->getId()));
1062
1063
        $this->_em->createQuery('DELETE Doctrine\Tests\Models\Cache\Country u WHERE u.id = 4')
1064
            ->setHint(Query::HINT_CACHE_EVICT, true)
1065
            ->execute();
1066
1067
        $this->assertFalse($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[0]->getId()));
1068
        $this->assertFalse($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[1]->getId()));
1069
    }
1070
1071
    public function testHintClearEntityRegionDeleteStatement()
1072
    {
1073
        $this->evictRegions();
1074
        $this->loadFixturesCountries();
1075
1076
        $this->assertTrue($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[0]->getId()));
1077
        $this->assertTrue($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[1]->getId()));
1078
1079
        $this->_em->createQuery("UPDATE Doctrine\Tests\Models\Cache\Country u SET u.name = 'foo' WHERE u.id = 1")
1080
            ->setHint(Query::HINT_CACHE_EVICT, true)
1081
            ->execute();
1082
1083
        $this->assertFalse($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[0]->getId()));
1084
        $this->assertFalse($this->cache->containsEntity('Doctrine\Tests\Models\Cache\Country', $this->countries[1]->getId()));
1085
    }
1086
1087
    /**
1088
     * @expectedException \Doctrine\ORM\Cache\CacheException
1089
     * @expectedExceptionMessage Second level cache does not support partial entities.
1090
     */
1091
    public function testCacheablePartialQueryException()
1092
    {
1093
        $this->evictRegions();
1094
        $this->loadFixturesCountries();
1095
1096
        $this->_em->createQuery("SELECT PARTIAL c.{id} FROM Doctrine\Tests\Models\Cache\Country c")
1097
            ->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
1098
            ->setCacheable(true)
1099
            ->getResult();
1100
    }
1101
1102
    /**
1103
     * @expectedException \Doctrine\ORM\Cache\CacheException
1104
     * @expectedExceptionMessage Second-level cache query supports only select statements.
1105
     */
1106
    public function testNonCacheableQueryDeleteStatementException()
1107
    {
1108
        $this->_em->createQuery("DELETE Doctrine\Tests\Models\Cache\Country u WHERE u.id = 4")
1109
            ->setCacheable(true)
1110
            ->getResult();
1111
    }
1112
1113
    /**
1114
     * @expectedException \Doctrine\ORM\Cache\CacheException
1115
     * @expectedExceptionMessage Second-level cache query supports only select statements.
1116
     */
1117
    public function testNonCacheableQueryUpdateStatementException()
1118
    {
1119
        $this->_em->createQuery("UPDATE Doctrine\Tests\Models\Cache\Country u SET u.name = 'foo' WHERE u.id = 4")
1120
            ->setCacheable(true)
1121
            ->getResult();
1122
    }
1123
}