Completed
Push — master ( b47a39...b7cace )
by Luís
18s
created

QueryBuilderTest::testGetParameterTypeJuggling()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 12
rs 9.4285
1
<?php
2
3
namespace Doctrine\Tests\ORM;
4
5
use Doctrine\Common\Collections\ArrayCollection;
6
use Doctrine\Common\Collections\Criteria;
7
use Doctrine\ORM\Cache;
8
use Doctrine\ORM\Query;
9
use Doctrine\ORM\Query\Parameter;
10
use Doctrine\ORM\Query\ParameterTypeInferer;
11
use Doctrine\ORM\QueryBuilder;
12
use Doctrine\Tests\Models\Cache\State;
13
use Doctrine\Tests\Models\CMS\CmsArticle;
14
use Doctrine\Tests\Models\CMS\CmsGroup;
15
use Doctrine\Tests\Models\CMS\CmsUser;
16
use Doctrine\Tests\OrmTestCase;
17
18
/**
19
 * Test case for the QueryBuilder class used to build DQL query string in a
20
 * object oriented way.
21
 *
22
 * @author      Jonathan H. Wage <[email protected]>
23
 * @author      Roman Borschel <[email protected]
24
 * @since       2.0
25
 */
26
class QueryBuilderTest extends OrmTestCase
27
{
28
    /**
29
     * @var \Doctrine\ORM\EntityManager
30
     */
31
    private $_em;
32
33
    protected function setUp()
34
    {
35
        $this->_em = $this->_getTestEntityManager();
36
    }
37
38
    protected function assertValidQueryBuilder(QueryBuilder $qb, $expectedDql)
39
    {
40
        $dql = $qb->getDQL();
41
        $q = $qb->getQuery();
0 ignored issues
show
Unused Code introduced by
The assignment to $q is dead and can be removed.
Loading history...
42
43
        $this->assertEquals($expectedDql, $dql);
44
    }
45
46
    public function testSelectSetsType()
47
    {
48
        $qb = $this->_em->createQueryBuilder()
49
            ->delete(CmsUser::class, 'u')
50
            ->select('u.id', 'u.username');
51
52
        $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
53
    }
54
55 View Code Duplication
    public function testEmptySelectSetsType()
56
    {
57
        $qb = $this->_em->createQueryBuilder()
58
            ->delete(CmsUser::class, 'u')
59
            ->select();
60
61
        $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
62
    }
63
64 View Code Duplication
    public function testDeleteSetsType()
65
    {
66
        $qb = $this->_em->createQueryBuilder()
67
            ->from(CmsUser::class, 'u')
68
            ->delete();
69
70
        $this->assertEquals($qb->getType(), QueryBuilder::DELETE);
71
    }
72
73 View Code Duplication
    public function testUpdateSetsType()
74
    {
75
        $qb = $this->_em->createQueryBuilder()
76
            ->from(CmsUser::class, 'u')
77
            ->update();
78
79
        $this->assertEquals($qb->getType(), QueryBuilder::UPDATE);
80
    }
81
82
    public function testSimpleSelect()
83
    {
84
        $qb = $this->_em->createQueryBuilder()
85
            ->from(CmsUser::class, 'u')
86
            ->select('u.id', 'u.username');
87
88
        $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u');
89
    }
90
91
    public function testSimpleDelete()
92
    {
93
        $qb = $this->_em->createQueryBuilder()
94
            ->delete(CmsUser::class, 'u');
95
96
        $this->assertValidQueryBuilder($qb, 'DELETE Doctrine\Tests\Models\CMS\CmsUser u');
97
    }
98
99
    public function testSimpleSelectWithFromIndexBy()
100
    {
101
        $qb = $this->_em->createQueryBuilder()
102
            ->from(CmsUser::class, 'u', 'u.id')
103
            ->select('u.id', 'u.username');
104
105
        $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id');
106
    }
107
108
    public function testSimpleSelectWithIndexBy()
109
    {
110
        $qb = $this->_em->createQueryBuilder()
111
            ->from(CmsUser::class, 'u')
112
            ->indexBy('u', 'u.id')
113
            ->select('u.id', 'u.username');
114
115
        $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id');
116
    }
117
118
    public function testSimpleUpdate()
119
    {
120
        $qb = $this->_em->createQueryBuilder()
121
            ->update(CmsUser::class, 'u')
122
            ->set('u.username', ':username');
123
124
        $this->assertValidQueryBuilder($qb, 'UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.username = :username');
125
    }
126
127
    public function testInnerJoin()
128
    {
129
        $qb = $this->_em->createQueryBuilder()
130
            ->select('u', 'a')
131
            ->from(CmsUser::class, 'u')
132
            ->innerJoin('u.articles', 'a');
133
134
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a');
135
    }
136
137
    public function testComplexInnerJoin()
138
    {
139
        $qb = $this->_em->createQueryBuilder()
140
            ->select('u', 'a')
141
            ->from(CmsUser::class, 'u')
142
            ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id');
143
144
        $this->assertValidQueryBuilder(
145
            $qb,
146
            'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a ON u.id = a.author_id'
147
        );
148
    }
149
150
    public function testComplexInnerJoinWithIndexBy()
151
    {
152
        $qb = $this->_em->createQueryBuilder()
153
            ->select('u', 'a')
154
            ->from(CmsUser::class, 'u')
155
            ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id', 'a.name');
156
157
        $this->assertValidQueryBuilder(
158
            $qb,
159
            'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a INDEX BY a.name ON u.id = a.author_id'
160
        );
161
    }
162
163
    public function testLeftJoin()
164
    {
165
        $qb = $this->_em->createQueryBuilder()
166
            ->select('u', 'a')
167
            ->from(CmsUser::class, 'u')
168
            ->leftJoin('u.articles', 'a');
169
170
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a');
171
    }
172
173
    public function testLeftJoinWithIndexBy()
174
    {
175
        $qb = $this->_em->createQueryBuilder()
176
            ->select('u', 'a')
177
            ->from(CmsUser::class, 'u')
178
            ->leftJoin('u.articles', 'a', null, null, 'a.name');
179
180
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a INDEX BY a.name');
181
    }
182
183
    public function testMultipleFrom()
184
    {
185
        $qb = $this->_em->createQueryBuilder()
186
            ->select('u', 'g')
187
            ->from(CmsUser::class, 'u')
188
            ->from(CmsGroup::class, 'g');
189
190
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsGroup g');
191
    }
192
193
    public function testMultipleFromWithIndexBy()
194
    {
195
        $qb = $this->_em->createQueryBuilder()
196
            ->select('u', 'g')
197
            ->from(CmsUser::class, 'u')
198
            ->from(CmsGroup::class, 'g')
199
            ->indexBy('g', 'g.id');
200
201
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsGroup g INDEX BY g.id');
202
    }
203
204
    public function testMultipleFromWithJoin()
205
    {
206
        $qb = $this->_em->createQueryBuilder()
207
            ->select('u', 'g')
208
            ->from(CmsUser::class, 'u')
209
            ->from(CmsGroup::class, 'g')
210
            ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id');
211
212
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a ON u.id = a.author_id, Doctrine\Tests\Models\CMS\CmsGroup g');
213
    }
214
215
    public function testMultipleFromWithMultipleJoin()
216
    {
217
        $qb = $this->_em->createQueryBuilder()
218
            ->select('u', 'g')
219
            ->from(CmsUser::class, 'u')
220
            ->from(CmsArticle::class, 'a')
221
            ->innerJoin('u.groups', 'g')
222
            ->leftJoin('u.address', 'ad')
223
            ->innerJoin('a.comments', 'c');
224
225
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.groups g LEFT JOIN u.address ad, Doctrine\Tests\Models\CMS\CmsArticle a INNER JOIN a.comments c');
226
    }
227
228
    public function testWhere()
229
    {
230
        $qb = $this->_em->createQueryBuilder()
231
            ->select('u')
232
            ->from(CmsUser::class, 'u')
233
            ->where('u.id = :uid');
234
235
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid');
236
    }
237
238
    public function testComplexAndWhere()
239
    {
240
        $qb = $this->_em->createQueryBuilder()
241
            ->select('u')
242
            ->from(CmsUser::class, 'u')
243
            ->where('u.id = :uid OR u.id = :uid2 OR u.id = :uid3')
244
            ->andWhere('u.name = :name');
245
246
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid OR u.id = :uid2 OR u.id = :uid3) AND u.name = :name');
247
    }
