QueryBuilderTest.php 14.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<?php
/*
 *  $Id$
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals
 * and is licensed under the LGPL. For more information, see
 * <http://www.doctrine-project.org>.
 */

namespace Doctrine\Tests\ORM;

24 25
use Doctrine\ORM\QueryBuilder,
    Doctrine\ORM\Query\Expr;
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

require_once __DIR__ . '/../TestInit.php';

/**
 * Test case for the QueryBuilder class used to build DQL query string in a
 * object oriented way.
 *
 * @author      Jonathan H. Wage <jonwage@gmail.com>
 * @author      Roman Borschel <roman@code-factory.org
 * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @link        http://www.phpdoctrine.org
 * @since       2.0
 * @version     $Revision$
 */
class QueryBuilderTest extends \Doctrine\Tests\OrmTestCase
{
    private $_em;

    protected function setUp()
    {
        $this->_em = $this->_getTestEntityManager();
    }

    protected function assertValidQueryBuilder(QueryBuilder $qb, $expectedDql)
    {
        $dql = $qb->getDql();
        $q = $qb->getQuery();

        $this->assertEquals($expectedDql, $dql);
    }

57
    public function testSelectSetsType()
58
    {
59
        $qb = $this->_em->createQueryBuilder()
60 61
            ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->select('u.id', 'u.username');
62

63
        $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
64 65
    }

66 67
    public function testEmptySelectSetsType()
    {
68
        $qb = $this->_em->createQueryBuilder()
69 70 71 72 73 74
            ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->select();

        $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
    }

75
    public function testDeleteSetsType()
76
    {
77
        $qb = $this->_em->createQueryBuilder()
78 79
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->delete();
80

81
        $this->assertEquals($qb->getType(), QueryBuilder::DELETE);
82 83
    }

84
    public function testUpdateSetsType()
85
    {
86
        $qb = $this->_em->createQueryBuilder()
87 88
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->update();
89

90
        $this->assertEquals($qb->getType(), QueryBuilder::UPDATE);
91 92
    }

93
    public function testSimpleSelect()
94
    {
95
        $qb = $this->_em->createQueryBuilder()
96
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
97
            ->select('u.id', 'u.username');
98

99
        $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u');
100 101
    }

102
    public function testSimpleDelete()
103
    {
104
        $qb = $this->_em->createQueryBuilder()
105
            ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u');
106

107
        $this->assertValidQueryBuilder($qb, 'DELETE Doctrine\Tests\Models\CMS\CmsUser u');
108 109
    }

110
    public function testSimpleUpdate()
111
    {
112
        $qb = $this->_em->createQueryBuilder()
113 114
            ->update('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->set('u.username', ':username');
115

116
        $this->assertValidQueryBuilder($qb, 'UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.username = :username');
117 118
    }

119
    public function testInnerJoin()
120
    {
121
        $qb = $this->_em->createQueryBuilder()
122
            ->select('u', 'a')
123
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
124
            ->innerJoin('u.articles', 'a');
125

126
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a');
127
    }
128 129 130 131 132 133 134 135 136 137 138 139 140
    
    public function testComplexInnerJoin()
    {
        $qb = $this->_em->createQueryBuilder()
            ->select('u', 'a')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id');

        $this->assertValidQueryBuilder(
            $qb, 
            'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a ON u.id = a.author_id'
        );
    }
141

142
    public function testLeftJoin()
143
    {
144
        $qb = $this->_em->createQueryBuilder()
145
            ->select('u', 'a')
146
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
147
            ->leftJoin('u.articles', 'a');
148

149
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a');
150 151
    }

152
    public function testWhere()
153
    {
154
        $qb = $this->_em->createQueryBuilder()
155 156
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
157
            ->where('u.id = :uid');
158

159
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid');
160 161 162 163
    }

    public function testAndWhere()
    {
164
        $qb = $this->_em->createQueryBuilder()
165 166 167 168 169 170 171 172 173 174
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->where('u.id = :uid')
            ->andWhere('u.id = :uid2');

        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) AND (u.id = :uid2)');
    }

    public function testOrWhere()
    {
175
        $qb = $this->_em->createQueryBuilder()
176 177 178 179 180 181 182 183 184 185
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->where('u.id = :uid')
            ->orWhere('u.id = :uid2');

        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) OR (u.id = :uid2)');
    }

    public function testAndWhereIn()
    {
186 187 188 189 190
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->where('u.id = :uid')
           ->andWhere($qb->expr()->in('u.id', array(1, 2, 3)));
191

192
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) AND (u.id IN(1, 2, 3))');
193 194 195 196
    }

    public function testOrWhereIn()
    {
197 198 199 200 201
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->where('u.id = :uid')
           ->orWhere($qb->expr()->in('u.id', array(1, 2, 3)));
202

203
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) OR (u.id IN(1, 2, 3))');
204 205 206 207
    }

    public function testAndWhereNotIn()
    {
208 209 210 211 212
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->where('u.id = :uid')
           ->andWhere($qb->expr()->notIn('u.id', array(1, 2, 3)));
213

214
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) AND (u.id NOT IN(1, 2, 3))');
215 216 217 218
    }

    public function testOrWhereNotIn()
    {
219 220 221 222 223
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->where('u.id = :uid')
           ->orWhere($qb->expr()->notIn('u.id', array(1, 2, 3)));
224

225
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) OR (u.id NOT IN(1, 2, 3))');
226 227
    }

