Passed
Pull Request — master (#3120)
by Sergei
12:25
created

QueryBuilderTest   F

Complexity

Total Complexity 67

Size/Duplication

Total Lines 891
Duplicated Lines 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
wmc 67
dl 0
loc 891
rs 2.4489
c 1
b 1
f 0

How to fix   Complexity   

Complex Class

Complex classes like QueryBuilderTest often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use QueryBuilderTest, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace Doctrine\Tests\DBAL\Query;
4
5
use Doctrine\DBAL\ParameterType;
6
use Doctrine\DBAL\Query\Expression\ExpressionBuilder;
7
use Doctrine\DBAL\Query\QueryBuilder;
8
9
/**
10
 * @group DBAL-12
11
 */
12
class QueryBuilderTest extends \Doctrine\Tests\DbalTestCase
13
{
14
    /**
15
     * @var \Doctrine\DBAL\Connection
16
     */
17
    protected $conn;
18
19
    protected function setUp()
20
    {
21
        $this->conn = $this->createMock('Doctrine\DBAL\Connection');
22
23
        $expressionBuilder = new ExpressionBuilder($this->conn);
24
25
        $this->conn->expects($this->any())
26
                   ->method('getExpressionBuilder')
27
                   ->will($this->returnValue($expressionBuilder));
28
    }
29
30
    /**
31
     * @group DBAL-2291
32
     */
33
    public function testSimpleSelectWithoutFrom()
34
    {
35
        $qb = new QueryBuilder($this->conn);
36
37
        $qb->select('some_function()');
38
39
        self::assertEquals('SELECT some_function()', (string) $qb);
40
    }
41
42
    public function testSimpleSelect()
43
    {
44
        $qb = new QueryBuilder($this->conn);
45
46
        $qb->select('u.id')
47
           ->from('users', 'u');
48
49
        self::assertEquals('SELECT u.id FROM users u', (string) $qb);
50
    }
51
52
    public function testSelectWithSimpleWhere()
53
    {
54
        $qb   = new QueryBuilder($this->conn);
55
        $expr = $qb->expr();
56
57
        $qb->select('u.id')
58
           ->from('users', 'u')
59
           ->where($expr->andX($expr->eq('u.nickname', '?')));
60
61
        self::assertEquals("SELECT u.id FROM users u WHERE u.nickname = ?", (string) $qb);
62
    }
63
64
    public function testSelectWithLeftJoin()
65
    {
66
        $qb   = new QueryBuilder($this->conn);
67
        $expr = $qb->expr();
68
69
        $qb->select('u.*', 'p.*')
70
           ->from('users', 'u')
71
           ->leftJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
72
73
        self::assertEquals('SELECT u.*, p.* FROM users u LEFT JOIN phones p ON p.user_id = u.id', (string) $qb);
74
    }
75
76
    public function testSelectWithJoin()
77
    {
78
        $qb   = new QueryBuilder($this->conn);
79
        $expr = $qb->expr();
80
81
        $qb->select('u.*', 'p.*')
82
           ->from('users', 'u')
83
           ->Join('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
84
85
        self::assertEquals('SELECT u.*, p.* FROM users u INNER JOIN phones p ON p.user_id = u.id', (string) $qb);
86
    }
87
88
    public function testSelectWithInnerJoin()
89
    {
90
        $qb   = new QueryBuilder($this->conn);
91
        $expr = $qb->expr();
92
93
        $qb->select('u.*', 'p.*')
94
           ->from('users', 'u')
95
           ->innerJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
96
97
        self::assertEquals('SELECT u.*, p.* FROM users u INNER JOIN phones p ON p.user_id = u.id', (string) $qb);
98
    }
99
100
    public function testSelectWithRightJoin()
101
    {
102
        $qb   = new QueryBuilder($this->conn);
103
        $expr = $qb->expr();
104
105
        $qb->select('u.*', 'p.*')
106
           ->from('users', 'u')
107
           ->rightJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
108
109
        self::assertEquals('SELECT u.*, p.* FROM users u RIGHT JOIN phones p ON p.user_id = u.id', (string) $qb);
110
    }
111
112
    public function testSelectWithAndWhereConditions()
113
    {
114
        $qb   = new QueryBuilder($this->conn);
115
        $expr = $qb->expr();
116
117
        $qb->select('u.*', 'p.*')
118
           ->from('users', 'u')
119
           ->where('u.username = ?')
120
           ->andWhere('u.name = ?');
121
122
        self::assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) AND (u.name = ?)', (string) $qb);
123
    }
124
125
    public function testSelectWithOrWhereConditions()
126
    {
127
        $qb   = new QueryBuilder($this->conn);
128
        $expr = $qb->expr();
129
130
        $qb->select('u.*', 'p.*')
131
           ->from('users', 'u')
132
           ->where('u.username = ?')
133
           ->orWhere('u.name = ?');
134
135
        self::assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb);
136
    }
137
138
    public function testSelectWithOrOrWhereConditions()
139
    {
140
        $qb   = new QueryBuilder($this->conn);
141
        $expr = $qb->expr();
142
143
        $qb->select('u.*', 'p.*')
144
           ->from('users', 'u')
145
           ->orWhere('u.username = ?')
146
           ->orWhere('u.name = ?');
147
148
        self::assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb);
149
    }
