QueryBuilderTest.php 27.2 KB
Newer Older
1 2 3 4
<?php

namespace Doctrine\Tests\DBAL\Query;

5
use Doctrine\DBAL\ParameterType;
jeroendedauw's avatar
jeroendedauw committed
6 7
use Doctrine\DBAL\Query\Expression\ExpressionBuilder;
use Doctrine\DBAL\Query\QueryBuilder;
8

9 10 11
/**
 * @group DBAL-12
 */
12 13
class QueryBuilderTest extends \Doctrine\Tests\DbalTestCase
{
Gabriel Caruso's avatar
Gabriel Caruso committed
14 15 16
    /**
     * @var \Doctrine\DBAL\Connection
     */
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 26 27 28
        $this->conn->expects($this->any())
                   ->method('getExpressionBuilder')
                   ->will($this->returnValue($expressionBuilder));
    }
29

30 31 32 33 34 35 36 37 38
    /**
     * @group DBAL-2291
     */
    public function testSimpleSelectWithoutFrom()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('some_function()');

39
        self::assertEquals('SELECT some_function()', (string) $qb);
40 41
    }

42 43 44
    public function testSimpleSelect()
    {
        $qb = new QueryBuilder($this->conn);
45

46 47
        $qb->select('u.id')
           ->from('users', 'u');
48

49
        self::assertEquals('SELECT u.id FROM users u', (string) $qb);
50
    }
51

52 53 54
    public function testSelectWithSimpleWhere()
    {
        $qb   = new QueryBuilder($this->conn);
55 56
        $expr = $qb->expr();

57 58 59
        $qb->select('u.id')
           ->from('users', 'u')
           ->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 68
        $expr = $qb->expr();

69 70 71
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->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 77 78
    public function testSelectWithJoin()
    {
        $qb   = new QueryBuilder($this->conn);
79 80
        $expr = $qb->expr();

81 82 83
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->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 89 90
    public function testSelectWithInnerJoin()
    {
        $qb   = new QueryBuilder($this->conn);
91 92
        $expr = $qb->expr();

93 94 95
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->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 101 102 103
    public function testSelectWithRightJoin()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
104

105 106 107
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->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 113 114 115
    public function testSelectWithAndWhereConditions()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
116

117 118 119 120
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->where('u.username = ?')
           ->andWhere('u.name = ?');
121

122
        self::assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) AND (u.name = ?)', (string) $qb);
123
    }
124

125 126 127 128
    public function testSelectWithOrWhereConditions()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
129

130 131 132 133
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->where('u.username = ?')
           ->orWhere('u.name = ?');
134

135
        self::assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb);
136
    }
137

138 139 140 141
    public function testSelectWithOrOrWhereConditions()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
142

143 144 145 146
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->orWhere('u.username = ?')
           ->orWhere('u.name = ?');
147

148
        self::assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb);
149
    }
150

151 152 153 154
    public function testSelectWithAndOrWhereConditions()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
155

156 157 158 159 160 161
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->where('u.username = ?')
           ->andWhere('u.username = ?')
           ->orWhere('u.name = ?')
           ->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 167 168 169
    public function testSelectGroupBy()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
170

171 172 173
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id');
174

175
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id', (string) $qb);
176
    }
177

178 179 180 181
    public function testSelectEmptyGroupBy()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
182

183 184 185
        $qb->select('u.*', 'p.*')
           ->groupBy(array())
           ->from('users', 'u');
186

187
        self::assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
188
    }
189

190 191 192 193
    public function testSelectEmptyAddGroupBy()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
194

195 196 197
        $qb->select('u.*', 'p.*')
           ->addGroupBy(array())
           ->from('users', 'u');
198

199
        self::assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
200
    }
201

202 203 204 205
    public function testSelectAddGroupBy()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
206

207 208 209 210
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->addGroupBy('u.foo');
211

212
        self::assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo', (string) $qb);
213
    }
214

215 216 217 218
    public function testSelectAddGroupBys()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
219

220 221 222 223
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->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 229 230 231
    public function testSelectHaving()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
232

233 234 235 236
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->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 242 243 244
    public function testSelectAndHaving()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
245

246 247 248 249
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->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 255 256 257
    public function testSelectHavingAndHaving()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
258