248
249
    public function testAndWhere()
250
    {
251
        $qb = $this->_em->createQueryBuilder()
252
            ->select('u')
253
            ->from(CmsUser::class, 'u')
254
            ->where('u.id = :uid')
255
            ->andWhere('u.id = :uid2');
256
257
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
258
    }
259
260
    public function testOrWhere()
261
    {
262
        $qb = $this->_em->createQueryBuilder()
263
            ->select('u')
264
            ->from(CmsUser::class, 'u')
265
            ->where('u.id = :uid')
266
            ->orWhere('u.id = :uid2');
267
268
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id = :uid2');
269
    }
270
271
    public function testComplexAndWhereOrWhereNesting()
272
    {
273
        $qb = $this->_em->createQueryBuilder();
274
        $qb->select('u')
275
           ->from(CmsUser::class, 'u')
276
           ->where('u.id = :uid')
277
           ->orWhere('u.id = :uid2')
278
           ->andWhere('u.id = :uid3')
279
           ->orWhere('u.name = :name1', 'u.name = :name2')
280
           ->andWhere('u.name <> :noname');
281
282
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (((u.id = :uid OR u.id = :uid2) AND u.id = :uid3) OR u.name = :name1 OR u.name = :name2) AND u.name <> :noname');
283
    }
284
285 View Code Duplication
    public function testAndWhereIn()
286
    {
287
        $qb = $this->_em->createQueryBuilder();
288
        $qb->select('u')
289
           ->from(CmsUser::class, 'u')
290
           ->where('u.id = :uid')
291
           ->andWhere($qb->expr()->in('u.id', [1, 2, 3]));
292
293
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id IN(1, 2, 3)');
294
    }
295
296 View Code Duplication
    public function testOrWhereIn()
297
    {
298
        $qb = $this->_em->createQueryBuilder();
299
        $qb->select('u')
300
           ->from(CmsUser::class, 'u')
301
           ->where('u.id = :uid')
302
           ->orWhere($qb->expr()->in('u.id', [1, 2, 3]));
303
304
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id IN(1, 2, 3)');
305
    }
306
307 View Code Duplication
    public function testAndWhereNotIn()
308
    {
309
        $qb = $this->_em->createQueryBuilder();
310
        $qb->select('u')
311
           ->from(CmsUser::class, 'u')
312
           ->where('u.id = :uid')
313
           ->andWhere($qb->expr()->notIn('u.id', [1, 2, 3]));
314
315
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id NOT IN(1, 2, 3)');
316
    }
317
318 View Code Duplication
    public function testOrWhereNotIn()
319
    {
320
        $qb = $this->_em->createQueryBuilder();
321
        $qb->select('u')
322
           ->from(CmsUser::class, 'u')
323
           ->where('u.id = :uid')
324
           ->orWhere($qb->expr()->notIn('u.id', [1, 2, 3]));
325
326
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id NOT IN(1, 2, 3)');
327
    }
328
329
    public function testGroupBy()
330
    {
331
        $qb = $this->_em->createQueryBuilder()
332
            ->select('u')
333
            ->from(CmsUser::class, 'u')
334
            ->groupBy('u.id')
335
            ->addGroupBy('u.username');
336
337
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id, u.username');
338
    }
339
340
    public function testHaving()
