Completed
Pull Request — master (#6359)
by Sebastiaan
11:43
created

QueryBuilderTest::testMultipleAndWhere()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
c 0
b 0
f 0
rs 9.6666
cc 1
eloc 6
nc 1
nop 0
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();
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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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());
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());
1000
    }
1001
1002
    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
    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
    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
    public function testAddFromString()
1044
    {
1045
        $qb = $this->_em->createQueryBuilder()
1046
            ->add('select', 'u')
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
    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()
1074
            ->add('where', 'u.foo = ?1')
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
    public function testQueryHints()
1119
    {
1120
        $defaultQueryBuilder = $this->_em->createQueryBuilder()
1121
            ->select('s')
1122
            ->from(State::class, 's');
1123
1124
        $this->assertFalse($defaultQueryBuilder->hasHint('foo'));
1125
        $this->assertFalse($defaultQueryBuilder->getHint('foo'));
1126
        $this->assertEquals([], $defaultQueryBuilder->getHints());
1127
1128
        $defaultQuery = $defaultQueryBuilder->getQuery();
1129
1130
        $this->assertFalse($defaultQuery->hasHint('foo'));
1131
1132
        $builder = $this->_em->createQueryBuilder()
1133
            ->select('s')
1134
            ->from(State::class, 's')
1135
            ->setHint('foo', 'bar')
1136
            ->setHint('foo_reg', $value = new \stdClass())
1137
        ;
1138
1139
        $this->assertTrue($builder->hasHint('foo'));
1140
        $this->assertTrue($builder->hasHint('foo_reg'));
1141
        $this->assertFalse($builder->hasHint('fool'));
1142
        $this->assertEquals(['foo' => 'bar', 'foo_reg' => $value], $builder->getHints());
1143
1144
        $this->assertEquals('bar', $builder->getHint('foo'));
1145
        $this->assertEquals($value, $builder->getHint('foo_reg'));
1146
        $this->assertFalse($builder->getHint('fool'));
1147
1148
        $query = $builder->getQuery();
1149
1150
        $this->assertTrue($query->hasHint('foo'));
1151
        $this->assertTrue($query->hasHint('foo_reg'));
1152
        $this->assertFalse($query->hasHint('fool'));
1153
1154
        $this->assertEquals('bar', $query->getHint('foo'));
1155
        $this->assertEquals($value, $query->getHint('foo_reg'));
1156
        $this->assertFalse($query->getHint('fool'));
1157
    }
1158
1159
    /**
1160
     * @group DDC-2253
1161
     */
1162
    public function testRebuildsFromParts()
1163
    {
1164
        $qb = $this->_em->createQueryBuilder()
1165
          ->select('u')
1166
          ->from(CmsUser::class, 'u')
1167
          ->join('u.article', 'a');
1168
1169
        $dqlParts = $qb->getDQLParts();
1170
        $dql = $qb->getDQL();
1171
1172
        $qb2 = $this->_em->createQueryBuilder();
1173
        foreach (array_filter($dqlParts) as $name => $part) {
1174
            $qb2->add($name, $part);
1175
        }
1176
        $dql2 = $qb2->getDQL();
1177
1178
        $this->assertEquals($dql, $dql2);
1179
    }
1180
1181
    public function testGetAllAliasesWithNoJoins()
1182
    {
1183
        $qb = $this->_em->createQueryBuilder();
1184
        $qb->select('u')->from(CmsUser::class, 'u');
1185
1186
        $aliases = $qb->getAllAliases();
1187
1188
        $this->assertEquals(['u'], $aliases);
1189
    }
1190
1191
    public function testGetAllAliasesWithJoins()
1192
    {
1193
        $qb = $this->_em->createQueryBuilder()
1194
            ->select('u')
1195
            ->from(CmsUser::class, 'u')
1196
            ->join('u.groups', 'g');
1197
1198
        $aliases = $qb->getAllAliases();
1199
1200
        $this->assertEquals(['u', 'g'], $aliases);
1201
    }
1202
}
1203