259 260 261 262 263
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->having('u.name = ?')
           ->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 269 270 271
    public function testSelectHavingOrHaving()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
272

273 274 275 276 277
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->having('u.name = ?')
           ->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 283 284 285
    public function testSelectOrHavingOrHaving()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
286

287 288 289 290 291
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->orHaving('u.name = ?')
           ->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 297 298 299
    public function testSelectHavingAndOrHaving()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
300

301 302 303 304 305 306
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->groupBy('u.id')
           ->having('u.name = ?')
           ->orHaving('u.username = ?')
           ->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 312 313 314
    public function testSelectOrderBy()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
315

316 317 318
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->orderBy('u.name');
319

320
        self::assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC', (string) $qb);
321
    }
322

323 324 325 326
    public function testSelectAddOrderBy()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
327

328 329 330 331
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->orderBy('u.name')
           ->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 337 338 339
    public function testSelectAddAddOrderBy()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
340

341 342 343 344
        $qb->select('u.*', 'p.*')
           ->from('users', 'u')
           ->addOrderBy('u.name')
           ->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 350 351 352
    public function testEmptySelect()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb2 = $qb->select();
353

354 355
        self::assertSame($qb, $qb2);
        self::assertEquals(QueryBuilder::SELECT, $qb->getType());
356
    }
357

358 359 360 361
    public function testSelectAddSelect()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
362

363 364 365
        $qb->select('u.*')
           ->addSelect('p.*')
           ->from('users', 'u');
366

367
        self::assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
368
    }
369

370 371 372 373
    public function testEmptyAddSelect()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb2 = $qb->addSelect();
374

375 376
        self::assertSame($qb, $qb2);
        self::assertEquals(QueryBuilder::SELECT, $qb->getType());
377
    }
378

379 380 381 382
    public function testSelectMultipleFrom()
    {
        $qb   = new QueryBuilder($this->conn);
        $expr = $qb->expr();
383

384 385 386 387
        $qb->select('u.*')
           ->addSelect('p.*')
           ->from('users', 'u')
           ->from('phonenumbers', 'p');
388

389
        self::assertEquals('SELECT u.*, p.* FROM users u, phonenumbers p', (string) $qb);
390
    }
391

392 393 394 395 396 397
    public function testUpdate()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->update('users', 'u')
           ->set('u.foo', '?')
           ->set('u.bar', '?');
398

399 400
        self::assertEquals(QueryBuilder::UPDATE, $qb->getType());
        self::assertEquals('UPDATE users u SET u.foo = ?, u.bar = ?', (string) $qb);
401
    }
402

403 404 405 406 407 408
    public function testUpdateWithoutAlias()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->update('users')
           ->set('foo', '?')
           ->set('bar', '?');
409

410
        self::assertEquals('UPDATE users SET foo = ?, bar = ?', (string) $qb);
411
    }
412

413 414 415 416 417 418
    public function testUpdateWhere()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->update('users', 'u')
           ->set('u.foo', '?')
           ->where('u.foo = ?');
419

420
        self::assertEquals('UPDATE users u SET u.foo = ? WHERE u.foo = ?', (string) $qb);
421
    }
422

423 424 425 426
    public function testEmptyUpdate()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb2 = $qb->update();
427

428 429
        self::assertEquals(QueryBuilder::UPDATE, $qb->getType());
        self::assertSame($qb2, $qb);
430
    }
431

432 433 434 435
    public function testDelete()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->delete('users', 'u');
436

437 438
        self::assertEquals(QueryBuilder::DELETE, $qb->getType());
        self::assertEquals('DELETE FROM users u', (string) $qb);
439
    }
440

441 442 443 444
    public function testDeleteWithoutAlias()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->delete('users');
445

446 447
        self::assertEquals(QueryBuilder::DELETE, $qb->getType());
        self::assertEquals('DELETE FROM users', (string) $qb);
448
    }
449

450 451 452 453 454
    public function testDeleteWhere()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->delete('users', 'u')
           ->where('u.foo = ?');
455

456
        self::assertEquals('DELETE FROM users u WHERE u.foo = ?', (string) $qb);
457
    }
458

459 460 461 462
    public function testEmptyDelete()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb2 = $qb->delete();
463