341
    {
342
        $qb = $this->_em->createQueryBuilder()
343
            ->select('u')
344
            ->from(CmsUser::class, 'u')
345
            ->groupBy('u.id')
346
            ->having('COUNT(u.id) > 1');
347
348
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING COUNT(u.id) > 1');
349
    }
350
351
    public function testAndHaving()
352
    {
353
        $qb = $this->_em->createQueryBuilder()
354
            ->select('u')
355
            ->from(CmsUser::class, 'u')
356
            ->groupBy('u.id')
357
            ->having('COUNT(u.id) > 1')
358
            ->andHaving('COUNT(u.id) < 1');
359
360
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING COUNT(u.id) > 1 AND COUNT(u.id) < 1');
361
    }
362
363
    public function testOrHaving()
364
    {
365
        $qb = $this->_em->createQueryBuilder()
366
            ->select('u')
367
            ->from(CmsUser::class, 'u')
368
            ->groupBy('u.id')
369
            ->having('COUNT(u.id) > 1')
370
            ->andHaving('COUNT(u.id) < 1')
371
            ->orHaving('COUNT(u.id) > 1');
372
373
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING (COUNT(u.id) > 1 AND COUNT(u.id) < 1) OR COUNT(u.id) > 1');
374
    }
375
376
    public function testOrderBy()
377
    {
378
        $qb = $this->_em->createQueryBuilder()
379
            ->select('u')
380
            ->from(CmsUser::class, 'u')
381
            ->orderBy('u.username', 'ASC');
382
383
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC');
384
    }
385
386 View Code Duplication
    public function testOrderByWithExpression()
387
    {
388
        $qb = $this->_em->createQueryBuilder();
389
        $qb->select('u')
390
            ->from(CmsUser::class, 'u')
391
            ->orderBy($qb->expr()->asc('u.username'));
392
393
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC');
394
    }
395
396
    public function testAddOrderBy()
397
    {
398
        $qb = $this->_em->createQueryBuilder()
399
            ->select('u')
400
            ->from(CmsUser::class, 'u')
401
            ->orderBy('u.username', 'ASC')
402
            ->addOrderBy('u.username', 'DESC');
403
404
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC, u.username DESC');
405
    }
406
407 View Code Duplication
    public function testAddOrderByWithExpression()
408
    {
409
        $qb = $this->_em->createQueryBuilder();
410
        $qb->select('u')
411
            ->from(CmsUser::class, 'u')
412
            ->orderBy('u.username', 'ASC')
413
            ->addOrderBy($qb->expr()->desc('u.username'));
414
415
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC, u.username DESC');
416
    }
417
418 View Code Duplication
    public function testAddCriteriaWhere()
419
    {
420
        $qb = $this->_em->createQueryBuilder();
421
        $qb->select('u')
422
            ->from(CmsUser::class, 'u');
423
424
        $criteria = new Criteria();
425
        $criteria->where($criteria->expr()->eq('field', 'value'));
426
427
        $qb->addCriteria($criteria);
428
429
        $this->assertEquals('u.field = :field', (string) $qb->getDQLPart('where'));
430
        $this->assertNotNull($qb->getParameter('field'));
431
    }
432
433
    public function testAddMultipleSameCriteriaWhere()
434
    {
435
        $qb = $this->_em->createQueryBuilder();
436
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
437
438
        $criteria = new Criteria();
439
        $criteria->where($criteria->expr()->andX(
440
            $criteria->expr()->eq('field', 'value1'),
441
            $criteria->expr()->eq('field', 'value2')
442
        ));
443
444
        $qb->addCriteria($criteria);
445
446
        $this->assertEquals('alias1.field = :field AND alias1.field = :field_1', (string) $qb->getDQLPart('where'));
447
        $this->assertNotNull($qb->getParameter('field'));
448
        $this->assertNotNull($qb->getParameter('field_1'));
449
    }
450
451
    /**
452
     * @group DDC-2844
453
     */
454 View Code Duplication
    public function testAddCriteriaWhereWithMultipleParametersWithSameField()
455
    {
456
        $qb = $this->_em->createQueryBuilder();
457
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
458
459
        $criteria = new Criteria();
460
        $criteria->where($criteria->expr()->eq('field', 'value1'));
461
        $criteria->andWhere($criteria->expr()->gt('field', 'value2'));
462
463
        $qb->addCriteria($criteria);
464
465
        $this->assertEquals('alias1.field = :field AND alias1.field > :field_1', (string) $qb->getDQLPart('where'));
466
        $this->assertSame('value1', $qb->getParameter('field')->getValue());
467
        $this->assertSame('value2', $qb->getParameter('field_1')->getValue());
468
    }
469
470
    /**
471
     * @group DDC-2844
472
     */
473 View Code Duplication
    public function testAddCriteriaWhereWithMultipleParametersWithDifferentFields()
474
    {
475
        $qb = $this->_em->createQueryBuilder();
476
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
477
478
        $criteria = new Criteria();
479
        $criteria->where($criteria->expr()->eq('field1', 'value1'));
480
        $criteria->andWhere($criteria->expr()->gt('field2', 'value2'));
481
482
        $qb->addCriteria($criteria);
483
484
        $this->assertEquals('alias1.field1 = :field1 AND alias1.field2 > :field2', (string) $qb->getDQLPart('where'));
485
        $this->assertSame('value1', $qb->getParameter('field1')->getValue());
486
        $this->assertSame('value2', $qb->getParameter('field2')->getValue());
487
    }
488
489
    /**
490
     * @group DDC-2844
491
     */
492 View Code Duplication
    public function testAddCriteriaWhereWithMultipleParametersWithSubpathsAndDifferentProperties()
