Failed Conditions
Pull Request — master (#7878)
by
unknown
61:32
created

testAbstractClassInJoinedTableInheritanceSchemaWithRSMBuilderThrowsException()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 8
rs 10
c 1
b 0
f 0
1
<?php
2
3
namespace Doctrine\Tests\ORM\Functional;
4
5
use Doctrine\Common\Collections\ArrayCollection;
6
use Doctrine\ORM\Internal\Hydration\HydrationException;
7
use Doctrine\ORM\PersistentCollection;
8
use Doctrine\ORM\Query\Parameter;
9
use Doctrine\ORM\Query\ResultSetMapping;
10
use Doctrine\ORM\Query\ResultSetMappingBuilder;
11
use Doctrine\Tests\Models\CMS\CmsAddress;
12
use Doctrine\Tests\Models\CMS\CmsEmail;
13
use Doctrine\Tests\Models\CMS\CmsPhonenumber;
14
use Doctrine\Tests\Models\CMS\CmsUser;
15
use Doctrine\Tests\Models\Company\CompanyAuction;
16
use Doctrine\Tests\Models\Company\CompanyContract;
17
use Doctrine\Tests\Models\Company\CompanyEmployee;
18
use Doctrine\Tests\Models\Company\CompanyEvent;
19
use Doctrine\Tests\Models\Company\CompanyFixContract;
20
use Doctrine\Tests\Models\Company\CompanyFlexContract;
21
use Doctrine\Tests\Models\Company\CompanyPerson;
22
use Doctrine\Tests\Models\DDC3899\DDC3899FixContract;
23
use Doctrine\Tests\Models\DDC3899\DDC3899User;
24
use Doctrine\Tests\OrmFunctionalTestCase;
25
26
/**
27
 * NativeQueryTest
28
 *
29
 * @author robo
30
 */
31
class NativeQueryTest extends OrmFunctionalTestCase
32
{
33
    private $platform = null;
34
35
    protected function setUp()
36
    {
37
        $this->useModelSet('cms');
38
        $this->useModelSet('company');
39
        parent::setUp();
40
41
        $this->platform = $this->_em->getConnection()->getDatabasePlatform();
42
    }
43
44
    public function testBasicNativeQuery()
45
    {
46
        $user = new CmsUser;
47
        $user->name = 'Roman';
48
        $user->username = 'romanb';
49
        $user->status = 'dev';
50
        $this->_em->persist($user);
51
        $this->_em->flush();
52
53
        $this->_em->clear();
54
55
        $rsm = new ResultSetMapping;
56
        $rsm->addEntityResult(CmsUser::class, 'u');
57
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
58
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('name'), 'name');
59
60
        $query = $this->_em->createNativeQuery('SELECT id, name FROM cms_users WHERE username = ?', $rsm);
61
        $query->setParameter(1, 'romanb');
62
63
        $users = $query->getResult();
64
65
        $this->assertEquals(1, count($users));
66
        $this->assertInstanceOf(CmsUser::class, $users[0]);
67
        $this->assertEquals('Roman', $users[0]->name);
68
    }
69
70
    public function testBasicNativeQueryWithMetaResult()
71
    {
72
        $user = new CmsUser;
73
        $user->name = 'Roman';
74
        $user->username = 'romanb';
75
        $user->status = 'dev';
76
77
        $addr = new CmsAddress;
78
        $addr->country = 'germany';
79
        $addr->zip = 10827;
80
        $addr->city = 'Berlin';
81
82
83
        $user->setAddress($addr);
84
85
        $this->_em->persist($user);
86
        $this->_em->flush();
87
88
        $this->_em->clear();
89
90
        $rsm = new ResultSetMapping;
91
        $rsm->addEntityResult(CmsAddress::class, 'a');
92
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('id'), 'id');
93
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('country'), 'country');
94
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('zip'), 'zip');
95
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('city'), 'city');
96
        $rsm->addMetaResult('a', $this->platform->getSQLResultCasing('user_id'), 'user_id', false, 'integer');
97
98
        $query = $this->_em->createNativeQuery('SELECT a.id, a.country, a.zip, a.city, a.user_id FROM cms_addresses a WHERE a.id = ?', $rsm);
99
        $query->setParameter(1, $addr->id);
100
101
        $addresses = $query->getResult();
102
103
        $this->assertEquals(1, count($addresses));
104
        $this->assertTrue($addresses[0] instanceof CmsAddress);
105
        $this->assertEquals($addr->country, $addresses[0]->country);
106
        $this->assertEquals($addr->zip, $addresses[0]->zip);