150
151
    public function testSelectWithAndOrWhereConditions()
152
    {
153
        $qb   = new QueryBuilder($this->conn);
154
        $expr = $qb->expr();
155
156
        $qb->select('u.*', 'p.*')
157
           ->from('users', 'u')
158
           ->where('u.username = ?')
159
           ->andWhere('u.username = ?')
160
           ->orWhere('u.name = ?')
161
           ->andWhere('u.name = ?');
162
163
        self::assertEquals('SELECT u.*, p.* FROM users u WHERE (((u.username = ?) AND (u.username = ?)) OR (u.name = ?)) AND (u.name = ?)', (string) $qb);
164
    }
165
166
    public function testSelectGroupBy()
167
    {
168
        $qb   = new QueryBuilder($this->conn);
169
        $expr = $qb->expr();
170
171
        $qb->select('u.*', 'p.*')
172
           ->from('users', 'u')
173
           ->groupBy('u.id');
174
175
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id', (string) $qb);
176
    }
177
178
    public function testSelectEmptyGroupBy()
179
    {
180
        $qb   = new QueryBuilder($this->conn);
181
        $expr = $qb->expr();
182
183
        $qb->select('u.*', 'p.*')
184
           ->groupBy(array())
185
           ->from('users', 'u');
186
187
        self::assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
188
    }
189
190
    public function testSelectEmptyAddGroupBy()
191
    {
192
        $qb   = new QueryBuilder($this->conn);
193
        $expr = $qb->expr();
194
195
        $qb->select('u.*', 'p.*')
196
           ->addGroupBy(array())
197
           ->from('users', 'u');
198
199
        self::assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
200
    }
201
202
    public function testSelectAddGroupBy()
203
    {
204
        $qb   = new QueryBuilder($this->conn);
205
        $expr = $qb->expr();
206
207
        $qb->select('u.*', 'p.*')
208
           ->from('users', 'u')
209
           ->groupBy('u.id')
210
           ->addGroupBy('u.foo');
211
212
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo', (string) $qb);
213
    }
214
215
    public function testSelectAddGroupBys()
216
    {
217
        $qb   = new QueryBuilder($this->conn);
218
        $expr = $qb->expr();
219
220
        $qb->select('u.*', 'p.*')
221
           ->from('users', 'u')
222
           ->groupBy('u.id')
223
           ->addGroupBy('u.foo', 'u.bar');
224
225
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo, u.bar', (string) $qb);
226
    }
227
228
    public function testSelectHaving()
229
    {
230
        $qb   = new QueryBuilder($this->conn);
231
        $expr = $qb->expr();
232
233
        $qb->select('u.*', 'p.*')
234
           ->from('users', 'u')
235
           ->groupBy('u.id')
236
           ->having('u.name = ?');
237
238
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?', (string) $qb);
239
    }
240
241
    public function testSelectAndHaving()