493
    {
494
        $qb = $this->_em->createQueryBuilder();
495
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
496
497
        $criteria = new Criteria();
498
        $criteria->where($criteria->expr()->eq('field1', 'value1'));
499
        $criteria->andWhere($criteria->expr()->gt('field2', 'value2'));
500
501
        $qb->addCriteria($criteria);
502
503
        $this->assertEquals('alias1.field1 = :field1 AND alias1.field2 > :field2', (string) $qb->getDQLPart('where'));
504
        $this->assertSame('value1', $qb->getParameter('field1')->getValue());
505
        $this->assertSame('value2', $qb->getParameter('field2')->getValue());
506
    }
507
508
    /**
509
     * @group DDC-2844
510
     */
511 View Code Duplication
    public function testAddCriteriaWhereWithMultipleParametersWithSubpathsAndSameProperty()
512
    {
513
        $qb = $this->_em->createQueryBuilder();
514
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
515
516
        $criteria = new Criteria();
517
        $criteria->where($criteria->expr()->eq('field1', 'value1'));
518
        $criteria->andWhere($criteria->expr()->gt('field1', 'value2'));
519
520
        $qb->addCriteria($criteria);
521
522
        $this->assertEquals('alias1.field1 = :field1 AND alias1.field1 > :field1_1', (string) $qb->getDQLPart('where'));
523
        $this->assertSame('value1', $qb->getParameter('field1')->getValue());
524
        $this->assertSame('value2', $qb->getParameter('field1_1')->getValue());
525
    }
526
527 View Code Duplication
    public function testAddCriteriaOrder()
528
    {
529
        $qb = $this->_em->createQueryBuilder();
530
        $qb->select('u')
531
            ->from(CmsUser::class, 'u');
532
533
        $criteria = new Criteria();
534
        $criteria->orderBy(['field' => Criteria::DESC]);
535
536
        $qb->addCriteria($criteria);
537
538
        $this->assertCount(1, $orderBy = $qb->getDQLPart('orderBy'));
539
        $this->assertEquals('u.field DESC', (string) $orderBy[0]);
540
    }
541
542
    /**
543
     * @group DDC-3108
544
     */
545 View Code Duplication
    public function testAddCriteriaOrderOnJoinAlias()
546
    {
547
        $qb = $this->_em->createQueryBuilder();
548
        $qb->select('u')
549
            ->from(CmsUser::class, 'u')
550
            ->join('u.article','a');
551
552
        $criteria = new Criteria();
553
        $criteria->orderBy(['a.field' => Criteria::DESC]);
554
555
        $qb->addCriteria($criteria);
556
557
        $this->assertCount(1, $orderBy = $qb->getDQLPart('orderBy'));
558
        $this->assertEquals('a.field DESC', (string) $orderBy[0]);
559
    }
560
561 View Code Duplication
    public function testAddCriteriaLimit()
562
    {
563
        $qb = $this->_em->createQueryBuilder();
564
        $qb->select('u')
565
            ->from(CmsUser::class, 'u');
566
567
        $criteria = new Criteria();
568
        $criteria->setFirstResult(2);
569
        $criteria->setMaxResults(10);
570
571
        $qb->addCriteria($criteria);
572
573
        $this->assertEquals(2, $qb->getFirstResult());
574
        $this->assertEquals(10, $qb->getMaxResults());
575
    }
576
577 View Code Duplication
    public function testAddCriteriaUndefinedLimit()
578
    {
579
        $qb = $this->_em->createQueryBuilder();
580
        $qb->select('u')
581
            ->from(CmsUser::class, 'u')
582
            ->setFirstResult(2)
583
            ->setMaxResults(10);
584
585
        $criteria = new Criteria();
586
587
        $qb->addCriteria($criteria);
588
589
        $this->assertEquals(2, $qb->getFirstResult());
590
        $this->assertEquals(10, $qb->getMaxResults());
591
    }
592
593
    public function testGetQuery()
594
    {
595
        $qb = $this->_em->createQueryBuilder()
596
            ->select('u')
597
            ->from(CmsUser::class, 'u');
598
        $q = $qb->getQuery();
599
600
        $this->assertEquals(Query::class, get_class($q));
601
    }
602
603
    public function testSetParameter()
604
    {
605
        $qb = $this->_em->createQueryBuilder()
606
            ->select('u')
607
            ->from(CmsUser::class, 'u')
608
            ->where('u.id = :id')
609
            ->setParameter('id', 1);
610
611
        $parameter = new Parameter('id', 1, ParameterTypeInferer::inferType(1));
612
613
        $this->assertEquals($parameter, $qb->getParameter('id'));
614
    }
615
616
    public function testSetParameters()
617
    {
618
        $qb = $this->_em->createQueryBuilder();
619
        $qb->select('u')
620
           ->from(CmsUser::class, 'u')
621
           ->where($qb->expr()->orX('u.username = :username', 'u.username = :username2'));
622
623
        $parameters = new ArrayCollection();
624
        $parameters->add(new Parameter('username', 'jwage'));
625
        $parameters->add(new Parameter('username2', 'jonwage'));
626
627
        $qb->setParameters($parameters);
628
629
        $this->assertEquals($parameters, $qb->getQuery()->getParameters());
630
    }
631
632
633 View Code Duplication
    public function testGetParameters()
634
    {
635
        $qb = $this->_em->createQueryBuilder();
636
        $qb->select('u')
637
           ->from(CmsUser::class, 'u')
638
           ->where('u.id = :id');
639
640
        $parameters = new ArrayCollection();
641
        $parameters->add(new Parameter('id', 1));
642
643
        $qb->setParameters($parameters);
644
645
        $this->assertEquals($parameters, $qb->getParameters());
646
    }
647
648 View Code Duplication
    public function testGetParameter()
649
    {
650
        $qb = $this->_em->createQueryBuilder()
651
            ->select('u')
652
            ->from(CmsUser::class, 'u')
653
            ->where('u.id = :id');
654
655
        $parameters = new ArrayCollection();
656
        $parameters->add(new Parameter('id', 1));
657
658
        $qb->setParameters($parameters);
659
660
        $this->assertEquals($parameters->first(), $qb->getParameter('id'));
661
    }