107
        $this->assertEquals($addr->city, $addresses[0]->city);
108
        $this->assertEquals($addr->street, $addresses[0]->street);
109
        $this->assertTrue($addresses[0]->user instanceof CmsUser);
110
    }
111
112
    public function testJoinedOneToManyNativeQuery()
113
    {
114
        $user = new CmsUser;
115
        $user->name = 'Roman';
116
        $user->username = 'romanb';
117
        $user->status = 'dev';
118
119
        $phone = new CmsPhonenumber;
120
        $phone->phonenumber = 424242;
121
122
        $user->addPhonenumber($phone);
123
124
        $this->_em->persist($user);
125
        $this->_em->flush();
126
127
        $this->_em->clear();
128
129
        $rsm = new ResultSetMapping;
130
        $rsm->addEntityResult(CmsUser::class, 'u');
131
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
132
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('name'), 'name');
133
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('status'), 'status');
134
        $rsm->addJoinedEntityResult(CmsPhonenumber::class, 'p', 'u', 'phonenumbers');
135
        $rsm->addFieldResult('p', $this->platform->getSQLResultCasing('phonenumber'), 'phonenumber');
136
137
        $query = $this->_em->createNativeQuery('SELECT id, name, status, phonenumber FROM cms_users INNER JOIN cms_phonenumbers ON id = user_id WHERE username = ?', $rsm);
138
        $query->setParameter(1, 'romanb');
139
140
        $users = $query->getResult();
141
        $this->assertEquals(1, count($users));
142
        $this->assertInstanceOf(CmsUser::class, $users[0]);
143
        $this->assertEquals('Roman', $users[0]->name);
144
        $this->assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
145
        $this->assertTrue($users[0]->getPhonenumbers()->isInitialized());
146
        $this->assertEquals(1, count($users[0]->getPhonenumbers()));
147
        $phones = $users[0]->getPhonenumbers();
148
        $this->assertEquals(424242, $phones[0]->phonenumber);
149
        $this->assertTrue($phones[0]->getUser() === $users[0]);
150
151
    }
152
153
    public function testJoinedOneToOneNativeQuery()
154
    {
155
        $user = new CmsUser;
156
        $user->name = 'Roman';
157
        $user->username = 'romanb';
158
        $user->status = 'dev';
159
160
        $addr = new CmsAddress;
161
        $addr->country = 'germany';
162
        $addr->zip = 10827;
163
        $addr->city = 'Berlin';
164
165
166
        $user->setAddress($addr);
167
168
        $this->_em->persist($user);
169
        $this->_em->flush();
170
171
        $this->_em->clear();
172
173
174
        $rsm = new ResultSetMapping;
175
        $rsm->addEntityResult(CmsUser::class, 'u');
176
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
177
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('name'), 'name');
178
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('status'), 'status');
179
        $rsm->addJoinedEntityResult(CmsAddress::class, 'a', 'u', 'address');
180
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('a_id'), 'id');
181
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('country'), 'country');
182
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('zip'), 'zip');
183
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('city'), 'city');
184
185
        $query = $this->_em->createNativeQuery('SELECT u.id, u.name, u.status, a.id AS a_id, a.country, a.zip, a.city FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ?', $rsm);
186
        $query->setParameter(1, 'romanb');
187
188
        $users = $query->getResult();
189
190
        $this->assertEquals(1, count($users));
191
        $this->assertInstanceOf(CmsUser::class, $users[0]);
192
        $this->assertEquals('Roman', $users[0]->name);
193
        $this->assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
194
        $this->assertFalse($users[0]->getPhonenumbers()->isInitialized());
195
        $this->assertInstanceOf(CmsAddress::class, $users[0]->getAddress());
196
        $this->assertTrue($users[0]->getAddress()->getUser() == $users[0]);
197
        $this->assertEquals('germany', $users[0]->getAddress()->getCountry());
198
        $this->assertEquals(10827, $users[0]->getAddress()->getZipCode());
199
        $this->assertEquals('Berlin', $users[0]->getAddress()->getCity());
200
    }
201
202
    public function testFluentInterface()
203
    {
204
        $parameters = new ArrayCollection;
205
        $parameters->add(new Parameter(1, 'foo'));
206
        $parameters->add(new Parameter(2, 'bar'));
207
208
        $rsm = new ResultSetMapping;
209
210
        $q = $this->_em->createNativeQuery('SELECT id, name, status, phonenumber FROM cms_users INNER JOIN cms_phonenumbers ON id = user_id WHERE username = ?', $rsm);
211
        $q2 = $q->setSQL('foo')
212
          ->setResultSetMapping($rsm)
213
          ->expireResultCache(true)
214
          ->setHint('foo', 'bar')
215
          ->setParameter(1, 'foo')
216
          ->setParameters($parameters)
217
          ->setResultCacheDriver(null)
218
          ->setResultCacheLifetime(3500);
219
220
        $this->assertSame($q, $q2);
221
    }