228
    public function testGroupBy()
229
    {
230
        $qb = $this->_em->createQueryBuilder()
231 232
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
233 234
            ->groupBy('u.id')
            ->addGroupBy('u.username');
235

236
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id, u.username');
237 238
    }

239
    public function testHaving()
240
    {
241
        $qb = $this->_em->createQueryBuilder()
242 243
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
244 245
            ->groupBy('u.id')
            ->having('COUNT(u.id) > 1');
246

247
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING COUNT(u.id) > 1');
248 249
    }

250
    public function testAndHaving()
251
    {
252
        $qb = $this->_em->createQueryBuilder()
253 254
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
255 256 257
            ->groupBy('u.id')
            ->having('COUNT(u.id) > 1')
            ->andHaving('COUNT(u.id) < 1');
258

259
        $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)');
260 261
    }

262
    public function testOrHaving()
263
    {
264
        $qb = $this->_em->createQueryBuilder()
265 266
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
267 268 269 270
            ->groupBy('u.id')
            ->having('COUNT(u.id) > 1')
            ->andHaving('COUNT(u.id) < 1')
            ->orHaving('COUNT(u.id) > 1');
271

272
        $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)');
273 274
    }

275
    public function testOrderBy()
276
    {
277
        $qb = $this->_em->createQueryBuilder()
278 279
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
280
            ->orderBy('u.username', 'ASC');
281

282
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC');
283 284
    }

285
    public function testAddOrderBy()
286
    {
287
        $qb = $this->_em->createQueryBuilder()
288 289
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
290 291
            ->orderBy('u.username', 'ASC')
            ->addOrderBy('u.username', 'DESC');
292

293
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC, u.username DESC');
294 295
    }

296
    public function testGetQuery()
297
    {
298
        $qb = $this->_em->createQueryBuilder()
299
            ->select('u')
300 301
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
        $q = $qb->getQuery();
302

303
        $this->assertEquals('Doctrine\ORM\Query', get_class($q));
304 305
    }

306
    public function testSetParameter()
307
    {
308
        $qb = $this->_em->createQueryBuilder()
309 310
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
311 312
            ->where('u.id = :id')
            ->setParameter('id', 1);
313

314
        $this->assertEquals(array('id' => 1), $qb->getParameters());
315 316
    }

317
    public function testSetParameters()
318
    {
319 320 321 322
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->where($qb->expr()->orx('u.username = :username', 'u.username = :username2'));
323

324
        $qb->setParameters(array('username' => 'jwage', 'username2' => 'jonwage'));
325

326
        $this->assertEquals(array('username' => 'jwage', 'username2' => 'jonwage'), $qb->getQuery()->getParameters());
327 328
    }

329 330 331

    public function testGetParameters()
    {
332 333 334 335
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->where('u.id = :id');
336 337 338 339 340 341 342

        $qb->setParameters(array('id' => 1));
        $this->assertEquals(array('id' => 1, 'test' => 1), $qb->getParameters(array('test' => 1)));
    }

    public function testGetParameter()
    {
343
        $qb = $this->_em->createQueryBuilder()
344 345 346 347 348 349 350 351
            ->select('u')
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->where('u.id = :id');

        $qb->setParameters(array('id' => 1));
        $this->assertEquals(1, $qb->getParameter('id'));
    }

352
    public function testMultipleWhere()
353
    {
354
        $qb = $this->_em->createQueryBuilder()
355
            ->select('u')
356 357
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->where('u.id = :uid', 'u.id = :uid2');
358

359
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) AND (u.id = :uid2)');
360 361
    }

362
    public function testMultipleAndWhere()
363
    {
364
        $qb = $this->_em->createQueryBuilder()
365
            ->select('u')
366 367 368 369 370 371 372 373
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
            ->andWhere('u.id = :uid', 'u.id = :uid2');

        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) AND (u.id = :uid2)');
    }

    public function testMultipleOrWhere()
    {
374 375 376 377
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->orWhere('u.id = :uid', $qb->expr()->eq('u.id', ':uid2'));
378 379 380 381 382 383

        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid) OR (u.id = :uid2)');
    }

    public function testComplexWhere()
    {
384 385 386 387
        $qb = $this->_em->createQueryBuilder();
        $orExpr = $qb->expr()->orx();
        $orExpr->add($qb->expr()->eq('u.id', ':uid3'));
        $orExpr->add($qb->expr()->in('u.id', array(1)));
388

389 390 391
        $qb->select('u')
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
           ->where($orExpr);
392

393
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid3) OR (u.id IN(1))');
394 395
    }

396 397
    public function testGetEntityManager()
    {
398
        $qb = $this->_em->createQueryBuilder();
399 400 401 402 403
        $this->assertEquals($this->_em, $qb->getEntityManager());
    }

    public function testInitialStateIsClean()
    {
404
        $qb = $this->_em->createQueryBuilder();
405 406 407 408
        $this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
    }

    public function testAlteringQueryChangesStateToDirty()
409
    {
410
        $qb = $this->_em->createQueryBuilder()
411
            ->select('u')
412
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
413

414
        $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
415 416
    }
}