662
663
    public function testMultipleWhere()
664
    {
665
        $qb = $this->_em->createQueryBuilder()
666
            ->select('u')
667
            ->from(CmsUser::class, 'u')
668
            ->where('u.id = :uid', 'u.id = :uid2');
669
670
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
671
    }
672
673
    public function testMultipleAndWhere()
674
    {
675
        $qb = $this->_em->createQueryBuilder()
676
            ->select('u')
677
            ->from(CmsUser::class, 'u')
678
            ->andWhere('u.id = :uid', 'u.id = :uid2');
679
680
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
681
    }
682
683 View Code Duplication
    public function testMultipleOrWhere()
684
    {
685
        $qb = $this->_em->createQueryBuilder();
686
        $qb->select('u')
687
           ->from(CmsUser::class, 'u')
688
           ->orWhere('u.id = :uid', $qb->expr()->eq('u.id', ':uid2'));
689
690
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id = :uid2');
691
    }
692
693 View Code Duplication
    public function testComplexWhere()
694
    {
695
        $qb = $this->_em->createQueryBuilder();
696
        $orExpr = $qb->expr()->orX();
697
        $orExpr->add($qb->expr()->eq('u.id', ':uid3'));
698
        $orExpr->add($qb->expr()->in('u.id', [1]));
699
700
        $qb->select('u')
701
           ->from(CmsUser::class, 'u')
702
           ->where($orExpr);
703
704
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid3 OR u.id IN(1)');
705
    }
706
707
    public function testWhereInWithStringLiterals()
708
    {
709
        $qb = $this->_em->createQueryBuilder();
710
        $qb->select('u')
711
           ->from(CmsUser::class, 'u')
712
           ->where($qb->expr()->in('u.name', ['one', 'two', 'three']));
713
714
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('one', 'two', 'three')");
715
716
        $qb->where($qb->expr()->in('u.name', ["O'Reilly", "O'Neil", 'Smith']));
717
718
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('O''Reilly', 'O''Neil', 'Smith')");
719
    }
720
721
    public function testWhereInWithObjectLiterals()
722
    {
723
        $qb = $this->_em->createQueryBuilder();
724
        $expr = $this->_em->getExpressionBuilder();
725
        $qb->select('u')
726
           ->from(CmsUser::class, 'u')
727
           ->where($expr->in('u.name', [$expr->literal('one'), $expr->literal('two'), $expr->literal('three')]));
728
729
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('one', 'two', 'three')");
730
731
        $qb->where($expr->in('u.name', [$expr->literal("O'Reilly"), $expr->literal("O'Neil"), $expr->literal('Smith')]));
732
733
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('O''Reilly', 'O''Neil', 'Smith')");
734
    }
735
736 View Code Duplication
    public function testNegation()
737
    {
738
        $expr = $this->_em->getExpressionBuilder();
739
        $orExpr = $expr->orX();
740
        $orExpr->add($expr->eq('u.id', ':uid3'));
741
        $orExpr->add($expr->not($expr->in('u.id', [1])));
742
743
        $qb = $this->_em->createQueryBuilder();
744
        $qb->select('u')
745
           ->from(CmsUser::class, 'u')
746
           ->where($orExpr);
747
748
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid3 OR NOT(u.id IN(1))');
749
    }
750
751 View Code Duplication
    public function testSomeAllAny()
752
    {
753
        $qb = $this->_em->createQueryBuilder();
754
        $expr = $this->_em->getExpressionBuilder();
755
756
        $qb->select('u')
757
           ->from(CmsUser::class, 'u')
758
           ->where($expr->gt('u.id', $expr->all('select a.id from Doctrine\Tests\Models\CMS\CmsArticle a')));
759
760
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id > ALL(select a.id from Doctrine\Tests\Models\CMS\CmsArticle a)');
761
762
    }
763
764
    public function testMultipleIsolatedQueryConstruction()
765
    {
766
        $qb = $this->_em->createQueryBuilder();
767
        $expr = $this->_em->getExpressionBuilder();
768
769
        $qb->select('u')->from(CmsUser::class, 'u');
770
        $qb->where($expr->eq('u.name', ':name'));
771
        $qb->setParameter('name', 'romanb');
772
773
        $q1 = $qb->getQuery();
774
775
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :name', $q1->getDQL());
776
        $this->assertEquals(1, count($q1->getParameters()));
777
778
        // add another condition and construct a second query
779
        $qb->andWhere($expr->eq('u.id', ':id'));
780
        $qb->setParameter('id', 42);
781
782
        $q2 = $qb->getQuery();
783
784
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :name AND u.id = :id', $q2->getDQL());
785
        $this->assertTrue($q1 !== $q2); // two different, independent queries
786
        $this->assertEquals(2, count($q2->getParameters()));
787
        $this->assertEquals(1, count($q1->getParameters())); // $q1 unaffected
788
    }
789
790
    public function testGetEntityManager()
791
    {
792
        $qb = $this->_em->createQueryBuilder();
793
        $this->assertEquals($this->_em, $qb->getEntityManager());
794
    }
795
796
    public function testInitialStateIsClean()
797
    {
798
        $qb = $this->_em->createQueryBuilder();
799
        $this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
800
    }
801
802 View Code Duplication
    public function testAlteringQueryChangesStateToDirty()
803
    {
804
        $qb = $this->_em->createQueryBuilder()
805
            ->select('u')
806
            ->from(CmsUser::class, 'u');
807
808
        $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
809
    }
810
811
    public function testSelectWithFuncExpression()
812
    {
813
        $qb = $this->_em->createQueryBuilder();
814
        $expr = $qb->expr();
815
        $qb->select($expr->count('e.id'));
816
817
        $this->assertValidQueryBuilder($qb, 'SELECT COUNT(e.id)');
818
    }
819
820
    public function testResetDQLPart()
821
    {
822
        $qb = $this->_em->createQueryBuilder()
823
            ->select('u')
824
            ->from(CmsUser::class, 'u')
825
            ->where('u.username = ?1')->orderBy('u.username');
826
827
        $this->assertEquals('u.username = ?1', (string)$qb->getDQLPart('where'));
828
        $this->assertEquals(1, count($qb->getDQLPart('orderBy')));
829
830
        $qb->resetDQLPart('where')->resetDQLPart('orderBy');
831
832
        $this->assertNull($qb->getDQLPart('where'));
833
        $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
834
    }
835
836 View Code Duplication
    public function testResetDQLParts()
837
    {
838
        $qb = $this->_em->createQueryBuilder()
839
            ->select('u')
840
            ->from(CmsUser::class, 'u')
841
            ->where('u.username = ?1')->orderBy('u.username');
842
843
        $qb->resetDQLParts(['where', 'orderBy']);
844
845
        $this->assertEquals(1, count($qb->getDQLPart('select')));
846
        $this->assertNull($qb->getDQLPart('where'));
847
        $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
848
    }
849
850 View Code Duplication
    public function testResetAllDQLParts()
851
    {
852
        $qb = $this->_em->createQueryBuilder()
853
            ->select('u')
854
            ->from(CmsUser::class, 'u')
855
            ->where('u.username = ?1')->orderBy('u.username');
856
857
        $qb->resetDQLParts();
858
859
        $this->assertEquals(0, count($qb->getDQLPart('select')));
860
        $this->assertNull($qb->getDQLPart('where'));
861
        $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
862
    }
863
864
    /**
865
     * @group DDC-867
866
     */
867
    public function testDeepClone()
868
    {
869
        $qb = $this->_em->createQueryBuilder()
870
            ->select('u')
871
            ->from(CmsUser::class, 'u')
872
            ->andWhere('u.username = ?1')
873
            ->andWhere('u.status = ?2');
874
875
        $expr = $qb->getDQLPart('where');
876
        $this->assertEquals(2, $expr->count(), "Modifying the second query should affect the first one.");
877
878
        $qb2 = clone $qb;
879
        $qb2->andWhere('u.name = ?3');
880
881
        $this->assertEquals(2, $expr->count(), "Modifying the second query should affect the first one.");
882
    }
883
884
    /**
885
     * @group DDC-3108
886
     */
887 View Code Duplication
    public function testAddCriteriaWhereWithJoinAlias()
888
    {
889
        $qb = $this->_em->createQueryBuilder();
890
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
891
        $qb->join('alias1.articles','alias2');
892
893
        $criteria = new Criteria();
894
        $criteria->where($criteria->expr()->eq('field', 'value1'));
895
        $criteria->andWhere($criteria->expr()->gt('alias2.field', 'value2'));
896
897
        $qb->addCriteria($criteria);
898
899
        $this->assertEquals('alias1.field = :field AND alias2.field > :alias2_field', (string) $qb->getDQLPart('where'));
900
        $this->assertSame('value1', $qb->getParameter('field')->getValue());
901
        $this->assertSame('value2', $qb->getParameter('alias2_field')->getValue());
902
    }
903
904
    /**
905
     * @group DDC-3108
906
     */
907 View Code Duplication
    public function testAddCriteriaWhereWithDefaultAndJoinAlias()
908
    {
909
        $qb = $this->_em->createQueryBuilder();
910
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
911
        $qb->join('alias1.articles','alias2');
912
913
        $criteria = new Criteria();
914
        $criteria->where($criteria->expr()->eq('alias1.field', 'value1'));
915
        $criteria->andWhere($criteria->expr()->gt('alias2.field', 'value2'));
916
917
        $qb->addCriteria($criteria);
918
919
        $this->assertEquals('alias1.field = :alias1_field AND alias2.field > :alias2_field', (string) $qb->getDQLPart('where'));
920
        $this->assertSame('value1', $qb->getParameter('alias1_field')->getValue());
921
        $this->assertSame('value2', $qb->getParameter('alias2_field')->getValue());
922
    }
923
924
    /**
925
     * @group DDC-3108
926
     */
927
    public function testAddCriteriaWhereOnJoinAliasWithDuplicateFields()
928
    {
929
        $qb = $this->_em->createQueryBuilder();
930
        $qb->select('alias1')->from(CmsUser::class, 'alias1');
931
        $qb->join('alias1.articles','alias2');
932
933
        $criteria = new Criteria();
934
        $criteria->where($criteria->expr()->eq('alias1.field', 'value1'));
935
        $criteria->andWhere($criteria->expr()->gt('alias2.field', 'value2'));
936
        $criteria->andWhere($criteria->expr()->lt('alias2.field', 'value3'));
937
938
        $qb->addCriteria($criteria);
939
940
        $this->assertEquals('(alias1.field = :alias1_field AND alias2.field > :alias2_field) AND alias2.field < :alias2_field_2', (string) $qb->getDQLPart('where'));
941
        $this->assertSame('value1', $qb->getParameter('alias1_field')->getValue());
942
        $this->assertSame('value2', $qb->getParameter('alias2_field')->getValue());
943
        $this->assertSame('value3', $qb->getParameter('alias2_field_2')->getValue());
944
    }
945
946
947
    /**
948
     * @group DDC-1933
949
     */
950
    public function testParametersAreCloned()
951
    {
952
        $originalQb = new QueryBuilder($this->_em);
953
954
        $originalQb->setParameter('parameter1', 'value1');
955
956
        $copy = clone $originalQb;
957
        $copy->setParameter('parameter2', 'value2');
958
959
        $this->assertCount(1, $originalQb->getParameters());
960
        $this->assertSame('value1', $copy->getParameter('parameter1')->getValue());
961
        $this->assertSame('value2', $copy->getParameter('parameter2')->getValue());
962
    }
963
964
    public function testGetRootAlias()