222
223
    public function testJoinedOneToManyNativeQueryWithRSMBuilder()
224
    {
225
        $user = new CmsUser;
226
        $user->name = 'Roman';
227
        $user->username = 'romanb';
228
        $user->status = 'dev';
229
230
        $phone = new CmsPhonenumber;
231
        $phone->phonenumber = 424242;
232
233
        $user->addPhonenumber($phone);
234
235
        $this->_em->persist($user);
236
        $this->_em->flush();
237
238
        $this->_em->clear();
239
240
        $rsm = new ResultSetMappingBuilder($this->_em);
241
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
242
        $rsm->addJoinedEntityFromClassMetadata(CmsPhonenumber::class, 'p', 'u', 'phonenumbers');
243
        $query = $this->_em->createNativeQuery('SELECT u.*, p.* FROM cms_users u LEFT JOIN cms_phonenumbers p ON u.id = p.user_id WHERE username = ?', $rsm);
244
        $query->setParameter(1, 'romanb');
245
246
        $users = $query->getResult();
247
        $this->assertEquals(1, count($users));
248
        $this->assertInstanceOf(CmsUser::class, $users[0]);
249
        $this->assertEquals('Roman', $users[0]->name);
250
        $this->assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
251
        $this->assertTrue($users[0]->getPhonenumbers()->isInitialized());
252
        $this->assertEquals(1, count($users[0]->getPhonenumbers()));
253
        $phones = $users[0]->getPhonenumbers();
254
        $this->assertEquals(424242, $phones[0]->phonenumber);
255
        $this->assertTrue($phones[0]->getUser() === $users[0]);
256
257
        $this->_em->clear();
258
259
        $rsm = new ResultSetMappingBuilder($this->_em);
260
        $rsm->addRootEntityFromClassMetadata(CmsPhonenumber::class, 'p');
261
        $query = $this->_em->createNativeQuery('SELECT p.* FROM cms_phonenumbers p WHERE p.phonenumber = ?', $rsm);
262
        $query->setParameter(1, $phone->phonenumber);
263
        $phone = $query->getSingleResult();
264
265
        $this->assertNotNull($phone->getUser());
266
        $this->assertEquals($user->name, $phone->getUser()->getName());
267
    }
268
269
    public function testJoinedOneToOneNativeQueryWithRSMBuilder()
270
    {
271
        $user = new CmsUser;
272
        $user->name = 'Roman';
273
        $user->username = 'romanb';
274
        $user->status = 'dev';
275
276
        $addr = new CmsAddress;
277
        $addr->country = 'germany';
278
        $addr->zip = 10827;
279
        $addr->city = 'Berlin';
280
281
282
        $user->setAddress($addr);
283
284
        $this->_em->persist($user);
285
        $this->_em->flush();
286
287
        $this->_em->clear();
288
289
290
        $rsm = new ResultSetMappingBuilder($this->_em);
291
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
292
        $rsm->addJoinedEntityFromClassMetadata(CmsAddress::class, 'a', 'u', 'address', ['id' => 'a_id']
293
        );
294
295
        $query = $this->_em->createNativeQuery('SELECT u.*, a.*, a.id AS a_id FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ?', $rsm);
296
        $query->setParameter(1, 'romanb');
297
298
        $users = $query->getResult();
299
300
        $this->assertEquals(1, count($users));
301
        $this->assertInstanceOf(CmsUser::class, $users[0]);
302
        $this->assertEquals('Roman', $users[0]->name);
303
        $this->assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
304
        $this->assertFalse($users[0]->getPhonenumbers()->isInitialized());
305
        $this->assertInstanceOf(CmsAddress::class, $users[0]->getAddress());
306
        $this->assertTrue($users[0]->getAddress()->getUser() == $users[0]);
307
        $this->assertEquals('germany', $users[0]->getAddress()->getCountry());
308
        $this->assertEquals(10827, $users[0]->getAddress()->getZipCode());
309
        $this->assertEquals('Berlin', $users[0]->getAddress()->getCity());
310
311
        $this->_em->clear();
312
313
        $rsm = new ResultSetMappingBuilder($this->_em);
314
        $rsm->addRootEntityFromClassMetadata(CmsAddress::class, 'a');
315
        $query = $this->_em->createNativeQuery('SELECT a.* FROM cms_addresses a WHERE a.id = ?', $rsm);
316
        $query->setParameter(1, $addr->getId());
317
        $address = $query->getSingleResult();
318
319
        $this->assertNotNull($address->getUser());
320
        $this->assertEquals($user->name, $address->getUser()->getName());
321
    }
