3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15 * This software consists of voluntary contributions made by many individuals
16 * and is licensed under the LGPL. For more information, see
17 * <http://www.doctrine-project.org>.
20 namespace Doctrine\Tests\ORM;
22 use Doctrine\Common\Collections\ArrayCollection;
24 use Doctrine\ORM\QueryBuilder,
25 Doctrine\ORM\Query\Expr,
26 Doctrine\ORM\Query\Parameter,
27 Doctrine\ORM\Query\ParameterTypeInferer;
29 require_once __DIR__ . '/../TestInit.php';
32 * Test case for the QueryBuilder class used to build DQL query string in a
33 * object oriented way.
35 * @author Jonathan H. Wage <jonwage@gmail.com>
36 * @author Roman Borschel <roman@code-factory.org
39 class QueryBuilderTest extends \Doctrine\Tests\OrmTestCase
43 protected function setUp()
45 $this->_em = $this->_getTestEntityManager();
48 protected function assertValidQueryBuilder(QueryBuilder $qb, $expectedDql)
53 $this->assertEquals($expectedDql, $dql);
56 public function testSelectSetsType()
58 $qb = $this->_em->createQueryBuilder()
59 ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u')
60 ->select('u.id', 'u.username');
62 $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
65 public function testEmptySelectSetsType()
67 $qb = $this->_em->createQueryBuilder()
68 ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u')
71 $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
74 public function testDeleteSetsType()
76 $qb = $this->_em->createQueryBuilder()
77 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
80 $this->assertEquals($qb->getType(), QueryBuilder::DELETE);
83 public function testUpdateSetsType()
85 $qb = $this->_em->createQueryBuilder()
86 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
89 $this->assertEquals($qb->getType(), QueryBuilder::UPDATE);
92 public function testSimpleSelect()
94 $qb = $this->_em->createQueryBuilder()
95 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
96 ->select('u.id', 'u.username');
98 $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u');
101 public function testSimpleDelete()
103 $qb = $this->_em->createQueryBuilder()
104 ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u');
106 $this->assertValidQueryBuilder($qb, 'DELETE Doctrine\Tests\Models\CMS\CmsUser u');
109 public function testSimpleUpdate()
111 $qb = $this->_em->createQueryBuilder()
112 ->update('Doctrine\Tests\Models\CMS\CmsUser', 'u')
113 ->set('u.username', ':username');
115 $this->assertValidQueryBuilder($qb, 'UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.username = :username');
118 public function testInnerJoin()
120 $qb = $this->_em->createQueryBuilder()
122 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
123 ->innerJoin('u.articles', 'a');
125 $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a');
128 public function testComplexInnerJoin()
130 $qb = $this->_em->createQueryBuilder()
132 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
133 ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id');
135 $this->assertValidQueryBuilder(
137 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a ON u.id = a.author_id'
141 public function testLeftJoin()
143 $qb = $this->_em->createQueryBuilder()
145 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
146 ->leftJoin('u.articles', 'a');
148 $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a');
151 public function testLeftJoinWithIndexBy()
153 $qb = $this->_em->createQueryBuilder()
155 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
156 ->leftJoin('u.articles', 'a', null, null, 'a.name');
158 $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a INDEX BY a.name');
161 public function testMultipleFrom()
163 $qb = $this->_em->createQueryBuilder()
165 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
166 ->from('Doctrine\Tests\Models\CMS\CmsGroup', 'g');
168 $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsGroup g');
171 public function testMultipleFromWithJoin()
173 $qb = $this->_em->createQueryBuilder()
175 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
176 ->from('Doctrine\Tests\Models\CMS\CmsGroup', 'g')
177 ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id');
179 $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');
182 public function testMultipleFromWithMultipleJoin()
184 $qb = $this->_em->createQueryBuilder()
186 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
187 ->from('Doctrine\Tests\Models\CMS\CmsArticle', 'a')
188 ->innerJoin('u.groups', 'g')
189 ->leftJoin('u.address', 'ad')
190 ->innerJoin('a.comments', 'c');
192 $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');
195 public function testWhere()
197 $qb = $this->_em->createQueryBuilder()
199 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
200 ->where('u.id = :uid');
202 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid');
205 public function testComplexAndWhere()
207 $qb = $this->_em->createQueryBuilder()
209 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
210 ->where('u.id = :uid OR u.id = :uid2 OR u.id = :uid3')
211 ->andWhere('u.name = :name');
213 $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');
216 public function testAndWhere()
218 $qb = $this->_em->createQueryBuilder()
220 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
221 ->where('u.id = :uid')
222 ->andWhere('u.id = :uid2');
224 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
227 public function testOrWhere()
229 $qb = $this->_em->createQueryBuilder()
231 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
232 ->where('u.id = :uid')
233 ->orWhere('u.id = :uid2');
235 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id = :uid2');
238 public function testComplexAndWhereOrWhereNesting()
240 $qb = $this->_em->createQueryBuilder();
242 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
243 ->where('u.id = :uid')
244 ->orWhere('u.id = :uid2')
245 ->andWhere('u.id = :uid3')
246 ->orWhere('u.name = :name1', 'u.name = :name2')
247 ->andWhere('u.name <> :noname');
249 $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');
252 public function testAndWhereIn()
254 $qb = $this->_em->createQueryBuilder();
256 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
257 ->where('u.id = :uid')
258 ->andWhere($qb->expr()->in('u.id', array(1, 2, 3)));
260 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id IN(1, 2, 3)');
263 public function testOrWhereIn()
265 $qb = $this->_em->createQueryBuilder();
267 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
268 ->where('u.id = :uid')
269 ->orWhere($qb->expr()->in('u.id', array(1, 2, 3)));
271 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id IN(1, 2, 3)');
274 public function testAndWhereNotIn()
276 $qb = $this->_em->createQueryBuilder();
278 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
279 ->where('u.id = :uid')
280 ->andWhere($qb->expr()->notIn('u.id', array(1, 2, 3)));
282 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id NOT IN(1, 2, 3)');
285 public function testOrWhereNotIn()
287 $qb = $this->_em->createQueryBuilder();
289 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
290 ->where('u.id = :uid')
291 ->orWhere($qb->expr()->notIn('u.id', array(1, 2, 3)));
293 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id NOT IN(1, 2, 3)');
296 public function testGroupBy()
298 $qb = $this->_em->createQueryBuilder()
300 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
302 ->addGroupBy('u.username');
304 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id, u.username');
307 public function testHaving()
309 $qb = $this->_em->createQueryBuilder()
311 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
313 ->having('COUNT(u.id) > 1');
315 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING COUNT(u.id) > 1');
318 public function testAndHaving()
320 $qb = $this->_em->createQueryBuilder()
322 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
324 ->having('COUNT(u.id) > 1')
325 ->andHaving('COUNT(u.id) < 1');
327 $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');
330 public function testOrHaving()
332 $qb = $this->_em->createQueryBuilder()
334 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
336 ->having('COUNT(u.id) > 1')
337 ->andHaving('COUNT(u.id) < 1')
338 ->orHaving('COUNT(u.id) > 1');
340 $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');
343 public function testOrderBy()
345 $qb = $this->_em->createQueryBuilder()
347 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
348 ->orderBy('u.username', 'ASC');
350 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC');
353 public function testOrderByWithExpression()
355 $qb = $this->_em->createQueryBuilder();
357 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
358 ->orderBy($qb->expr()->asc('u.username'));
360 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC');
363 public function testAddOrderBy()
365 $qb = $this->_em->createQueryBuilder()
367 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
368 ->orderBy('u.username', 'ASC')
369 ->addOrderBy('u.username', 'DESC');
371 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC, u.username DESC');
374 public function testGetQuery()
376 $qb = $this->_em->createQueryBuilder()
378 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
379 $q = $qb->getQuery();
381 $this->assertEquals('Doctrine\ORM\Query', get_class($q));
384 public function testSetParameter()
386 $qb = $this->_em->createQueryBuilder()
388 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
389 ->where('u.id = :id')
390 ->setParameter('id', 1);
392 $parameter = new Parameter('id', 1, ParameterTypeInferer::inferType(1));
394 $this->assertEquals($parameter, $qb->getParameter('id'));
397 public function testSetParameters()
399 $qb = $this->_em->createQueryBuilder();
401 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
402 ->where($qb->expr()->orx('u.username = :username', 'u.username = :username2'));
404 $parameters = new ArrayCollection();
405 $parameters->add(new Parameter('username', 'jwage'));
406 $parameters->add(new Parameter('username2', 'jonwage'));
408 $qb->setParameters($parameters);
410 $this->assertEquals($parameters, $qb->getQuery()->getParameters());
414 public function testGetParameters()
416 $qb = $this->_em->createQueryBuilder();
418 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
419 ->where('u.id = :id');
421 $parameters = new ArrayCollection();
422 $parameters->add(new Parameter('id', 1));
424 $qb->setParameters($parameters);
426 $this->assertEquals($parameters, $qb->getParameters());
429 public function testGetParameter()
431 $qb = $this->_em->createQueryBuilder()
433 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
434 ->where('u.id = :id');
436 $parameters = new ArrayCollection();
437 $parameters->add(new Parameter('id', 1));
439 $qb->setParameters($parameters);
441 $this->assertEquals($parameters->first(), $qb->getParameter('id'));
444 public function testMultipleWhere()
446 $qb = $this->_em->createQueryBuilder()
448 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
449 ->where('u.id = :uid', 'u.id = :uid2');
451 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
454 public function testMultipleAndWhere()
456 $qb = $this->_em->createQueryBuilder()
458 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
459 ->andWhere('u.id = :uid', 'u.id = :uid2');
461 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
464 public function testMultipleOrWhere()
466 $qb = $this->_em->createQueryBuilder();
468 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
469 ->orWhere('u.id = :uid', $qb->expr()->eq('u.id', ':uid2'));
471 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id = :uid2');
474 public function testComplexWhere()
476 $qb = $this->_em->createQueryBuilder();
477 $orExpr = $qb->expr()->orX();
478 $orExpr->add($qb->expr()->eq('u.id', ':uid3'));
479 $orExpr->add($qb->expr()->in('u.id', array(1)));
482 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
485 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid3 OR u.id IN(1)');
488 public function testWhereInWithStringLiterals()
490 $qb = $this->_em->createQueryBuilder();
492 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
493 ->where($qb->expr()->in('u.name', array('one', 'two', 'three')));
495 $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('one', 'two', 'three')");
497 $qb->where($qb->expr()->in('u.name', array("O'Reilly", "O'Neil", 'Smith')));
499 $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('O''Reilly', 'O''Neil', 'Smith')");
502 public function testWhereInWithObjectLiterals()
504 $qb = $this->_em->createQueryBuilder();
505 $expr = $this->_em->getExpressionBuilder();
507 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
508 ->where($expr->in('u.name', array($expr->literal('one'), $expr->literal('two'), $expr->literal('three'))));
510 $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('one', 'two', 'three')");
512 $qb->where($expr->in('u.name', array($expr->literal("O'Reilly"), $expr->literal("O'Neil"), $expr->literal('Smith'))));
514 $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('O''Reilly', 'O''Neil', 'Smith')");
517 public function testNegation()
519 $expr = $this->_em->getExpressionBuilder();
520 $orExpr = $expr->orX();
521 $orExpr->add($expr->eq('u.id', ':uid3'));
522 $orExpr->add($expr->not($expr->in('u.id', array(1))));
524 $qb = $this->_em->createQueryBuilder();
526 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
529 $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid3 OR NOT(u.id IN(1))');
532 public function testSomeAllAny()
534 $qb = $this->_em->createQueryBuilder();
535 $expr = $this->_em->getExpressionBuilder();
537 //$subquery = $qb->subquery('Doctrine\Tests\Models\CMS\CmsArticle', 'a')->select('a.id');
540 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
541 ->where($expr->gt('u.id', $expr->all('select a.id from Doctrine\Tests\Models\CMS\CmsArticle a')));
543 $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)');
547 public function testMultipleIsolatedQueryConstruction()
549 $qb = $this->_em->createQueryBuilder();
550 $expr = $this->_em->getExpressionBuilder();
552 $qb->select('u')->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
553 $qb->where($expr->eq('u.name', ':name'));
554 $qb->setParameter('name', 'romanb');
556 $q1 = $qb->getQuery();
558 $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :name', $q1->getDql());
559 $this->assertEquals(1, count($q1->getParameters()));
561 // add another condition and construct a second query
562 $qb->andWhere($expr->eq('u.id', ':id'));
563 $qb->setParameter('id', 42);
565 $q2 = $qb->getQuery();
567 $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :name AND u.id = :id', $q2->getDql());
568 $this->assertTrue($q1 !== $q2); // two different, independent queries
569 $this->assertEquals(2, count($q2->getParameters()));
570 $this->assertEquals(1, count($q1->getParameters())); // $q1 unaffected
573 public function testGetEntityManager()
575 $qb = $this->_em->createQueryBuilder();
576 $this->assertEquals($this->_em, $qb->getEntityManager());
579 public function testInitialStateIsClean()
581 $qb = $this->_em->createQueryBuilder();
582 $this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
585 public function testAlteringQueryChangesStateToDirty()
587 $qb = $this->_em->createQueryBuilder()
589 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
591 $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
594 public function testSelectWithFuncExpression()
596 $qb = $this->_em->createQueryBuilder();
598 $qb->select($expr->count('e.id'));
600 $this->assertValidQueryBuilder($qb, 'SELECT COUNT(e.id)');
603 public function testResetDQLPart()
605 $qb = $this->_em->createQueryBuilder()
607 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
608 ->where('u.username = ?1')->orderBy('u.username');
610 $this->assertEquals('u.username = ?1', (string)$qb->getDQLPart('where'));
611 $this->assertEquals(1, count($qb->getDQLPart('orderBy')));
613 $qb->resetDqlPart('where')->resetDqlPart('orderBy');
615 $this->assertNull($qb->getDQLPart('where'));
616 $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
619 public function testResetDQLParts()
621 $qb = $this->_em->createQueryBuilder()
623 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
624 ->where('u.username = ?1')->orderBy('u.username');
626 $qb->resetDQLParts(array('where', 'orderBy'));
628 $this->assertEquals(1, count($qb->getDQLPart('select')));
629 $this->assertNull($qb->getDQLPart('where'));
630 $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
633 public function testResetAllDQLParts()
635 $qb = $this->_em->createQueryBuilder()
637 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
638 ->where('u.username = ?1')->orderBy('u.username');
640 $qb->resetDQLParts();
642 $this->assertEquals(0, count($qb->getDQLPart('select')));
643 $this->assertNull($qb->getDQLPart('where'));
644 $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
650 public function testDeepClone()
652 $qb = $this->_em->createQueryBuilder()
654 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
655 ->andWhere('u.username = ?1')
656 ->andWhere('u.status = ?2');
658 $expr = $qb->getDQLPart('where');
659 $this->assertEquals(2, $expr->count(), "Modifying the second query should affect the first one.");
662 $qb2->andWhere('u.name = ?3');
664 $this->assertEquals(2, $expr->count(), "Modifying the second query should affect the first one.");
670 public function testParametersAreCloned()
672 $originalQb = new QueryBuilder($this->_em);
674 $originalQb->setParameter('parameter1', 'value1');
676 $copy = clone $originalQb;
677 $copy->setParameter('parameter2', 'value2');
679 $this->assertCount(1, $originalQb->getParameters());
680 $this->assertSame('value1', $copy->getParameter('parameter1')->getValue());
681 $this->assertSame('value2', $copy->getParameter('parameter2')->getValue());
684 public function testGetRootAlias()
686 $qb = $this->_em->createQueryBuilder()
688 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
690 $this->assertEquals('u', $qb->getRootAlias());
693 public function testGetRootAliases()
695 $qb = $this->_em->createQueryBuilder()
697 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
699 $this->assertEquals(array('u'), $qb->getRootAliases());
702 public function testGetRootEntities()
704 $qb = $this->_em->createQueryBuilder()
706 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
708 $this->assertEquals(array('Doctrine\Tests\Models\CMS\CmsUser'), $qb->getRootEntities());
711 public function testGetSeveralRootAliases()
713 $qb = $this->_em->createQueryBuilder()
715 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
716 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u2');
718 $this->assertEquals(array('u', 'u2'), $qb->getRootAliases());
719 $this->assertEquals('u', $qb->getRootAlias());
722 public function testBCAddJoinWithoutRootAlias()
724 $qb = $this->_em->createQueryBuilder()
726 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
727 ->add('join', array('INNER JOIN u.groups g'), true);
729 $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.groups g', $qb->getDQL());
735 public function testEmptyStringLiteral()
737 $expr = $this->_em->getExpressionBuilder();
738 $qb = $this->_em->createQueryBuilder()
740 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
741 ->where($expr->eq('u.username', $expr->literal("")));
743 $this->assertEquals("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = ''", $qb->getDQL());
749 public function testEmptyNumericLiteral()
751 $expr = $this->_em->getExpressionBuilder();
752 $qb = $this->_em->createQueryBuilder()
754 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
755 ->where($expr->eq('u.username', $expr->literal(0)));
757 $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 0', $qb->getDQL());
763 public function testAddFromString()
765 $qb = $this->_em->createQueryBuilder()
767 ->add('from', 'Doctrine\Tests\Models\CMS\CmsUser u');
769 $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL());
775 public function testAddDistinct()
777 $qb = $this->_em->createQueryBuilder()
780 ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
782 $this->assertEquals('SELECT DISTINCT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL());