Failed Conditions
Pull Request — master (#6485)
by Alessandro
12:30
created

QueryTest   D

Complexity

Total Complexity 43

Size/Duplication

Total Lines 847
Duplicated Lines 5.67 %

Coupling/Cohesion

Components 1
Dependencies 13

Importance

Changes 0
Metric Value
wmc 43
lcom 1
cbo 13
dl 48
loc 847
rs 4.923
c 0
b 0
f 0

34 Methods

Rating   Name   Duplication   Size   Complexity  
A testInvalidInputParameterThrowsException() 0 8 1
A setUp() 0 6 1
B testSimpleQueries() 0 39 1
B testJoinQueries() 0 32 1
A testUsingZeroBasedQueryParameterShouldWork() 0 16 1
A testTooFewParametersShouldThrowException() 0 8 1
A testSetParameters() 0 19 1
A testSetParametersBackwardsCompatible() 0 13 1
B testIterateResultAsArrayAndParams() 0 41 2
B testIterateResult_IterativelyBuildUpUnitOfWork() 0 39 2
B testIterateResultClearEveryCycle() 0 35 2
A testIterateResult_FetchJoinedCollection_ThrowsException() 0 5 1
A testGetSingleResultThrowsExceptionOnNoResult() 0 5 1
A testGetSingleScalarResultThrowsExceptionOnNoResult() 0 5 1
B testGetSingleScalarResultThrowsExceptionOnNonUniqueResult() 0 27 1
A testSupportsQueriesWithEntityNamespaces() 0 14 2
B testEntityParameters() 0 26 1
B testEnableFetchEagerMode() 0 26 3
A testgetOneOrNullResult() 0 20 1
A testgetOneOrNullResultNoRows() 0 8 1
B testParameterOrder() 0 34 1
B testDqlWithAutoInferOfParameters() 0 30 1
A testQueryBuilderWithStringWhereClauseContainingOrAndConditionalPrimary() 0 13 1
B testQueryWithArrayOfEntitiesAsParameter() 0 31 1
B testQueryWithHiddenAsSelectExpression() 0 29 1
A testSetParameterBindingSingleIdentifierObject() 0 19 1
B testSetCollectionParameterBindingSingleIdentifierObject() 0 46 1
B testUnexpectedResultException() 0 32 3
B testMultipleJoinComponentsUsingInnerJoin() 0 32 1
B testMultipleJoinComponentsUsingLeftJoin() 0 34 1
A testUsingUnknownQueryParameterShouldThrowException() 9 9 1
A testTooManyParametersShouldThrowException() 11 11 1
B testModifiedLimitQuery() 7 36 2
A testgetOneOrNullResultSeveralRows() 21 21 1

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like QueryTest 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. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

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 QueryTest, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace Doctrine\Tests\ORM\Functional;
4
5
use Doctrine\Common\Collections\ArrayCollection;
6
7
use Doctrine\ORM\NonUniqueResultException;
8
use Doctrine\ORM\Proxy\Proxy;
9
use Doctrine\ORM\Query\QueryException;
10
use Doctrine\ORM\UnexpectedResultException;
11
use Doctrine\Tests\Models\CMS\CmsUser,
12
    Doctrine\Tests\Models\CMS\CmsArticle,
13
    Doctrine\Tests\Models\CMS\CmsPhonenumber;
14
use Doctrine\ORM\Mapping\ClassMetadata;
15
use Doctrine\ORM\Query;
16
use Doctrine\ORM\Query\Parameter;
17
use Doctrine\Tests\OrmFunctionalTestCase;
18
19
/**
20
 * Functional Query tests.
21
 *
22
 * @author robo
23
 */
24
class QueryTest extends OrmFunctionalTestCase
25
{
26
    protected function setUp()
27
    {
28
        $this->useModelSet('cms');
29
30
        parent::setUp();
31
    }
32
33
    public function testSimpleQueries()
34
    {
35
        $user = new CmsUser;
36
        $user->name = 'Guilherme';
37
        $user->username = 'gblanco';
38
        $user->status = 'developer';
39
        $this->_em->persist($user);
40
        $this->_em->flush();
41
        $this->_em->clear();
42
43
        $query = $this->_em->createQuery("select u, upper(u.name) from Doctrine\Tests\Models\CMS\CmsUser u where u.username = 'gblanco'");
44
45
        $result = $query->getResult();
46
47
        $this->assertEquals(1, count($result));
48
        $this->assertInstanceOf(CmsUser::class, $result[0][0]);
49
        $this->assertEquals('Guilherme', $result[0][0]->name);
50
        $this->assertEquals('gblanco', $result[0][0]->username);
51
        $this->assertEquals('developer', $result[0][0]->status);
52
        $this->assertEquals('GUILHERME', $result[0][1]);
53
54
        $resultArray = $query->getArrayResult();
55
        $this->assertEquals(1, count($resultArray));
56
        $this->assertTrue(is_array($resultArray[0][0]));
57
        $this->assertEquals('Guilherme', $resultArray[0][0]['name']);
58
        $this->assertEquals('gblanco', $resultArray[0][0]['username']);
59
        $this->assertEquals('developer', $resultArray[0][0]['status']);
60
        $this->assertEquals('GUILHERME', $resultArray[0][1]);
61
62
        $scalarResult = $query->getScalarResult();
63
        $this->assertEquals(1, count($scalarResult));
64
        $this->assertEquals('Guilherme', $scalarResult[0]['u_name']);
65
        $this->assertEquals('gblanco', $scalarResult[0]['u_username']);
66
        $this->assertEquals('developer', $scalarResult[0]['u_status']);
67
        $this->assertEquals('GUILHERME', $scalarResult[0][1]);
68
69
        $query = $this->_em->createQuery("select upper(u.name) from Doctrine\Tests\Models\CMS\CmsUser u where u.username = 'gblanco'");
70
        $this->assertEquals('GUILHERME', $query->getSingleScalarResult());
71
    }
72
73
    public function testJoinQueries()
74
    {
75
        $user = new CmsUser;
76
        $user->name = 'Guilherme';
77
        $user->username = 'gblanco';
78
        $user->status = 'developer';
79
80
        $article1 = new CmsArticle;
81
        $article1->topic = "Doctrine 2";
82
        $article1->text = "This is an introduction to Doctrine 2.";
83
        $user->addArticle($article1);
84
85
        $article2 = new CmsArticle;
86
        $article2->topic = "Symfony 2";
87
        $article2->text = "This is an introduction to Symfony 2.";
88
        $user->addArticle($article2);
89
90
        $this->_em->persist($user);
91
        $this->_em->persist($article1);
92
        $this->_em->persist($article2);
93
94
        $this->_em->flush();
95
        $this->_em->clear();
96
97
        $query = $this->_em->createQuery('select u, a from ' . CmsUser::class . ' u join u.articles a ORDER BY a.topic');
98
        $users = $query->getResult();
99
        $this->assertEquals(1, count($users));
100
        $this->assertInstanceOf(CmsUser::class, $users[0]);
101
        $this->assertEquals(2, count($users[0]->articles));
102
        $this->assertEquals('Doctrine 2', $users[0]->articles[0]->topic);
103
        $this->assertEquals('Symfony 2', $users[0]->articles[1]->topic);
104
    }
105
106
    public function testUsingZeroBasedQueryParameterShouldWork()
107
    {
108
        $user = new CmsUser;
109
        $user->name = 'Jonathan';
110
        $user->username = 'jwage';
111
        $user->status = 'developer';
112
        $this->_em->persist($user);
113
        $this->_em->flush();
114
        $this->_em->clear();
115
116
        $q = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u WHERE u.username = ?0');
117
        $q->setParameter(0, 'jwage');
118
        $user = $q->getSingleResult();
119
120
        $this->assertNotNull($user);
121
    }
122
123 View Code Duplication
    public function testUsingUnknownQueryParameterShouldThrowException()
124
    {
125
        $this->expectException(QueryException::class);
126
        $this->expectExceptionMessage('Invalid parameter: token 2 is not defined in the query.');
127
128
        $q = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u WHERE u.name = ?1');
129
        $q->setParameter(2, 'jwage');
130
        $user = $q->getSingleResult();
0 ignored issues
show
Unused Code introduced by
$user is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
131
    }
132
133 View Code Duplication
    public function testTooManyParametersShouldThrowException()
134
    {
135
        $this->expectException(QueryException::class);
136
        $this->expectExceptionMessage('Too many parameters: the query defines 1 parameters and you bound 2');
137
138
        $q = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u WHERE u.name = ?1');
139
        $q->setParameter(1, 'jwage');
140
        $q->setParameter(2, 'jwage');
141
142
        $user = $q->getSingleResult();
0 ignored issues
show
Unused Code introduced by
$user is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
143
    }
144
145
    public function testTooFewParametersShouldThrowException()
146
    {
147
        $this->expectException(QueryException::class);
148
        $this->expectExceptionMessage('Too few parameters: the query defines 1 parameters but you only bound 0');
149
150
        $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u WHERE u.name = ?1')
151
                  ->getSingleResult();
152
    }
153
154
    public function testInvalidInputParameterThrowsException()
155
    {
156
        $this->expectException(QueryException::class);
157
158
        $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u WHERE u.name = ?')
159
                  ->setParameter(1, 'jwage')
160
                  ->getSingleResult();
161
    }
162
163
    public function testSetParameters()
164
    {
165
        $parameters = new ArrayCollection();
166
        $parameters->add(new Parameter(1, 'jwage'));
167
        $parameters->add(new Parameter(2, 'active'));
168
169
        $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u WHERE u.name = ?1 AND u.status = ?2')
170
                  ->setParameters($parameters)
171
                  ->getResult();
172
173
        $extractValue = function (Parameter $parameter) {
174
            return $parameter->getValue();
175
        };
176
177
        self::assertSame(
178
            $parameters->map($extractValue)->toArray(),
179
            $this->_sqlLoggerStack->queries[$this->_sqlLoggerStack->currentQuery]['params']
180
        );
181
    }
182
183
    public function testSetParametersBackwardsCompatible()
184
    {
185
        $parameters = [1 => 'jwage', 2 => 'active'];
186
187
        $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u WHERE u.name = ?1 AND u.status = ?2')
188
                  ->setParameters($parameters)
189
                  ->getResult();
190
191
        self::assertSame(
192
            array_values($parameters),
193
            $this->_sqlLoggerStack->queries[$this->_sqlLoggerStack->currentQuery]['params']
194
        );
195
    }
196
197
    /**
198
     * @group DDC-1070
199
     */
200
    public function testIterateResultAsArrayAndParams()
201
    {
202
        $article1 = new CmsArticle;
203
        $article1->topic = "Doctrine 2";
204
        $article1->text = "This is an introduction to Doctrine 2.";
205
206
        $article2 = new CmsArticle;
207
        $article2->topic = "Symfony 2";
208
        $article2->text = "This is an introduction to Symfony 2.";
209
210
        $this->_em->persist($article1);
211
        $this->_em->persist($article2);
212
213
        $this->_em->flush();
214
        $this->_em->clear();
215
        $articleId = $article1->id;
216
217
        $query = $this->_em->createQuery('select a from ' . CmsArticle::class . ' a WHERE a.topic = ?1');
218
        $articles = $query->iterate(new ArrayCollection([new Parameter(1, 'Doctrine 2')]), Query::HYDRATE_ARRAY);
219
220
        $found = [];
221
222
        foreach ($articles AS $article) {
223
            $found[] = $article;
224
        }
225
226
        $this->assertEquals(1, count($found));
227
        $this->assertSame(
228
            [
229
                [
230
                    [
231
                        'id'      => $articleId,
232
                        'topic'   => 'Doctrine 2',
233
                        'text'    => 'This is an introduction to Doctrine 2.',
234
                        'version' => 1,
235
                    ],
236
                ],
237
            ],
238
            $found
239
        );
240
    }
241
242
    public function testIterateResult_IterativelyBuildUpUnitOfWork()
243
    {
244
        $article1 = new CmsArticle;
245
        $article1->topic = "Doctrine 2";
246
        $article1->text = "This is an introduction to Doctrine 2.";
247
248
        $article2 = new CmsArticle;
249
        $article2->topic = "Symfony 2";
250
        $article2->text = "This is an introduction to Symfony 2.";
251
252
        $this->_em->persist($article1);
253
        $this->_em->persist($article2);
254
255
        $this->_em->flush();
256
        $this->_em->clear();
257
258
        $query = $this->_em->createQuery('select a from ' . CmsArticle::class . ' a');
259
        $articles = $query->iterate();
260
261
        $iteratedCount = 0;
262
        $topics = [];
263
264
        foreach($articles AS $row) {
265
            $article = $row[0];
266
            $topics[] = $article->topic;
267
268
            $identityMap = $this->_em->getUnitOfWork()->getIdentityMap();
269
            $identityMapCount = count($identityMap[CmsArticle::class]);
270
            $this->assertTrue($identityMapCount>$iteratedCount);
271
272
            $iteratedCount++;
273
        }
274
275
        $this->assertSame(["Doctrine 2", "Symfony 2"], $topics);
276
        $this->assertSame(2, $iteratedCount);
277
278
        $this->_em->flush();
279
        $this->_em->clear();
280
    }
281
282
    public function testIterateResultClearEveryCycle()
283
    {
284
        $article1 = new CmsArticle;
285
        $article1->topic = "Doctrine 2";
286
        $article1->text = "This is an introduction to Doctrine 2.";
287
288
        $article2 = new CmsArticle;
289
        $article2->topic = "Symfony 2";
290
        $article2->text = "This is an introduction to Symfony 2.";
291
292
        $this->_em->persist($article1);
293
        $this->_em->persist($article2);
294
295
        $this->_em->flush();
296
        $this->_em->clear();
297
298
        $query    = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
299
        $articles = $query->iterate();
300
301
        $iteratedCount = 0;
302
        $topics = [];
303
        foreach($articles AS $row) {
304
            $article  = $row[0];
305
            $topics[] = $article->topic;
306
307
            $this->_em->clear();
308
309
            $iteratedCount++;
310
        }
311
312
        $this->assertSame(["Doctrine 2", "Symfony 2"], $topics);
313
        $this->assertSame(2, $iteratedCount);
314
315
        $this->_em->flush();
316
    }
317
318
    /**
319
     * @expectedException \Doctrine\ORM\Query\QueryException
320
     */
321
    public function testIterateResult_FetchJoinedCollection_ThrowsException()
322
    {
323
        $query = $this->_em->createQuery("SELECT u, a FROM ' . CmsUser::class . ' u JOIN u.articles a");
324
        $articles = $query->iterate();
0 ignored issues
show
Unused Code introduced by
$articles is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
325
    }
326
327
    /**
328
     * @expectedException Doctrine\ORM\NoResultException
329
     */
330
    public function testGetSingleResultThrowsExceptionOnNoResult()
331
    {
332
        $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a")
333
             ->getSingleResult();
334
    }
335
336
    /**
337
     * @expectedException Doctrine\ORM\NoResultException
338
     */
339
    public function testGetSingleScalarResultThrowsExceptionOnNoResult()
340
    {
341
        $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a")
342
             ->getSingleScalarResult();
343
    }
344
345
    /**
346
     * @expectedException Doctrine\ORM\NonUniqueResultException
347
     */
348
    public function testGetSingleScalarResultThrowsExceptionOnNonUniqueResult()
349
    {
350
        $user = new CmsUser;
351
        $user->name = 'Guilherme';
352
        $user->username = 'gblanco';
353
        $user->status = 'developer';
354
355
        $article1 = new CmsArticle;
356
        $article1->topic = "Doctrine 2";
357
        $article1->text = "This is an introduction to Doctrine 2.";
358
        $user->addArticle($article1);
359
360
        $article2 = new CmsArticle;
361
        $article2->topic = "Symfony 2";
362
        $article2->text = "This is an introduction to Symfony 2.";
363
        $user->addArticle($article2);
364
365
        $this->_em->persist($user);
366
        $this->_em->persist($article1);
367
        $this->_em->persist($article2);
368
369
        $this->_em->flush();
370
        $this->_em->clear();
371
372
        $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a")
373
             ->getSingleScalarResult();
374
    }
375
376
    public function testModifiedLimitQuery()
377
    {
378 View Code Duplication
        for ($i = 0; $i < 5; $i++) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
379
            $user = new CmsUser;
380
            $user->name = 'Guilherme' . $i;
381
            $user->username = 'gblanco' . $i;
382
            $user->status = 'developer';
383
            $this->_em->persist($user);
384
        }
385
386
        $this->_em->flush();
387
        $this->_em->clear();
388
389
        $data = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u')
390
                  ->setFirstResult(1)
391
                  ->setMaxResults(2)
392
                  ->getResult();
393
394
        $this->assertEquals(2, count($data));
395
        $this->assertEquals('gblanco1', $data[0]->username);
396
        $this->assertEquals('gblanco2', $data[1]->username);
397
398
        $data = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u')
399
                  ->setFirstResult(3)
400
                  ->setMaxResults(2)
401
                  ->getResult();
402
403
        $this->assertEquals(2, count($data));
404
        $this->assertEquals('gblanco3', $data[0]->username);
405
        $this->assertEquals('gblanco4', $data[1]->username);
406
407
        $data = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u')
0 ignored issues
show
Unused Code introduced by
$data is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
408
                  ->setFirstResult(3)
409
                  ->setMaxResults(2)
410
                  ->getScalarResult();
411
    }
412
413
    public function testSupportsQueriesWithEntityNamespaces()
414
    {
415
        $this->_em->getConfiguration()->addEntityNamespace('CMS', 'Doctrine\Tests\Models\CMS');
416
417
        try {
418
            $query = $this->_em->createQuery('UPDATE CMS:CmsUser u SET u.name = ?1');
419
            $this->assertEquals('UPDATE cms_users SET name = ?', $query->getSQL());
420
            $query->free();
421
        } catch (\Exception $e) {
422
            $this->fail($e->getMessage());
423
        }
424
425
        $this->_em->getConfiguration()->setEntityNamespaces([]);
426
    }
427
428
    /**
429
     * @group DDC-604
430
     */
431
    public function testEntityParameters()
432
    {
433
        $article = new CmsArticle;
434
        $article->topic = "dr. dolittle";
435
        $article->text = "Once upon a time ...";
436
        $author = new CmsUser;
437
        $author->name = "anonymous";
438
        $author->username = "anon";
439
        $author->status = "here";
440
        $article->user = $author;
441
        $this->_em->persist($author);
442
        $this->_em->persist($article);
443
        $this->_em->flush();
444
        $this->_em->clear();
445
        //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger);
0 ignored issues
show
Unused Code Comprehensibility introduced by
69% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
446
        $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a where a.topic = :topic and a.user = :user")
447
                ->setParameter("user", $this->_em->getReference(CmsUser::class, $author->id))
448
                ->setParameter("topic", "dr. dolittle");
449
450
        $result = $q->getResult();
451
        $this->assertEquals(1, count($result));
452
        $this->assertInstanceOf(CmsArticle::class, $result[0]);
453
        $this->assertEquals("dr. dolittle", $result[0]->topic);
454
        $this->assertInstanceOf(Proxy::class, $result[0]->user);
455
        $this->assertFalse($result[0]->user->__isInitialized__);
456
    }
457
458
    /**
459
     * @group DDC-952
460
     */
461
    public function testEnableFetchEagerMode()
462
    {
463
        for ($i = 0; $i < 10; $i++) {
464
            $article = new CmsArticle;
465
            $article->topic = "dr. dolittle";
466
            $article->text = "Once upon a time ...";
467
            $author = new CmsUser;
468
            $author->name = "anonymous";
469
            $author->username = "anon".$i;
470
            $author->status = "here";
471
            $article->user = $author;
472
            $this->_em->persist($author);
473
            $this->_em->persist($article);
474
        }
475
        $this->_em->flush();
476
        $this->_em->clear();
477
478
        $articles = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsArticle a')
479
                         ->setFetchMode(CmsArticle::class, 'user', ClassMetadata::FETCH_EAGER)
480
                         ->getResult();
481
482
        $this->assertEquals(10, count($articles));
483
        foreach ($articles AS $article) {
484
            $this->assertNotInstanceOf(Proxy::class, $article);
485
        }
486
    }
487
488
    /**
489
     * @group DDC-991
490
     */
491
    public function testgetOneOrNullResult()
492
    {
493
        $user = new CmsUser;
494
        $user->name = 'Guilherme';
495
        $user->username = 'gblanco';
496
        $user->status = 'developer';
497
        $this->_em->persist($user);
498
        $this->_em->flush();
499
        $this->_em->clear();
500
501
        $query = $this->_em->createQuery("select u from " . CmsUser::class . " u where u.username = 'gblanco'");
502
503
        $fetchedUser = $query->getOneOrNullResult();
504
        $this->assertInstanceOf(CmsUser::class, $fetchedUser);
505
        $this->assertEquals('gblanco', $fetchedUser->username);
506
507
        $query = $this->_em->createQuery("select u.username from " . CmsUser::class . " u where u.username = 'gblanco'");
508
        $fetchedUsername = $query->getOneOrNullResult(Query::HYDRATE_SINGLE_SCALAR);
509
        $this->assertEquals('gblanco', $fetchedUsername);
510
    }
511
512
    /**
513
     * @group DDC-991
514
     */
515 View Code Duplication
    public function testgetOneOrNullResultSeveralRows()
516
    {
517
        $user = new CmsUser;
518
        $user->name = 'Guilherme';
519
        $user->username = 'gblanco';
520
        $user->status = 'developer';
521
        $this->_em->persist($user);
522
        $user = new CmsUser;
523
        $user->name = 'Roman';
524
        $user->username = 'romanb';
525
        $user->status = 'developer';
526
        $this->_em->persist($user);
527
        $this->_em->flush();
528
        $this->_em->clear();
529
530
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u");
531
532
        $this->expectException(NonUniqueResultException::class);
533
534
        $fetchedUser = $query->getOneOrNullResult();
0 ignored issues
show
Unused Code introduced by
$fetchedUser is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
535
    }
536
537
    /**
538
     * @group DDC-991
539
     */
540
    public function testgetOneOrNullResultNoRows()
541
    {
542
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u");
543
        $this->assertNull($query->getOneOrNullResult());
544
545
        $query = $this->_em->createQuery("select u.username from Doctrine\Tests\Models\CMS\CmsUser u where u.username = 'gblanco'");
546
        $this->assertNull($query->getOneOrNullResult(Query::HYDRATE_SCALAR));
547
    }
548
549
    /**
550
     * @group DBAL-171
551
     */
552
    public function testParameterOrder()
553
    {
554
        $user1 = new CmsUser;
555
        $user1->name = 'Benjamin';
556
        $user1->username = 'beberlei';
557
        $user1->status = 'developer';
558
        $this->_em->persist($user1);
559
560
        $user2 = new CmsUser;
561
        $user2->name = 'Roman';
562
        $user2->username = 'romanb';
563
        $user2->status = 'developer';
564
        $this->_em->persist($user2);
565
566
        $user3 = new CmsUser;
567
        $user3->name = 'Jonathan';
568
        $user3->username = 'jwage';
569
        $user3->status = 'developer';
570
        $this->_em->persist($user3);
571
572
        $this->_em->flush();
573
        $this->_em->clear();
574
575
        $query = $this->_em->createQuery("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.status = :a AND u.id IN (:b)");
576
        $query->setParameters(new ArrayCollection(
577
            [
578
            new Parameter('b', [$user1->id, $user2->id, $user3->id]),
579
            new Parameter('a', 'developer')
580
            ]
581
        ));
582
        $result = $query->getResult();
583
584
        $this->assertEquals(3, count($result));
585
    }
586
587
    public function testDqlWithAutoInferOfParameters()
588
    {
589
        $user = new CmsUser;
590
        $user->name = 'Benjamin';
591
        $user->username = 'beberlei';
592
        $user->status = 'developer';
593
        $this->_em->persist($user);
594
595
        $user = new CmsUser;
596
        $user->name = 'Roman';
597
        $user->username = 'romanb';
598
        $user->status = 'developer';
599
        $this->_em->persist($user);
600
601
        $user = new CmsUser;
602
        $user->name = 'Jonathan';
603
        $user->username = 'jwage';
604
        $user->status = 'developer';
605
        $this->_em->persist($user);
606
607
        $this->_em->flush();
608
        $this->_em->clear();
609
610
        $query = $this->_em->createQuery("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username IN (?0)");
611
        $query->setParameter(0, ['beberlei', 'jwage']);
612
613
        $users = $query->execute();
614
615
        $this->assertEquals(2, count($users));
616
    }
617
618
    public function testQueryBuilderWithStringWhereClauseContainingOrAndConditionalPrimary()
619
    {
620
        $qb = $this->_em->createQueryBuilder();
621
        $qb->select('u')
622
           ->from(CmsUser::class, 'u')
623
           ->innerJoin('u.articles', 'a')
624
           ->where('(u.id = 0) OR (u.id IS NULL)');
625
626
        $query = $qb->getQuery();
627
        $users = $query->execute();
628
629
        $this->assertEquals(0, count($users));
630
    }
631
632
    public function testQueryWithArrayOfEntitiesAsParameter()
633
    {
634
        $userA = new CmsUser;
635
        $userA->name = 'Benjamin';
636
        $userA->username = 'beberlei';
637
        $userA->status = 'developer';
638
        $this->_em->persist($userA);
639
640
        $userB = new CmsUser;
641
        $userB->name = 'Roman';
642
        $userB->username = 'romanb';
643
        $userB->status = 'developer';
644
        $this->_em->persist($userB);
645
646
        $userC = new CmsUser;
647
        $userC->name = 'Jonathan';
648
        $userC->username = 'jwage';
649
        $userC->status = 'developer';
650
        $this->_em->persist($userC);
651
652
        $this->_em->flush();
653
        $this->_em->clear();
654
655
        $query = $this->_em->createQuery("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u IN (?0) OR u.username = ?1");
656
        $query->setParameter(0, [$userA, $userC]);
657
        $query->setParameter(1, 'beberlei');
658
659
        $users = $query->execute();
660
661
        $this->assertEquals(2, count($users));
662
    }
663
664
    public function testQueryWithHiddenAsSelectExpression()
665
    {
666
        $userA = new CmsUser;
667
        $userA->name = 'Benjamin';
668
        $userA->username = 'beberlei';
669
        $userA->status = 'developer';
670
        $this->_em->persist($userA);
671
672
        $userB = new CmsUser;
673
        $userB->name = 'Roman';
674
        $userB->username = 'romanb';
675
        $userB->status = 'developer';
676
        $this->_em->persist($userB);
677
678
        $userC = new CmsUser;
679
        $userC->name = 'Jonathan';
680
        $userC->username = 'jwage';
681
        $userC->status = 'developer';
682
        $this->_em->persist($userC);
683
684
        $this->_em->flush();
685
        $this->_em->clear();
686
687
        $query = $this->_em->createQuery("SELECT u, (SELECT COUNT(u2.id) FROM Doctrine\Tests\Models\CMS\CmsUser u2) AS HIDDEN total FROM Doctrine\Tests\Models\CMS\CmsUser u");
688
        $users = $query->execute();
689
690
        $this->assertEquals(3, count($users));
691
        $this->assertInstanceOf(CmsUser::class, $users[0]);
692
    }
693
694
    /**
695
     * @group DDC-1651
696
     */
697
    public function testSetParameterBindingSingleIdentifierObject()
698
    {
699
        $userC = new CmsUser;
700
        $userC->name = 'Jonathan';
701
        $userC->username = 'jwage';
702
        $userC->status = 'developer';
703
        $this->_em->persist($userC);
704
705
        $this->_em->flush();
706
        $this->_em->clear();
707
708
        $q = $this->_em->createQuery("SELECT DISTINCT u from Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1");
709
        $q->setParameter(1, $userC);
710
711
        $this->assertEquals($userC, $q->getParameter(1)->getValue());
712
713
        // Parameter is not converted before, but it should be converted during execution. Test should not fail here
714
        $q->getResult();
715
    }
716
717
    /**
718
     * @group DDC-2319
719
     */
720
    public function testSetCollectionParameterBindingSingleIdentifierObject()
721
    {
722
        $u1 = new CmsUser;
723
        $u1->name = 'Name1';
724
        $u1->username = 'username1';
725
        $u1->status = 'developer';
726
        $this->_em->persist($u1);
727
728
        $u2 = new CmsUser;
729
        $u2->name = 'Name2';
730
        $u2->username = 'username2';
731
        $u2->status = 'tester';
732
        $this->_em->persist($u2);
733
734
        $u3 = new CmsUser;
735
        $u3->name = 'Name3';
736
        $u3->username = 'username3';
737
        $u3->status = 'tester';
738
        $this->_em->persist($u3);
739
740
        $this->_em->flush();
741
        $this->_em->clear();
742
743
        $userCollection = new ArrayCollection();
744
745
        $userCollection->add($u1);
746
        $userCollection->add($u2);
747
        $userCollection->add($u3->getId());
748
749
        $q = $this->_em->createQuery("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u IN (:users) ORDER BY u.id");
750
        $q->setParameter('users', $userCollection);
751
        $users = $q->execute();
752
753
        $this->assertEquals(3, count($users));
754
        $this->assertInstanceOf(CmsUser::class, $users[0]);
755
        $this->assertInstanceOf(CmsUser::class, $users[1]);
756
        $this->assertInstanceOf(CmsUser::class, $users[2]);
757
758
        $resultUser1 = $users[0];
759
        $resultUser2 = $users[1];
760
        $resultUser3 = $users[2];
761
762
        $this->assertEquals($u1->username, $resultUser1->username);
763
        $this->assertEquals($u2->username, $resultUser2->username);
764
        $this->assertEquals($u3->username, $resultUser3->username);
765
    }
766
767
    /**
768
     * @group DDC-1822
769
     */
770
    public function testUnexpectedResultException()
771
    {
772
        $dql            = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
773
        $u1             = new CmsUser;
774
        $u2             = new CmsUser;
775
        $u1->name       = 'Fabio B. Silva';
776
        $u1->username   = 'FabioBatSilva';
777
        $u1->status     = 'developer';
778
        $u2->name       = 'Test';
779
        $u2->username   = 'test';
780
        $u2->status     = 'tester';
781
782
        try {
783
            $this->_em->createQuery($dql)->getSingleResult();
784
            $this->fail('Expected exception "\Doctrine\ORM\NoResultException".');
785
        } catch (UnexpectedResultException $exc) {
786
            $this->assertInstanceOf('\Doctrine\ORM\NoResultException', $exc);
787
        }
788
789
790
        $this->_em->persist($u1);
791
        $this->_em->persist($u2);
792
        $this->_em->flush();
793
        $this->_em->clear();
794
795
        try {
796
            $this->_em->createQuery($dql)->getSingleResult();
797
            $this->fail('Expected exception "\Doctrine\ORM\NonUniqueResultException".');
798
        } catch (UnexpectedResultException $exc) {
799
            $this->assertInstanceOf('\Doctrine\ORM\NonUniqueResultException', $exc);
800
        }
801
    }
802
803
    public function testMultipleJoinComponentsUsingInnerJoin()
804
    {
805
        $userA = new CmsUser;
806
        $userA->name = 'Benjamin';
807
        $userA->username = 'beberlei';
808
        $userA->status = 'developer';
809
810
        $phonenumberA = new CmsPhonenumber;
811
        $phonenumberA->phonenumber = '111111';
812
        $userA->addPhonenumber($phonenumberA);
813
814
        $userB = new CmsUser;
815
        $userB->name = 'Alexander';
816
        $userB->username = 'asm89';
817
        $userB->status = 'developer';
818
819
        $this->_em->persist($userA);
820
        $this->_em->persist($userB);
821
        $this->_em->flush();
822
        $this->_em->clear();
823
824
        $query = $this->_em->createQuery("
825
            SELECT u, p
826
              FROM Doctrine\Tests\Models\CMS\CmsUser u
827
             INNER JOIN Doctrine\Tests\Models\CMS\CmsPhonenumber p WITH u = p.user
828
        ");
829
        $users = $query->execute();
830
831
        $this->assertEquals(2, count($users));
832
        $this->assertInstanceOf(CmsUser::class, $users[0]);
833
        $this->assertInstanceOf(CmsPhonenumber::class, $users[1]);
834
    }
835
836
    public function testMultipleJoinComponentsUsingLeftJoin()
837
    {
838
        $userA = new CmsUser;
839
        $userA->name = 'Benjamin';
840
        $userA->username = 'beberlei';
841
        $userA->status = 'developer';
842
843
        $phonenumberA = new CmsPhonenumber;
844
        $phonenumberA->phonenumber = '111111';
845
        $userA->addPhonenumber($phonenumberA);
846
847
        $userB = new CmsUser;
848
        $userB->name = 'Alexander';
849
        $userB->username = 'asm89';
850
        $userB->status = 'developer';
851
852
        $this->_em->persist($userA);
853
        $this->_em->persist($userB);
854
        $this->_em->flush();
855
        $this->_em->clear();
856
857
        $query = $this->_em->createQuery("
858
            SELECT u, p
859
              FROM Doctrine\Tests\Models\CMS\CmsUser u
860
              LEFT JOIN Doctrine\Tests\Models\CMS\CmsPhonenumber p WITH u = p.user
861
        ");
862
        $users = $query->execute();
863
864
        $this->assertEquals(4, count($users));
865
        $this->assertInstanceOf(CmsUser::class, $users[0]);
866
        $this->assertInstanceOf(CmsPhonenumber::class, $users[1]);
867
        $this->assertInstanceOf(CmsUser::class, $users[2]);
868
        $this->assertNull($users[3]);
869
    }
870
}
871