322
323
    /**
324
     * @group rsm-sti
325
     */
326
    public function testConcreteClassInSingleTableInheritanceSchemaWithRSMBuilderIsFine()
327
    {
328
        $rsm = new ResultSetMappingBuilder($this->_em);
329
        $rsm->addRootEntityFromClassMetadata(CompanyFixContract::class, 'c');
330
331
        self::assertSame(CompanyFixContract::class, $rsm->getClassName('c'));
332
    }
333
334
    /**
335
     * @group rsm-sti
336
     */
337
    public function testAbstractClassInSingleTableInheritanceSchemaWithRSMBuilderThrowsException()
338
    {
339
        $this->expectException(\InvalidArgumentException::class);
340
        $this->expectExceptionMessage('ResultSetMapping builder does not currently support your inheritance scheme.');
341
342
        $rsm = new ResultSetMappingBuilder($this->_em);
343
        $rsm->addRootEntityFromClassMetadata(CompanyContract::class, 'c');
344
    }
345
346
    /**
347
     * @group GH-7151
348
     */
349
    public function testConcreteClassInJoinedTableInheritanceSchemaWithRSMBuilderIsFine() : void
350
    {
351
        $rsm = new ResultSetMappingBuilder($this->em);
0 ignored issues
show
Bug Best Practice introduced by
The property em does not exist on Doctrine\Tests\ORM\Functional\NativeQueryTest. Did you maybe forget to declare it?
Loading history...
352
353
        $rsm->addRootEntityFromClassMetadata(CompanyAuction::class, 'c');
354
355
        self::assertSame(CompanyAuction::class, $rsm->getClassName('c'));
356
    }
357
358
    /**
359
     * @group GH-7151
360
     */
361
    public function testAbstractClassInJoinedTableInheritanceSchemaWithRSMBuilderThrowsException() : void
362
    {
363
        $this->expectException(InvalidArgumentException::class);
0 ignored issues
show
Bug introduced by
The type Doctrine\Tests\ORM\Funct...nvalidArgumentException was not found. Did you mean InvalidArgumentException? If so, make sure to prefix the type with \.
Loading history...
364
        $this->expectExceptionMessage('ResultSetMapping builder does not currently support your inheritance scheme.');
365
366
        $rsm = new ResultSetMappingBuilder($this->em);
0 ignored issues
show
Bug Best Practice introduced by
The property em does not exist on Doctrine\Tests\ORM\Functional\NativeQueryTest. Did you maybe forget to declare it?
Loading history...
367
368
        $rsm->addRootEntityFromClassMetadata(CompanyEvent::class, 'c');
369
    }
370
371
    /**
372
     * @expectedException \InvalidArgumentException
373
     */
374
    public function testRSMBuilderThrowsExceptionOnColumnConflict()
375
    {
376
        $rsm = new ResultSetMappingBuilder($this->_em);
377
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
378
        $rsm->addJoinedEntityFromClassMetadata(CmsAddress::class, 'a', 'u', 'address');
379
    }
380
381
    /**
382
     * @group PR-39
383
     */
384
    public function testUnknownParentAliasThrowsException()
385
    {
386
        $rsm = new ResultSetMappingBuilder($this->_em);
387
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
388
        $rsm->addJoinedEntityFromClassMetadata(CmsAddress::class, 'a', 'un', 'address', ['id' => 'a_id']
389
        );
390
391
        $query = $this->_em->createNativeQuery('SELECT u.*, a.*, a.id AS a_id FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ?', $rsm);
392
        $query->setParameter(1, 'romanb');
393
394
        $this->expectException(HydrationException::class);
395
        $this->expectExceptionMessage("The parent object of entity result with alias 'a' was not found. The parent alias is 'un'.");
396
397
        $users = $query->getResult();
0 ignored issues
show
Unused Code introduced by
The assignment to $users is dead and can be removed.
Loading history...
398
    }
399
400
401
    /**
402
     * @group DDC-1663
403
     */
404
    public function testBasicNativeNamedQueryWithSqlResultSetMapping()