242
    {
243
        $qb   = new QueryBuilder($this->conn);
244
        $expr = $qb->expr();
245
246
        $qb->select('u.*', 'p.*')
247
           ->from('users', 'u')
248
           ->groupBy('u.id')
249
           ->andHaving('u.name = ?');
250
251
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?', (string) $qb);
252
    }
253
254
    public function testSelectHavingAndHaving()
255
    {
256
        $qb   = new QueryBuilder($this->conn);
257
        $expr = $qb->expr();
258
259
        $qb->select('u.*', 'p.*')
260
           ->from('users', 'u')
261
           ->groupBy('u.id')
262
           ->having('u.name = ?')
263
           ->andHaving('u.username = ?');
264
265
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) AND (u.username = ?)', (string) $qb);
266
    }
267
268
    public function testSelectHavingOrHaving()
269
    {
270
        $qb   = new QueryBuilder($this->conn);
271
        $expr = $qb->expr();
272
273
        $qb->select('u.*', 'p.*')
274
           ->from('users', 'u')
275
           ->groupBy('u.id')
276
           ->having('u.name = ?')
277
           ->orHaving('u.username = ?');
278
279
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)', (string) $qb);
280
    }
281
282
    public function testSelectOrHavingOrHaving()
283
    {
284
        $qb   = new QueryBuilder($this->conn);
285
        $expr = $qb->expr();
286
287
        $qb->select('u.*', 'p.*')
288
           ->from('users', 'u')
289
           ->groupBy('u.id')
290
           ->orHaving('u.name = ?')
291
           ->orHaving('u.username = ?');
292
293
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)', (string) $qb);
294
    }
295
296
    public function testSelectHavingAndOrHaving()
297
    {
298
        $qb   = new QueryBuilder($this->conn);
299
        $expr = $qb->expr();
300
301
        $qb->select('u.*', 'p.*')
302
           ->from('users', 'u')
303
           ->groupBy('u.id')
304
           ->having('u.name = ?')
305
           ->orHaving('u.username = ?')
306
           ->andHaving('u.username = ?');
307
308
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING ((u.name = ?) OR (u.username = ?)) AND (u.username = ?)', (string) $qb);
309
    }
310
311
    public function testSelectOrderBy()
312
    {
313
        $qb   = new QueryBuilder($this->conn);
314
        $expr = $qb->expr();
315
316
        $qb->select('u.*', 'p.*')
317
           ->from('users', 'u')
318
           ->orderBy('u.name');
319
320
        self::assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC', (string) $qb);
321
    }
322
323
    public function testSelectAddOrderBy()
324
    {
325
        $qb   = new QueryBuilder($this->conn);
326
        $expr = $qb->expr();
327
328
        $qb->select('u.*', 'p.*')
329
           ->from('users', 'u')
330
           ->orderBy('u.name')
331
           ->addOrderBy('u.username', 'DESC');
332
333
        self::assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC', (string) $qb);
334
    }
335
336
    public function testSelectAddAddOrderBy()
337
    {
338
        $qb   = new QueryBuilder($this->conn);
339
        $expr = $qb->expr();
340
341
        $qb->select('u.*', 'p.*')
342
           ->from('users', 'u')
343
           ->addOrderBy('u.name')
344
           ->addOrderBy('u.username', 'DESC');
345
346
        self::assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC', (string) $qb);
347
    }
348
349
    public function testEmptySelect()
350
    {
351
        $qb   = new QueryBuilder($this->conn);
352
        $qb2 = $qb->select();
353
354
        self::assertSame($qb, $qb2);
355
        self::assertEquals(QueryBuilder::SELECT, $qb->getType());
356
    }
357
358
    public function testSelectAddSelect()
359
    {
360
        $qb   = new QueryBuilder($this->conn);
361
        $expr = $qb->expr();
362
363
        $qb->select('u.*')
364
           ->addSelect('p.*')
365
           ->from('users', 'u');
366
367
        self::assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
368
    }
369
370
    public function testEmptyAddSelect()