464 465
        self::assertEquals(QueryBuilder::DELETE, $qb->getType());
        self::assertSame($qb2, $qb);
Steve Müller's avatar
Steve Müller committed
466 467 468 469 470 471 472 473 474 475 476 477 478
    }

    public function testInsertValues()
    {
        $qb = new QueryBuilder($this->conn);
        $qb->insert('users')
            ->values(
                array(
                    'foo' => '?',
                    'bar' => '?'
                )
            );

479 480
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
        self::assertEquals('INSERT INTO users (foo, bar) VALUES(?, ?)', (string) $qb);
Steve Müller's avatar
Steve Müller committed
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
    }

    public function testInsertReplaceValues()
    {
        $qb = new QueryBuilder($this->conn);
        $qb->insert('users')
            ->values(
                array(
                    'foo' => '?',
                    'bar' => '?'
                )
            )
            ->values(
                array(
                    'bar' => '?',
                    'foo' => '?'
                )
            );

500 501
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
        self::assertEquals('INSERT INTO users (bar, foo) VALUES(?, ?)', (string) $qb);
Steve Müller's avatar
Steve Müller committed
502 503 504 505 506 507 508 509 510 511
    }

    public function testInsertSetValue()
    {
        $qb = new QueryBuilder($this->conn);
        $qb->insert('users')
            ->setValue('foo', 'bar')
            ->setValue('bar', '?')
            ->setValue('foo', '?');

512 513
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
        self::assertEquals('INSERT INTO users (foo, bar) VALUES(?, ?)', (string) $qb);
Steve Müller's avatar
Steve Müller committed
514 515 516 517 518 519 520 521 522 523 524 525 526
    }

    public function testInsertValuesSetValue()
    {
        $qb = new QueryBuilder($this->conn);
        $qb->insert('users')
            ->values(
                array(
                    'foo' => '?'
                )
            )
            ->setValue('bar', '?');

527 528
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
        self::assertEquals('INSERT INTO users (foo, bar) VALUES(?, ?)', (string) $qb);
Steve Müller's avatar
Steve Müller committed
529 530 531 532 533 534 535
    }

    public function testEmptyInsert()
    {
        $qb = new QueryBuilder($this->conn);
        $qb2 = $qb->insert();

536 537
        self::assertEquals(QueryBuilder::INSERT, $qb->getType());
        self::assertSame($qb2, $qb);
538
    }
539

540 541 542
    public function testGetConnection()
    {
        $qb   = new QueryBuilder($this->conn);
543
        self::assertSame($this->conn, $qb->getConnection());
544
    }
545

546 547 548
    public function testGetState()
    {
        $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 559
        self::assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
        self::assertEquals($sql1, $qb->getSQL());
560
    }
561

562 563 564 565
    public function testSetMaxResults()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->setMaxResults(10);
566

567 568
        self::assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
        self::assertEQuals(10, $qb->getMaxResults());
569
    }
570

571 572 573 574
    public function testSetFirstResult()
    {
        $qb   = new QueryBuilder($this->conn);
        $qb->setFirstResult(10);
575

576 577
        self::assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
        self::assertEQuals(10, $qb->getFirstResult());
578
    }
579

580 581 582
    public function testResetQueryPart()
    {
        $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 592 593
    public function testResetQueryParts()
    {
        $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 603 604
    public function testCreateNamedParameter()
    {
        $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 616 617
    public function testCreateNamedParameterCustomPlaceholder()
    {
        $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 629 630
    public function testCreatePositionalParameter()
    {
        $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 643 644 645 646 647

    /**
     * @group DBAL-172
     */
    public function testReferenceJoinFromJoin()
    {
        $qb = new QueryBuilder($this->conn);

Wim Vandersmissen's avatar
Wim Vandersmissen committed
648 649 650 651 652 653 654
        $qb->select('COUNT(DISTINCT news.id)')
            ->from('cb_newspages', 'news')
            ->innerJoin('news', 'nodeversion', 'nv', 'nv.refId = news.id AND nv.refEntityname=\'News\'')
            ->innerJoin('invalid', 'nodetranslation', 'nt', 'nv.nodetranslation = nt.id')
            ->innerJoin('nt', 'node', 'n', 'nt.node = n.id')
            ->where('nt.lang = :lang AND n.deleted != 1');

Luís Cobucci's avatar
Luís Cobucci committed
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 661 662 663 664 665 666 667 668 669 670 671 672 673

    /**
     * @group DBAL-172
     */
    public function testSelectFromMasterWithWhereOnJoinedTables()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('COUNT(DISTINCT news.id)')
            ->from('newspages', 'news')
            ->innerJoin('news', 'nodeversion', 'nv', "nv.refId = news.id AND nv.refEntityname='Entity\\News'")
            ->innerJoin('nv', 'nodetranslation', 'nt', 'nv.nodetranslation = nt.id')
            ->innerJoin('nt', 'node', 'n', 'nt.node = n.id')
            ->where('nt.lang = ?')
            ->andWhere('n.deleted = 0');

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
    }
Deni's avatar
Deni committed
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691

    /**
     * @group DBAL-442
     */
    public function testSelectWithMultipleFromAndJoins()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('DISTINCT u.id')
            ->from('users', 'u')
            ->from('articles', 'a')
            ->innerJoin('u', 'permissions', 'p', 'p.user_id = u.id')
            ->innerJoin('a', 'comments', 'c', 'c.article_id = a.id')
            ->where('u.id = a.user_id')
            ->andWhere('p.read = 1');

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());
Deni's avatar
Deni committed
693
    }
Paul's avatar
Paul committed
694

Jeroen Thora's avatar
Jeroen Thora committed
695 696 697
    /**
     * @group DBAL-774
     */
698 699 700 701 702 703 704 705 706 707 708
    public function testSelectWithJoinsWithMultipleOnConditionsParseOrder()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('a.id')
            ->from('table_a', 'a')
            ->join('a', 'table_b', 'b', 'a.fk_b = b.id')
            ->join('b', 'table_c', 'c', 'c.fk_b = b.id AND b.language = ?')
            ->join('a', 'table_d', 'd', 'a.fk_d = d.id')
            ->join('c', 'table_e', 'e', 'e.fk_c = c.id AND e.fk_d = d.id');

709
        self::assertEquals(
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735
            'SELECT a.id ' .
            'FROM table_a a ' .
            'INNER JOIN table_b b ON a.fk_b = b.id ' .
            'INNER JOIN table_d d ON a.fk_d = d.id ' .
            'INNER JOIN table_c c ON c.fk_b = b.id AND b.language = ? ' .
            'INNER JOIN table_e e ON e.fk_c = c.id AND e.fk_d = d.id',
            (string) $qb
        );
    }

    /**
     * @group DBAL-774
     */
    public function testSelectWithMultipleFromsAndJoinsWithMultipleOnConditionsParseOrder()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('a.id')
            ->from('table_a', 'a')
            ->from('table_f', 'f')
            ->join('a', 'table_b', 'b', 'a.fk_b = b.id')
            ->join('b', 'table_c', 'c', 'c.fk_b = b.id AND b.language = ?')
            ->join('a', 'table_d', 'd', 'a.fk_d = d.id')
            ->join('c', 'table_e', 'e', 'e.fk_c = c.id AND e.fk_d = d.id')
            ->join('f', 'table_g', 'g', 'f.fk_g = g.id');

736
        self::assertEquals(
737 738 739 740 741 742 743 744 745 746
            'SELECT a.id ' .
            'FROM table_a a ' .
            'INNER JOIN table_b b ON a.fk_b = b.id ' .
            'INNER JOIN table_d d ON a.fk_d = d.id ' .
            'INNER JOIN table_c c ON c.fk_b = b.id AND b.language = ? ' .
            'INNER JOIN table_e e ON e.fk_c = c.id AND e.fk_d = d.id, ' .
            'table_f f ' .
            'INNER JOIN table_g g ON f.fk_g = g.id',
            (string) $qb
        );
747 748
    }

Paul's avatar
Paul committed
749 750 751 752 753 754 755 756 757 758 759 760
    public function testClone()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('u.id')
            ->from('users', 'u')
            ->where('u.id = :test');

        $qb->setParameter(':test', (object) 1);

        $qb_clone = clone $qb;

761
        self::assertEquals((string) $qb, (string) $qb_clone);
Paul's avatar
Paul committed
762 763 764

        $qb->andWhere('u.id = 1');

Gabriel Caruso's avatar
Gabriel Caruso committed
765 766
        self::assertNotSame($qb->getQueryParts(), $qb_clone->getQueryParts());
        self::assertNotSame($qb->getParameters(), $qb_clone->getParameters());
Paul's avatar
Paul committed
767
    }