405
    {
406
        $user           = new CmsUser;
407
        $user->name     = 'Fabio B. Silva';
408
        $user->username = 'FabioBatSilva';
409
        $user->status   = 'dev';
410
411
        $addr           = new CmsAddress;
412
        $addr->country  = 'Brazil';
413
        $addr->zip      = 10827;
414
        $addr->city     = 'São Paulo';
415
416
        $user->setAddress($addr);
417
418
        $this->_em->clear();
419
        $this->_em->persist($user);
420
        $this->_em->flush();
421
422
        $this->_em->clear();
423
424
425
        $repository = $this->_em->getRepository(CmsAddress::class);
426
        $query      = $repository->createNativeNamedQuery('find-all');
427
        $result     = $query->getResult();
428
429
        $this->assertCount(1, $result);
430
        $this->assertInstanceOf(CmsAddress::class, $result[0]);
431
        $this->assertEquals($addr->id,  $result[0]->id);
432
        $this->assertEquals($addr->city,  $result[0]->city);
433
        $this->assertEquals($addr->country, $result[0]->country);
434
    }
435
436
    /**
437
     * @group DDC-1663
438
     */
439
    public function testBasicNativeNamedQueryWithResultClass()
440
    {
441
        $user           = new CmsUser;
442
        $user->name     = 'Fabio B. Silva';
443
        $user->username = 'FabioBatSilva';
444
        $user->status   = 'dev';
445
446
        $email          = new CmsEmail();
447
        $email->email   = '[email protected]';
448
449
        $user->setEmail($email);
450
451
        $this->_em->clear();
452
        $this->_em->persist($user);
453
        $this->_em->flush();
454
455
        $this->_em->clear();
456
457
        $repository = $this->_em->getRepository(CmsUser::class);
458
459
        $result = $repository->createNativeNamedQuery('fetchIdAndUsernameWithResultClass')
460
                            ->setParameter(1, 'FabioBatSilva')
461
                            ->getResult();
462
463
        $this->assertEquals(1, count($result));
464
        $this->assertInstanceOf(CmsUser::class, $result[0]);
465
        $this->assertNull($result[0]->name);
466
        $this->assertNull($result[0]->email);
467
        $this->assertEquals($user->id, $result[0]->id);
468
        $this->assertEquals('FabioBatSilva', $result[0]->username);
469
470
        $this->_em->clear();
471
472
        $result = $repository->createNativeNamedQuery('fetchAllColumns')
473
                            ->setParameter(1, 'FabioBatSilva')
474
                            ->getResult();
475
476
        $this->assertEquals(1, count($result));
477
        $this->assertInstanceOf(CmsUser::class, $result[0]);
478
        $this->assertEquals($user->id, $result[0]->id);
479
        $this->assertEquals('Fabio B. Silva', $result[0]->name);
480
        $this->assertEquals('FabioBatSilva', $result[0]->username);
481
        $this->assertEquals('dev', $result[0]->status);
482
        $this->assertInstanceOf(CmsEmail::class, $result[0]->email);
483
    }
484
485
486
    /**
487
     * @group DDC-1663
488
     */
489
    public function testJoinedOneToOneNativeNamedQueryWithResultSetMapping()
490
    {
491
        $user           = new CmsUser;
492
        $user->name     = 'Fabio B. Silva';
493
        $user->username = 'FabioBatSilva';
494
        $user->status   = 'dev';
495
496
        $addr           = new CmsAddress;
497
        $addr->country  = 'Brazil';
498
        $addr->zip      = 10827;
499
        $addr->city     = 'São Paulo';
500
501
        $user->setAddress($addr);
502
503
        $this->_em->persist($user);
504
        $this->_em->flush();
505
        $this->_em->clear();
506
507
        $result = $this->_em->getRepository(CmsUser::class)
508
                            ->createNativeNamedQuery('fetchJoinedAddress')
509
                            ->setParameter(1, 'FabioBatSilva')
510
                            ->getResult();
511
512
        $this->assertEquals(1, count($result));
513
        $this->assertInstanceOf(CmsUser::class, $result[0]);
514
        $this->assertEquals('Fabio B. Silva', $result[0]->name);
515
        $this->assertInstanceOf(PersistentCollection::class, $result[0]->getPhonenumbers());
516
        $this->assertFalse($result[0]->getPhonenumbers()->isInitialized());
517
        $this->assertInstanceOf(CmsAddress::class, $result[0]->getAddress());
518
        $this->assertTrue($result[0]->getAddress()->getUser() == $result[0]);
519
        $this->assertEquals('Brazil', $result[0]->getAddress()->getCountry());
520
        $this->assertEquals(10827, $result[0]->getAddress()->getZipCode());
521
        $this->assertEquals('São Paulo', $result[0]->getAddress()->getCity());
522
    }