371
    {
372
        $qb   = new QueryBuilder($this->conn);
373
        $qb2 = $qb->addSelect();
374
375
        self::assertSame($qb, $qb2);
376
        self::assertEquals(QueryBuilder::SELECT, $qb->getType());
377
    }
378
379
    public function testSelectMultipleFrom()
380
    {
381
        $qb   = new QueryBuilder($this->conn);
382
        $expr = $qb->expr();
383
384
        $qb->select('u.*')
385
           ->addSelect('p.*')
386
           ->from('users', 'u')
387
           ->from('phonenumbers', 'p');
388
389
        self::assertEquals('SELECT u.*, p.* FROM users u, phonenumbers p', (string) $qb);
390
    }
391
392
    public function testUpdate()
393
    {
394
        $qb   = new QueryBuilder($this->conn);
395
        $qb->update('users', 'u')
396
           ->set('u.foo', '?')
397
           ->set('u.bar', '?');
398
399
        self::assertEquals(QueryBuilder::UPDATE, $qb->getType());
400
        self::assertEquals('UPDATE users u SET u.foo = ?, u.bar = ?', (string) $qb);
401
    }
402
403
    public function testUpdateWithoutAlias()
404
    {
405
        $qb   = new QueryBuilder($this->conn);
406
        $qb->update('users')
407
           ->set('foo', '?')
408
           ->set('bar', '?');
409
410
        self::assertEquals('UPDATE users SET foo = ?, bar = ?', (string) $qb);
411
    }
412
413
    public function testUpdateWhere()
414
    {
415
        $qb   = new QueryBuilder($this->conn);
416
        $qb->update('users', 'u')
417
           ->set('u.foo', '?')
418
           ->where('u.foo = ?');
419
420
        self::assertEquals('UPDATE users u SET u.foo = ? WHERE u.foo = ?', (string) $qb);
421
    }
422
423
    public function testEmptyUpdate()
424
    {
425
        $qb   = new QueryBuilder($this->conn);
426
        $qb2 = $qb->update();
427
428
        self::assertEquals(QueryBuilder::UPDATE, $qb->getType());
429
        self::assertSame($qb2, $qb);
430
    }
431
432
    public function testDelete()
433
    {
434
        $qb   = new QueryBuilder($this->conn);
435
        $qb->delete('users', 'u');
436
437
        self::assertEquals(QueryBuilder::DELETE, $qb->getType());
438
        self::assertEquals('DELETE FROM users u', (string) $qb);
439
    }
440
441
    public function testDeleteWithoutAlias()
442
    {
443
        $qb   = new QueryBuilder($this->conn);
444
        $qb->delete('users');
445
446
        self::assertEquals(QueryBuilder::DELETE, $qb->getType());
447
        self::assertEquals('DELETE FROM users', (string) $qb);
448
    }
449
450
    public function testDeleteWhere()
451
    {
452
        $qb   = new QueryBuilder($this->conn);
453
        $qb->delete('users', 'u')
454
           ->where('u.foo = ?');
455
456
        self::assertEquals('DELETE FROM users u WHERE u.foo = ?', (string) $qb);
457
    }
458
459
    public function testEmptyDelete()
460
    {
461
        $qb   = new QueryBuilder($this->conn);
462
        $qb2 = $qb->delete();
463
464
        self::assertEquals(QueryBuilder::DELETE, $qb->getType());
465
        self::assertSame($qb2, $qb);
466
    }
467
468
    public function testInsertValues()
469
    {
470
        $qb = new QueryBuilder($this->conn);
471
        $qb->insert('users')
472
            ->values(
473
                array(
474
                    'foo' => '?',
475
                    'bar' => '?'
476
                )
477
            );
478
479
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
480
        self::assertEquals('INSERT INTO users (foo, bar) VALUES(?, ?)', (string) $qb);
481
    }
482
483
    public function testInsertReplaceValues()
484
    {
485
        $qb = new QueryBuilder($this->conn);
486
        $qb->insert('users')
487
            ->values(
488
                array(
489
                    'foo' => '?',
490
                    'bar' => '?'
491
                )
492
            )
493
            ->values(
494
                array(
495
                    'bar' => '?',
496
                    'foo' => '?'
497
                )
498
            );
499
500
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
501
        self::assertEquals('INSERT INTO users (bar, foo) VALUES(?, ?)', (string) $qb);
502
    }