768 769 770 771 772 773 774 775

    public function testSimpleSelectWithoutTableAlias()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('id')
            ->from('users');

776
        self::assertEquals('SELECT id FROM users', (string) $qb);
777 778 779 780 781 782 783 784 785 786
    }

    public function testSelectWithSimpleWhereWithoutTableAlias()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('id', 'name')
            ->from('users')
            ->where('awesome=9001');

787
        self::assertEquals("SELECT id, name FROM users WHERE awesome=9001", (string) $qb);
788 789 790 791 792 793 794 795 796 797 798 799 800 801
    }

    public function testComplexSelectWithoutTableAliases()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('DISTINCT users.id')
            ->from('users')
            ->from('articles')
            ->innerJoin('users', 'permissions', 'p', 'p.user_id = users.id')
            ->innerJoin('articles', 'comments', 'c', 'c.article_id = articles.id')
            ->where('users.id = articles.user_id')
            ->andWhere('p.read = 1');

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 806 807 808 809 810 811 812 813 814
    }

    public function testComplexSelectWithSomeTableAliases()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('u.id')
            ->from('users', 'u')
            ->from('articles')
            ->innerJoin('u', 'permissions', 'p', 'p.user_id = u.id')
            ->innerJoin('articles', 'comments', 'c', 'c.article_id = articles.id');

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 819 820 821 822 823 824

    public function testSelectAllFromTableWithoutTableAlias()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('users.*')
            ->from('users');

825
        self::assertEquals("SELECT users.* FROM users", (string) $qb);
826 827 828 829 830 831 832 833 834
    }

    public function testSelectAllWithoutTableAlias()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('*')
            ->from('users');

835
        self::assertEquals("SELECT * FROM users", (string) $qb);
836
    }
837 838 839 840 841 842 843 844 845 846

    /**
     * @group DBAL-959
     */
    public function testGetParameterType()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('*')->from('users');

847
        self::assertNull($qb->getParameterType('name'));
848 849 850 851

        $qb->where('name = :name');
        $qb->setParameter('name', 'foo');

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 861 862 863 864 865 866 867
    }

    /**
     * @group DBAL-959
     */
    public function testGetParameterTypes()
    {
        $qb = new QueryBuilder($this->conn);

        $qb->select('*')->from('users');

868
        self::assertSame(array(), $qb->getParameterTypes());
869 870 871 872

        $qb->where('name = :name');
        $qb->setParameter('name', 'foo');

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

Sergei Morozov's avatar
Sergei Morozov committed
880 881 882 883
        self::assertSame([
            'name'     => ParameterType::STRING,
            'isActive' => ParameterType::BOOLEAN,
        ], $qb->getParameterTypes());
884
    }
jarekj's avatar
jarekj committed
885 886

    /**
Steve Müller's avatar
Steve Müller committed
887
     * @group DBAL-1137
jarekj's avatar
jarekj committed
888
     */
889
    public function testJoinWithNonUniqueAliasThrowsException()
jarekj's avatar
jarekj committed
890 891 892
    {
        $qb = new QueryBuilder($this->conn);

Steve Müller's avatar
Steve Müller committed
893
        $qb->select('a.id')
jarekj's avatar
jarekj committed
894
            ->from('table_a', 'a')
Steve Müller's avatar
Steve Müller committed
895
            ->join('a', 'table_b', 'a', 'a.fk_b = a.id');
jarekj's avatar
jarekj committed
896

Luís Cobucci's avatar
Luís Cobucci committed
897
        $this->expectException(
Steve Müller's avatar
Steve Müller committed
898
            'Doctrine\DBAL\Query\QueryException',
Steve Müller's avatar
Steve Müller committed
899
            "The given alias 'a' is not unique in FROM and JOIN clause table. The currently registered aliases are: a."
jarekj's avatar
jarekj committed
900
        );
Steve Müller's avatar
Steve Müller committed
901 902

        $qb->getSQL();
jarekj's avatar
jarekj committed
903
    }
Paul's avatar
Paul committed
904
}