523
524
    /**
525
     * @group DDC-1663
526
     */
527
    public function testJoinedOneToManyNativeNamedQueryWithResultSetMapping()
528
    {
529
        $user               = new CmsUser;
530
        $user->name         = 'Fabio B. Silva';
531
        $user->username     = 'FabioBatSilva';
532
        $user->status       = 'dev';
533
534
        $phone              = new CmsPhonenumber;
535
        $phone->phonenumber = 424242;
536
537
        $user->addPhonenumber($phone);
538
539
        $this->_em->persist($user);
540
        $this->_em->flush();
541
542
        $this->_em->clear();
543
544
        $repository = $this->_em->getRepository(CmsUser::class);
545
546
        $result = $repository->createNativeNamedQuery('fetchJoinedPhonenumber')
547
                        ->setParameter(1, 'FabioBatSilva')->getResult();
548
549
        $this->assertEquals(1, count($result));
550
        $this->assertInstanceOf(CmsUser::class, $result[0]);
551
        $this->assertEquals('Fabio B. Silva', $result[0]->name);
552
        $this->assertInstanceOf(PersistentCollection::class, $result[0]->getPhonenumbers());
553
        $this->assertTrue($result[0]->getPhonenumbers()->isInitialized());
554
        $this->assertEquals(1, count($result[0]->getPhonenumbers()));
555
        $phones = $result[0]->getPhonenumbers();
556
        $this->assertEquals(424242, $phones[0]->phonenumber);
557
        $this->assertTrue($phones[0]->getUser() === $result[0]);
558
    }
559
560
    /**
561
     * @group DDC-1663
562
     */
563
    public function testMixedNativeNamedQueryNormalJoin()
564
    {
565
        $user1                  = new CmsUser;
566
        $user1->name            = 'Fabio B. Silva';
567
        $user1->username        = 'FabioBatSilva';
568
        $user1->status          = 'dev';
569
570
        $user2                  = new CmsUser;
571
        $user2->name            = 'test tester';
572
        $user2->username        = 'test';
573
        $user2->status          = 'tester';
574
575
        $phone1                 = new CmsPhonenumber;
576
        $phone2                 = new CmsPhonenumber;
577
        $phone3                 = new CmsPhonenumber;
578
        $phone1->phonenumber    = 11111111;
579
        $phone2->phonenumber    = 22222222;
580
        $phone3->phonenumber    = 33333333;
581
582
        $user1->addPhonenumber($phone1);
583
        $user1->addPhonenumber($phone2);
584
        $user2->addPhonenumber($phone3);
585
586
        $this->_em->persist($user1);
587
        $this->_em->persist($user2);
588
        $this->_em->flush();
589
590
        $this->_em->clear();
591
592
        $repository = $this->_em->getRepository(CmsUser::class);
593
594
        $result = $repository->createNativeNamedQuery('fetchUserPhonenumberCount')
595
                        ->setParameter(1, ['test','FabioBatSilva'])->getResult();
596
597
        $this->assertEquals(2, count($result));
598
        $this->assertTrue(is_array($result[0]));
599
        $this->assertTrue(is_array($result[1]));
600
601
        // first user => 2 phonenumbers
602
        $this->assertInstanceOf(CmsUser::class, $result[0][0]);
603
        $this->assertEquals('Fabio B. Silva', $result[0][0]->name);
604
        $this->assertEquals(2, $result[0]['numphones']);
605
606
        // second user => 1 phonenumbers
607
        $this->assertInstanceOf(CmsUser::class, $result[1][0]);
608
        $this->assertEquals('test tester', $result[1][0]->name);
609
        $this->assertEquals(1, $result[1]['numphones']);
610
    }
611
612
    /**
613
     * @group DDC-1663
614
     */
615
    public function testNativeNamedQueryInheritance()