503
504
    public function testInsertSetValue()
505
    {
506
        $qb = new QueryBuilder($this->conn);
507
        $qb->insert('users')
508
            ->setValue('foo', 'bar')
509
            ->setValue('bar', '?')
510
            ->setValue('foo', '?');
511
512
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
513
        self::assertEquals('INSERT INTO users (foo, bar) VALUES(?, ?)', (string) $qb);
514
    }
515
516
    public function testInsertValuesSetValue()
517
    {
518
        $qb = new QueryBuilder($this->conn);
519
        $qb->insert('users')
520
            ->values(
521
                array(
522
                    'foo' => '?'
523
                )
524
            )
525
            ->setValue('bar', '?');
526
527
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
528
        self::assertEquals('INSERT INTO users (foo, bar) VALUES(?, ?)', (string) $qb);
529
    }
530
531
    public function testEmptyInsert()
532
    {
533
        $qb = new QueryBuilder($this->conn);
534
        $qb2 = $qb->insert();
535
536
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
537
        self::assertSame($qb2, $qb);
538
    }
539
540
    public function testGetConnection()
541
    {
542
        $qb   = new QueryBuilder($this->conn);
543
        self::assertSame($this->conn, $qb->getConnection());
544
    }
545
546
    public function testGetState()
547
    {
548
        $qb   = new QueryBuilder($this->conn);
549
550
        self::assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
551
552
        $qb->select('u.*')->from('users', 'u');
553
554
        self::assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
555
556
        $sql1 = $qb->getSQL();
557
558
        self::assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
559
        self::assertEquals($sql1, $qb->getSQL());
560
    }
561
562
    public function testSetMaxResults()
563
    {
564
        $qb   = new QueryBuilder($this->conn);
565
        $qb->setMaxResults(10);
566
567
        self::assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
568
        self::assertEQuals(10, $qb->getMaxResults());
569
    }
570
571
    public function testSetFirstResult()
572
    {
573
        $qb   = new QueryBuilder($this->conn);
574
        $qb->setFirstResult(10);
575
576
        self::assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
577
        self::assertEQuals(10, $qb->getFirstResult());
578
    }
579
580
    public function testResetQueryPart()
581
    {
582
        $qb   = new QueryBuilder($this->conn);
583
584
        $qb->select('u.*')->from('users', 'u')->where('u.name = ?');
585
586
        self::assertEquals('SELECT u.* FROM users u WHERE u.name = ?', (string) $qb);
587
        $qb->resetQueryPart('where');
588
        self::assertEquals('SELECT u.* FROM users u', (string) $qb);
589
    }
590
591
    public function testResetQueryParts()
592
    {
593
        $qb   = new QueryBuilder($this->conn);
594
595
        $qb->select('u.*')->from('users', 'u')->where('u.name = ?')->orderBy('u.name');
596
597
        self::assertEquals('SELECT u.* FROM users u WHERE u.name = ? ORDER BY u.name ASC', (string) $qb);
598
        $qb->resetQueryParts(array('where', 'orderBy'));
599
        self::assertEquals('SELECT u.* FROM users u', (string) $qb);
600
    }
601
602
    public function testCreateNamedParameter()
603
    {
604
        $qb   = new QueryBuilder($this->conn);
605
606
        $qb->select('u.*')->from('users', 'u')->where(
607
            $qb->expr()->eq('u.name', $qb->createNamedParameter(10, ParameterType::INTEGER))
608
        );
609
610
        self::assertEquals('SELECT u.* FROM users u WHERE u.name = :dcValue1', (string) $qb);
611
        self::assertEquals(10, $qb->getParameter('dcValue1'));
612
        self::assertEquals(ParameterType::INTEGER, $qb->getParameterType('dcValue1'));
613
    }
614
615
    public function testCreateNamedParameterCustomPlaceholder()