965
    {
966
        $qb = $this->_em->createQueryBuilder()
967
            ->select('u')
968
            ->from(CmsUser::class, 'u');
969
970
        $this->assertEquals('u', $qb->getRootAlias());
0 ignored issues
show
Deprecated Code introduced by
The function Doctrine\ORM\QueryBuilder::getRootAlias() has been deprecated: Please use $qb->getRootAliases() instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

970
        $this->assertEquals('u', /** @scrutinizer ignore-deprecated */ $qb->getRootAlias());

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
971
    }
972
973
    public function testGetRootAliases()
974
    {
975
        $qb = $this->_em->createQueryBuilder()
976
            ->select('u')
977
            ->from(CmsUser::class, 'u');
978
979
        $this->assertEquals(['u'], $qb->getRootAliases());
980
    }
981
982
    public function testGetRootEntities()
983
    {
984
        $qb = $this->_em->createQueryBuilder()
985
            ->select('u')
986
            ->from(CmsUser::class, 'u');
987
988
        $this->assertEquals([CmsUser::class], $qb->getRootEntities());
989
    }
990
991
    public function testGetSeveralRootAliases()
992
    {
993
        $qb = $this->_em->createQueryBuilder()
994
            ->select('u')
995
            ->from(CmsUser::class, 'u')
996
            ->from(CmsUser::class, 'u2');
997
998
        $this->assertEquals(['u', 'u2'], $qb->getRootAliases());
999
        $this->assertEquals('u', $qb->getRootAlias());
0 ignored issues
show
Deprecated Code introduced by
The function Doctrine\ORM\QueryBuilder::getRootAlias() has been deprecated: Please use $qb->getRootAliases() instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

999
        $this->assertEquals('u', /** @scrutinizer ignore-deprecated */ $qb->getRootAlias());

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
1000
    }
1001
1002 View Code Duplication
    public function testBCAddJoinWithoutRootAlias()
1003
    {
1004
        $qb = $this->_em->createQueryBuilder()
1005
            ->select('u')
1006
            ->from(CmsUser::class, 'u')
1007
            ->add('join', ['INNER JOIN u.groups g'], true);
1008
1009
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.groups g', $qb->getDQL());
1010
    }
1011
1012
    /**
1013
     * @group DDC-1211
1014
     */
1015 View Code Duplication
    public function testEmptyStringLiteral()
1016
    {
1017
        $expr = $this->_em->getExpressionBuilder();
1018
        $qb = $this->_em->createQueryBuilder()
1019
            ->select('u')
1020
            ->from(CmsUser::class, 'u')
1021
            ->where($expr->eq('u.username', $expr->literal("")));
1022
1023
        $this->assertEquals("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = ''", $qb->getDQL());
1024
    }
1025
1026
    /**
1027
     * @group DDC-1211
1028
     */
1029 View Code Duplication
    public function testEmptyNumericLiteral()
1030
    {
1031
        $expr = $this->_em->getExpressionBuilder();
1032
        $qb = $this->_em->createQueryBuilder()
1033
            ->select('u')
1034
            ->from(CmsUser::class, 'u')
1035
            ->where($expr->eq('u.username', $expr->literal(0)));
1036
1037
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 0', $qb->getDQL());
1038
    }
1039
1040
    /**
1041
     * @group DDC-1227
1042
     */
1043 View Code Duplication
    public function testAddFromString()
1044
    {
1045
        $qb = $this->_em->createQueryBuilder()
1046
            ->add('select', 'u')
0 ignored issues
show
Bug introduced by
'u' of type string is incompatible with the type object|array expected by parameter $dqlPart of Doctrine\ORM\QueryBuilder::add(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1046
            ->add('select', /** @scrutinizer ignore-type */ 'u')
Loading history...
1047
            ->add('from', CmsUser::class . ' u');
1048
1049
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL());
1050
    }
1051
1052
    /**
1053
     * @group DDC-1619
1054
     */
1055 View Code Duplication
    public function testAddDistinct()