616
    {
617
        $person = new CompanyPerson;
618
        $person->setName('Fabio B. Silva');
619
620
        $employee = new CompanyEmployee;
621
        $employee->setName('Fabio Silva');
622
        $employee->setSalary(100000);
623
        $employee->setDepartment('IT');
624
625
        $this->_em->persist($person);
626
        $this->_em->persist($employee);
627
628
        $this->_em->flush();
629
        $this->_em->clear();
630
631
        $repository = $this->_em->getRepository(CompanyPerson::class);
632
633
        $result = $repository->createNativeNamedQuery('fetchAllWithSqlResultSetMapping')
634
                        ->getResult();
635
636
        $this->assertEquals(2, count($result));
637
        $this->assertInstanceOf(CompanyPerson::class, $result[0]);
638
        $this->assertInstanceOf(CompanyEmployee::class, $result[1]);
639
        $this->assertTrue(is_numeric($result[0]->getId()));
640
        $this->assertTrue(is_numeric($result[1]->getId()));
641
        $this->assertEquals('Fabio B. Silva', $result[0]->getName());
642
        $this->assertEquals('Fabio Silva', $result[1]->getName());
643
644
645
        $this->_em->clear();
646
647
648
        $result = $repository->createNativeNamedQuery('fetchAllWithResultClass')
649
                        ->getResult();
650
651
        $this->assertEquals(2, count($result));
652
        $this->assertInstanceOf(CompanyPerson::class, $result[0]);
653
        $this->assertInstanceOf(CompanyEmployee::class, $result[1]);
654
        $this->assertTrue(is_numeric($result[0]->getId()));
655
        $this->assertTrue(is_numeric($result[1]->getId()));
656
        $this->assertEquals('Fabio B. Silva', $result[0]->getName());
657
        $this->assertEquals('Fabio Silva', $result[1]->getName());
658
    }
659
660
    /**
661
     * @group DDC-1663
662
     * DQL : SELECT u, a, COUNT(p) AS numphones FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.address a JOIN u.phonenumbers p
663
     */
664
    public function testMultipleEntityResults()
665
    {
666
667
        $user               = new CmsUser;
668
        $user->name         = 'Fabio B. Silva';
669
        $user->username     = 'FabioBatSilva';
670
        $user->status       = 'dev';
671
672
        $addr               = new CmsAddress;
673
        $addr->country      = 'Brazil';
674
        $addr->zip          = 10827;
675
        $addr->city         = 'São Paulo';
676
677
        $phone              = new CmsPhonenumber;
678
        $phone->phonenumber = 424242;
679
680
681
        $user->setAddress($addr);
682
        $user->addPhonenumber($phone);
683
684
685
        $this->_em->clear();
686
        $this->_em->persist($user);
687
        $this->_em->flush();
688
689
        $this->_em->clear();
690
691
692
        $repository = $this->_em->getRepository(CmsUser::class);
693
        $query      = $repository->createNativeNamedQuery('fetchMultipleJoinsEntityResults');
694
        $result     = $query->getResult();
695
696
697
        $this->assertEquals(1, count($result));
698
        $this->assertTrue(is_array($result[0]));
699
700
        $this->assertInstanceOf(CmsUser::class, $result[0][0]);
701
        $this->assertEquals('Fabio B. Silva', $result[0][0]->name);
702
        $this->assertInstanceOf(CmsAddress::class, $result[0][0]->getAddress());
703
        $this->assertTrue($result[0][0]->getAddress()->getUser() == $result[0][0]);
704
        $this->assertEquals('Brazil', $result[0][0]->getAddress()->getCountry());
705
        $this->assertEquals(10827, $result[0][0]->getAddress()->getZipCode());
706
707
        $this->assertEquals(1, $result[0]['numphones']);
708
709
    }
710
711
    /**
712
     * @group DDC-1663
713
     */
714
    public function testNamedNativeQueryInheritance()