616
    {
617
        $qb   = new QueryBuilder($this->conn);
618
619
        $qb->select('u.*')->from('users', 'u')->where(
620
            $qb->expr()->eq('u.name', $qb->createNamedParameter(10, ParameterType::INTEGER, ':test'))
621
        );
622
623
        self::assertEquals('SELECT u.* FROM users u WHERE u.name = :test', (string) $qb);
624
        self::assertEquals(10, $qb->getParameter('test'));
625
        self::assertEquals(ParameterType::INTEGER, $qb->getParameterType('test'));
626
    }
627
628
    public function testCreatePositionalParameter()
629
    {
630
        $qb   = new QueryBuilder($this->conn);
631
632
        $qb->select('u.*')->from('users', 'u')->where(
633
            $qb->expr()->eq('u.name', $qb->createPositionalParameter(10, ParameterType::INTEGER))
634
        );
635
636
        self::assertEquals('SELECT u.* FROM users u WHERE u.name = ?', (string) $qb);
637
        self::assertEquals(10, $qb->getParameter(1));
638
        self::assertEquals(ParameterType::INTEGER, $qb->getParameterType(1));
639
    }
640
641
    /**
642
     * @group DBAL-172
643
     */
644
    public function testReferenceJoinFromJoin()
645
    {
646
        $qb = new QueryBuilder($this->conn);
647
648
        $qb->select('COUNT(DISTINCT news.id)')
649
            ->from('cb_newspages', 'news')
650
            ->innerJoin('news', 'nodeversion', 'nv', 'nv.refId = news.id AND nv.refEntityname=\'News\'')
651
            ->innerJoin('invalid', 'nodetranslation', 'nt', 'nv.nodetranslation = nt.id')
652
            ->innerJoin('nt', 'node', 'n', 'nt.node = n.id')
653
            ->where('nt.lang = :lang AND n.deleted != 1');
654
655
        $this->expectException('Doctrine\DBAL\Query\QueryException', "The given alias 'invalid' is not part of any FROM or JOIN clause table. The currently registered aliases are: news, nv.");
656
        self::assertEquals('', $qb->getSQL());
657
    }
658
659
    /**
660
     * @group DBAL-172
661
     */
662
    public function testSelectFromMasterWithWhereOnJoinedTables()
663
    {
664
        $qb = new QueryBuilder($this->conn);
665
666
        $qb->select('COUNT(DISTINCT news.id)')
667
            ->from('newspages', 'news')
668
            ->innerJoin('news', 'nodeversion', 'nv', "nv.refId = news.id AND nv.refEntityname='Entity\\News'")
669
            ->innerJoin('nv', 'nodetranslation', 'nt', 'nv.nodetranslation = nt.id')
670
            ->innerJoin('nt', 'node', 'n', 'nt.node = n.id')
671
            ->where('nt.lang = ?')
672
            ->andWhere('n.deleted = 0');
673
674
        self::assertEquals("SELECT COUNT(DISTINCT news.id) FROM newspages news INNER JOIN nodeversion nv ON nv.refId = news.id AND nv.refEntityname='Entity\\News' INNER JOIN nodetranslation nt ON nv.nodetranslation = nt.id INNER JOIN node n ON nt.node = n.id WHERE (nt.lang = ?) AND (n.deleted = 0)", $qb->getSQL());
675
    }
676
677
    /**
678
     * @group DBAL-442
679
     */
680
    public function testSelectWithMultipleFromAndJoins()
681
    {
682
        $qb = new QueryBuilder($this->conn);
683
684
        $qb->select('DISTINCT u.id')
685
            ->from('users', 'u')
686
            ->from('articles', 'a')
687
            ->innerJoin('u', 'permissions', 'p', 'p.user_id = u.id')
688
            ->innerJoin('a', 'comments', 'c', 'c.article_id = a.id')
689
            ->where('u.id = a.user_id')
690
            ->andWhere('p.read = 1');
691
692
        self::assertEquals('SELECT DISTINCT u.id FROM users u INNER JOIN permissions p ON p.user_id = u.id, articles a INNER JOIN comments c ON c.article_id = a.id WHERE (u.id = a.user_id) AND (p.read = 1)', $qb->getSQL());
693
    }