1056
    {
1057
        $qb = $this->_em->createQueryBuilder()
1058
            ->select('u')
1059
            ->distinct()
1060
            ->from(CmsUser::class, 'u');
1061
1062
        $this->assertEquals('SELECT DISTINCT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL());
1063
    }
1064
1065
    /**
1066
     * @group DDC-2192
1067
     */
1068
    public function testWhereAppend()
1069
    {
1070
        $this->expectException(\InvalidArgumentException::class);
1071
        $this->expectExceptionMessage("Using \$append = true does not have an effect with 'where' or 'having' parts. See QueryBuilder#andWhere() for an example for correct usage.");
1072
1073
        $qb = $this->_em->createQueryBuilder()
0 ignored issues
show
Unused Code introduced by
The assignment to $qb is dead and can be removed.
Loading history...
1074
            ->add('where', 'u.foo = ?1')
0 ignored issues
show
Bug introduced by
'u.foo = ?1' of type string is incompatible with the type object|array expected by parameter $dqlPart of Doctrine\ORM\QueryBuilder::add(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1074
            ->add('where', /** @scrutinizer ignore-type */ 'u.foo = ?1')
Loading history...
1075
            ->add('where', 'u.bar = ?2', true)
1076
        ;
1077
    }
1078
1079
    public function testSecondLevelCacheQueryBuilderOptions()
1080
    {
1081
        $defaultQueryBuilder = $this->_em->createQueryBuilder()
1082
            ->select('s')
1083
            ->from(State::class, 's');
1084
1085
        $this->assertFalse($defaultQueryBuilder->isCacheable());
1086
        $this->assertEquals(0, $defaultQueryBuilder->getLifetime());
1087
        $this->assertNull($defaultQueryBuilder->getCacheRegion());
1088
        $this->assertNull($defaultQueryBuilder->getCacheMode());
1089
1090
        $defaultQuery = $defaultQueryBuilder->getQuery();
1091
1092
        $this->assertFalse($defaultQuery->isCacheable());
1093
        $this->assertEquals(0, $defaultQuery->getLifetime());
1094
        $this->assertNull($defaultQuery->getCacheRegion());
1095
        $this->assertNull($defaultQuery->getCacheMode());
1096
1097
        $builder = $this->_em->createQueryBuilder()
1098
            ->select('s')
1099
            ->setLifetime(123)
1100
            ->setCacheable(true)
1101
            ->setCacheRegion('foo_reg')
1102
            ->setCacheMode(Cache::MODE_REFRESH)
1103
            ->from(State::class, 's');
1104
1105
        $this->assertTrue($builder->isCacheable());
1106
        $this->assertEquals(123, $builder->getLifetime());
1107
        $this->assertEquals('foo_reg', $builder->getCacheRegion());
1108
        $this->assertEquals(Cache::MODE_REFRESH, $builder->getCacheMode());
1109
1110
        $query = $builder->getQuery();
1111
1112
        $this->assertTrue($query->isCacheable());
1113
        $this->assertEquals(123, $query->getLifetime());
1114
        $this->assertEquals('foo_reg', $query->getCacheRegion());
1115
        $this->assertEquals(Cache::MODE_REFRESH, $query->getCacheMode());
1116
    }
1117
1118
    /**
1119
     * @group DDC-2253
1120
     */
1121
    public function testRebuildsFromParts()
1122
    {
1123
        $qb = $this->_em->createQueryBuilder()
1124
          ->select('u')
1125
          ->from(CmsUser::class, 'u')
1126
          ->join('u.article', 'a');
1127
1128
        $dqlParts = $qb->getDQLParts();
1129
        $dql = $qb->getDQL();
1130
1131
        $qb2 = $this->_em->createQueryBuilder();
1132
        foreach (array_filter($dqlParts) as $name => $part) {
1133
            $qb2->add($name, $part);
1134
        }
1135
        $dql2 = $qb2->getDQL();
1136
1137
        $this->assertEquals($dql, $dql2);
1138
    }
1139
1140
    public function testGetAllAliasesWithNoJoins()
1141
    {
1142
        $qb = $this->_em->createQueryBuilder();
1143
        $qb->select('u')->from(CmsUser::class, 'u');
1144
1145
        $aliases = $qb->getAllAliases();
1146
1147
        $this->assertEquals(['u'], $aliases);
1148
    }
1149
1150
    public function testGetAllAliasesWithJoins()
1151
    {
1152
        $qb = $this->_em->createQueryBuilder()
1153
            ->select('u')
1154
            ->from(CmsUser::class, 'u')
1155
            ->join('u.groups', 'g');
1156
1157
        $aliases = $qb->getAllAliases();
1158
1159
        $this->assertEquals(['u', 'g'], $aliases);
1160
    }
1161
1162
    /**
1163
     * @group 6699
1164
     */
1165
    public function testGetParameterTypeJuggling() : void
1166
    {
1167
        $builder = $this->_em->createQueryBuilder()
1168
                             ->select('u')
1169
                             ->from(CmsUser::class, 'u')
1170
                             ->where('u.id = ?0');
1171
1172
        $builder->setParameter(0, 0);
1173
1174
        self::assertCount(1, $builder->getParameters());
1175
        self::assertSame(0, $builder->getParameter(0)->getValue());
1176
        self::assertSame(0, $builder->getParameter('0')->getValue());
1177
    }
1178
1179
    /**
1180
     * @group 6699
1181
     */
1182 View Code Duplication
    public function testSetParameterWithNameZeroIsNotOverridden() : void
1183
    {
1184
        $builder = $this->_em->createQueryBuilder()
1185
                             ->select('u')
1186
                             ->from(CmsUser::class, 'u')
1187
                             ->where('u.id != ?0')
1188
                             ->andWhere('u.username = :name');
1189
1190
        $builder->setParameter(0, 0);
1191
        $builder->setParameter('name', 'Doctrine');
1192
1193
        self::assertCount(2, $builder->getParameters());
1194
        self::assertSame(0, $builder->getParameter('0')->getValue());
1195
        self::assertSame('Doctrine', $builder->getParameter('name')->getValue());
1196
    }
1197
1198
    /**
1199
     * @group 6699
1200
     */
1201 View Code Duplication
    public function testSetParameterWithNameZeroDoesNotOverrideAnotherParameter() : void
1202
    {
1203
        $builder = $this->_em->createQueryBuilder()
1204
                             ->select('u')
1205
                             ->from(CmsUser::class, 'u')
1206
                             ->where('u.id != ?0')
1207
                             ->andWhere('u.username = :name');
1208
1209
        $builder->setParameter('name', 'Doctrine');
1210
        $builder->setParameter(0, 0);
1211
1212
        self::assertCount(2, $builder->getParameters());
1213
        self::assertSame(0, $builder->getParameter(0)->getValue());
1214
        self::assertSame('Doctrine', $builder->getParameter('name')->getValue());
1215
    }
1216
1217
    /**
1218
     * @group 6699
1219
     */
1220
    public function testSetParameterWithTypeJugglingWorks() : void
1221
    {
1222
        $builder = $this->_em->createQueryBuilder()
1223
                             ->select('u')
1224
                             ->from(CmsUser::class, 'u')
1225
                             ->where('u.id != ?0')
1226
                             ->andWhere('u.username = :name');
1227
1228
        $builder->setParameter('0', 1);
1229
        $builder->setParameter('name', 'Doctrine');
1230
        $builder->setParameter(0, 2);
1231
        $builder->setParameter('0', 3);
1232
1233
        self::assertCount(2, $builder->getParameters());
1234
        self::assertSame(3, $builder->getParameter(0)->getValue());
1235
        self::assertSame(3, $builder->getParameter('0')->getValue());
1236
        self::assertSame('Doctrine', $builder->getParameter('name')->getValue());
1237
    }
1238
}
1239