715
    {
716
        $contractMetadata   = $this->_em->getClassMetadata(CompanyContract::class);
717
        $flexMetadata       = $this->_em->getClassMetadata(CompanyFlexContract::class);
718
719
        $contractQueries    = $contractMetadata->getNamedNativeQueries();
720
        $flexQueries        = $flexMetadata->getNamedNativeQueries();
721
722
        $contractMappings   = $contractMetadata->getSqlResultSetMappings();
723
        $flexMappings       = $flexMetadata->getSqlResultSetMappings();
724
725
726
        // contract queries
727
        $this->assertEquals('all-contracts', $contractQueries['all-contracts']['name']);
728
        $this->assertEquals(CompanyContract::class, $contractQueries['all-contracts']['resultClass']);
729
730
        $this->assertEquals('all', $contractQueries['all']['name']);
731
        $this->assertEquals(CompanyContract::class, $contractQueries['all']['resultClass']);
732
733
734
        // flex contract queries
735
        $this->assertEquals('all-contracts', $flexQueries['all-contracts']['name']);
736
        $this->assertEquals(CompanyFlexContract::class, $flexQueries['all-contracts']['resultClass']);
737
738
        $this->assertEquals('all-flex', $flexQueries['all-flex']['name']);
739
        $this->assertEquals(CompanyFlexContract::class, $flexQueries['all-flex']['resultClass']);
740
741
        $this->assertEquals('all', $flexQueries['all']['name']);
742
        $this->assertEquals(CompanyFlexContract::class, $flexQueries['all']['resultClass']);
743
744
745
        // contract result mapping
746
        $this->assertEquals('mapping-all-contracts', $contractMappings['mapping-all-contracts']['name']);
747
        $this->assertEquals(CompanyContract::class, $contractMappings['mapping-all-contracts']['entities'][0]['entityClass']);
748
749
        $this->assertEquals('mapping-all', $contractMappings['mapping-all']['name']);
750
        $this->assertEquals(CompanyContract::class, $contractMappings['mapping-all-contracts']['entities'][0]['entityClass']);
751
752
        // flex contract result mapping
753
        $this->assertEquals('mapping-all-contracts', $flexMappings['mapping-all-contracts']['name']);
754
        $this->assertEquals(CompanyFlexContract::class, $flexMappings['mapping-all-contracts']['entities'][0]['entityClass']);
755
756
        $this->assertEquals('mapping-all', $flexMappings['mapping-all']['name']);
757
        $this->assertEquals(CompanyFlexContract::class, $flexMappings['mapping-all']['entities'][0]['entityClass']);
758
759
        $this->assertEquals('mapping-all-flex', $flexMappings['mapping-all-flex']['name']);
760
        $this->assertEquals(CompanyFlexContract::class, $flexMappings['mapping-all-flex']['entities'][0]['entityClass']);
761
762
    }
763
764
    /**
765
     * @group DDC-2055
766
     */
767
    public function testGenerateSelectClauseNoRenameSingleEntity()
768
    {
769
        $rsm = new ResultSetMappingBuilder($this->_em);
770
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
771
772
        $selectClause = $rsm->generateSelectClause();
773
774
        $this->assertSQLEquals('u.id AS id, u.status AS status, u.username AS username, u.name AS name, u.email_id AS email_id', $selectClause);
775
    }
776
777
    /**
778
     * @group DDC-2055
779
     */
780
    public function testGenerateSelectClauseCustomRenames()
781
    {
782
        $rsm = new ResultSetMappingBuilder($this->_em);
783
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u', [
784
            'id' => 'id1',
785
            'username' => 'username2'
786
        ]
787
        );
788
789
        $selectClause = $rsm->generateSelectClause();
790
791
        $this->assertSQLEquals('u.id AS id1, u.status AS status, u.username AS username2, u.name AS name, u.email_id AS email_id', $selectClause);
792
    }
793
794
    /**
795
     * @group DDC-2055
796
     */
797
    public function testGenerateSelectClauseRenameTableAlias()
798
    {
799
        $rsm = new ResultSetMappingBuilder($this->_em);
800
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
801
802
        $selectClause = $rsm->generateSelectClause(['u' => 'u1']);
803
804
        $this->assertSQLEquals('u1.id AS id, u1.status AS status, u1.username AS username, u1.name AS name, u1.email_id AS email_id', $selectClause);
805
    }
806
807
    /**
808
     * @group DDC-2055
809
     */
810
    public function testGenerateSelectClauseIncrement()
811
    {
812
        $rsm = new ResultSetMappingBuilder($this->_em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
813
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
814
815
        $selectClause = $rsm->generateSelectClause();
816
817
        $this->assertSQLEquals('u.id AS id0, u.status AS status1, u.username AS username2, u.name AS name3, u.email_id AS email_id4', $selectClause);
818
    }
819
820
    /**
821
     * @group DDC-2055
822
     */
823
    public function testGenerateSelectClauseToString()
824
    {
825
        $rsm = new ResultSetMappingBuilder($this->_em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
826
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
827
828
        $this->assertSQLEquals('u.id AS id0, u.status AS status1, u.username AS username2, u.name AS name3, u.email_id AS email_id4', (string)$rsm);
829
    }
830
831
    /**
832
     * @group DDC-3899
833
     */
834
    public function testGenerateSelectClauseWithDiscriminatorColumn()
835
    {
836
        $rsm = new ResultSetMappingBuilder($this->_em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
837
        $rsm->addEntityResult(DDC3899User::class, 'u');
838
        $rsm->addJoinedEntityResult(DDC3899FixContract::class, 'c', 'u', 'contracts');
839
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
840
        $rsm->setDiscriminatorColumn('c', $this->platform->getSQLResultCasing('discr'));
841
842
        $selectClause = $rsm->generateSelectClause(['u' => 'u1', 'c' => 'c1']);
843
844
        $this->assertSQLEquals('u1.id as id, c1.discr as discr', $selectClause);
845
    }
846
}
847