694
695
    /**
696
     * @group DBAL-774
697
     */
698
    public function testSelectWithJoinsWithMultipleOnConditionsParseOrder()
699
    {
700
        $qb = new QueryBuilder($this->conn);
701
702
        $qb->select('a.id')
703
            ->from('table_a', 'a')
704
            ->join('a', 'table_b', 'b', 'a.fk_b = b.id')
705
            ->join('b', 'table_c', 'c', 'c.fk_b = b.id AND b.language = ?')
706
            ->join('a', 'table_d', 'd', 'a.fk_d = d.id')
707
            ->join('c', 'table_e', 'e', 'e.fk_c = c.id AND e.fk_d = d.id');
708
709
        self::assertEquals(
710
            'SELECT a.id ' .
711
            'FROM table_a a ' .
712
            'INNER JOIN table_b b ON a.fk_b = b.id ' .
713
            'INNER JOIN table_d d ON a.fk_d = d.id ' .
714
            'INNER JOIN table_c c ON c.fk_b = b.id AND b.language = ? ' .
715
            'INNER JOIN table_e e ON e.fk_c = c.id AND e.fk_d = d.id',
716
            (string) $qb
717
        );
718
    }
719
720
    /**
721
     * @group DBAL-774
722
     */
723
    public function testSelectWithMultipleFromsAndJoinsWithMultipleOnConditionsParseOrder()
724
    {
725
        $qb = new QueryBuilder($this->conn);
726
727
        $qb->select('a.id')
728
            ->from('table_a', 'a')
729
            ->from('table_f', 'f')
730
            ->join('a', 'table_b', 'b', 'a.fk_b = b.id')
731
            ->join('b', 'table_c', 'c', 'c.fk_b = b.id AND b.language = ?')
732
            ->join('a', 'table_d', 'd', 'a.fk_d = d.id')
733
            ->join('c', 'table_e', 'e', 'e.fk_c = c.id AND e.fk_d = d.id')
734
            ->join('f', 'table_g', 'g', 'f.fk_g = g.id');
735
736
        self::assertEquals(
737
            'SELECT a.id ' .
738
            'FROM table_a a ' .
739
            'INNER JOIN table_b b ON a.fk_b = b.id ' .
740
            'INNER JOIN table_d d ON a.fk_d = d.id ' .
741
            'INNER JOIN table_c c ON c.fk_b = b.id AND b.language = ? ' .
742
            'INNER JOIN table_e e ON e.fk_c = c.id AND e.fk_d = d.id, ' .
743
            'table_f f ' .
744
            'INNER JOIN table_g g ON f.fk_g = g.id',
745
            (string) $qb
746
        );
747
    }
748
749
    public function testClone()
750
    {
751
        $qb = new QueryBuilder($this->conn);
752
753
        $qb->select('u.id')
754
            ->from('users', 'u')
755
            ->where('u.id = :test');
756
757
        $qb->setParameter(':test', (object) 1);
758
759
        $qb_clone = clone $qb;
760
761
        self::assertEquals((string) $qb, (string) $qb_clone);
762
763
        $qb->andWhere('u.id = 1');
764
765
        self::assertNotSame($qb->getQueryParts(), $qb_clone->getQueryParts());
766
        self::assertNotSame($qb->getParameters(), $qb_clone->getParameters());
767
    }
768
769
    public function testSimpleSelectWithoutTableAlias()
770
    {
771
        $qb = new QueryBuilder($this->conn);
772
773
        $qb->select('id')
774
            ->from('users');
775
776
        self::assertEquals('SELECT id FROM users', (string) $qb);
777
    }
778
779
    public function testSelectWithSimpleWhereWithoutTableAlias()
780
    {
781
        $qb = new QueryBuilder($this->conn);
782
783
        $qb->select('id', 'name')
784
            ->from('users')
785
            ->where('awesome=9001');
786
787
        self::assertEquals("SELECT id, name FROM users WHERE awesome=9001", (string) $qb);
788
    }
789
790
    public function testComplexSelectWithoutTableAliases()
791
    {
792
        $qb = new QueryBuilder($this->conn);
793
794
        $qb->select('DISTINCT users.id')
795
            ->from('users')
796
            ->from('articles')
797
            ->innerJoin('users', 'permissions', 'p', 'p.user_id = users.id')
798
            ->innerJoin('articles', 'comments', 'c', 'c.article_id = articles.id')
799
            ->where('users.id = articles.user_id')
800
            ->andWhere('p.read = 1');
801
802
        self::assertEquals('SELECT DISTINCT users.id FROM users INNER JOIN permissions p ON p.user_id = users.id, articles INNER JOIN comments c ON c.article_id = articles.id WHERE (users.id = articles.user_id) AND (p.read = 1)', $qb->getSQL());
803
    }
804
805
    public function testComplexSelectWithSomeTableAliases()
806
    {
807
        $qb = new QueryBuilder($this->conn);
808
809
        $qb->select('u.id')
810
            ->from('users', 'u')
811
            ->from('articles')
812
            ->innerJoin('u', 'permissions', 'p', 'p.user_id = u.id')
813
            ->innerJoin('articles', 'comments', 'c', 'c.article_id = articles.id');
814
815
        self::assertEquals('SELECT u.id FROM users u INNER JOIN permissions p ON p.user_id = u.id, articles INNER JOIN comments c ON c.article_id = articles.id', $qb->getSQL());
816
    }
817
818
    public function testSelectAllFromTableWithoutTableAlias()
819
    {
820
        $qb = new QueryBuilder($this->conn);
821
822
        $qb->select('users.*')
823
            ->from('users');
824
825
        self::assertEquals("SELECT users.* FROM users", (string) $qb);
826
    }
827
828
    public function testSelectAllWithoutTableAlias()
829
    {
830
        $qb = new QueryBuilder($this->conn);
831
832
        $qb->select('*')
833
            ->from('users');
834
835
        self::assertEquals("SELECT * FROM users", (string) $qb);
836
    }
837
838
    /**
839
     * @group DBAL-959
840
     */
841
    public function testGetParameterType()
842
    {
843
        $qb = new QueryBuilder($this->conn);
844
845
        $qb->select('*')->from('users');
846
847
        self::assertNull($qb->getParameterType('name'));
848
849
        $qb->where('name = :name');
850
        $qb->setParameter('name', 'foo');
851
852
        self::assertNull($qb->getParameterType('name'));
853
854
        $qb->setParameter('name', 'foo', ParameterType::STRING);
855
856
        self::assertSame(ParameterType::STRING, $qb->getParameterType('name'));
857
    }
858
859
    /**
860
     * @group DBAL-959
861
     */
862
    public function testGetParameterTypes()
863
    {
864
        $qb = new QueryBuilder($this->conn);
865
866
        $qb->select('*')->from('users');
867
868
        self::assertSame(array(), $qb->getParameterTypes());
869
870
        $qb->where('name = :name');
871
        $qb->setParameter('name', 'foo');
872
873
        self::assertSame(array(), $qb->getParameterTypes());
874
875
        $qb->setParameter('name', 'foo', ParameterType::STRING);
876
877
        $qb->where('is_active = :isActive');
878
        $qb->setParameter('isActive', true, ParameterType::BOOLEAN);
879
880
        self::assertSame([
881
            'name'     => ParameterType::STRING,
882
            'isActive' => ParameterType::BOOLEAN,
883
        ], $qb->getParameterTypes());
884
    }
885
886
    /**
887
     * @group DBAL-1137
888
     */
889
    public function testJoinWithNonUniqueAliasThrowsException()
890
    {
891
        $qb = new QueryBuilder($this->conn);
892
893
        $qb->select('a.id')
894
            ->from('table_a', 'a')
895
            ->join('a', 'table_b', 'a', 'a.fk_b = a.id');
896
897
        $this->expectException(
898
            'Doctrine\DBAL\Query\QueryException',
899
            "The given alias 'a' is not unique in FROM and JOIN clause table. The currently registered aliases are: a."
900
        );
901
902
        $qb->getSQL();
903
    }
904
}
905