Completed
Pull Request — master (#5580)
by Marco
10:58
created

ArrayHydratorTest::testMixedQueryFetchJoin()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 61
Code Lines 42

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 61
rs 9.5147
cc 2
eloc 42
nc 1
nop 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Doctrine\Tests\ORM\Hydration;
4
5
use Doctrine\Tests\Mocks\HydratorMockStatement;
6
use Doctrine\ORM\Query\ResultSetMapping;
7
8
class ArrayHydratorTest extends HydrationTestCase
9
{
10
    public function provideDataForUserEntityResult()
11
    {
12
        return array(
13
            array(0),
14
            array('user'),
15
            array('scalars'),
16
            array('newObjects'),
17
        );
18
    }
19
20
    /**
21
     * SELECT PARTIAL u.{id, name}
22
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
23
     */
24
    public function testSimpleEntityQuery()
25
    {
26
        $rsm = new ResultSetMapping;
27
28
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
29
        $rsm->addFieldResult('u', 'u__id', 'id');
30
        $rsm->addFieldResult('u', 'u__name', 'name');
31
32
        // Faked result set
33
        $resultSet = array(
34
            array(
35
                'u__id' => '1',
36
                'u__name' => 'romanb'
37
            ),
38
            array(
39
                'u__id' => '2',
40
                'u__name' => 'jwage'
41
            )
42
        );
43
44
        $stmt     = new HydratorMockStatement($resultSet);
45
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
46
        $result   = $hydrator->hydrateAll($stmt, $rsm);
47
48
        $this->assertEquals(2, count($result));
49
        $this->assertTrue(is_array($result));
50
51
        $this->assertEquals(1, $result[0]['id']);
52
        $this->assertEquals('romanb', $result[0]['name']);
53
54
        $this->assertEquals(2, $result[1]['id']);
55
        $this->assertEquals('jwage', $result[1]['name']);
56
    }
57
58
    /**
59
     * SELECT PARTIAL scalars.{id, name}, UPPER(scalars.name) AS nameUpper
60
     *   FROM Doctrine\Tests\Models\CMS\CmsUser scalars
61
     *
62
     * @dataProvider provideDataForUserEntityResult
63
     */
64
    public function testSimpleEntityWithScalarQuery($userEntityKey)
65
    {
66
        $alias = $userEntityKey ?: 'u';
67
        $rsm   = new ResultSetMapping;
68
69
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', $alias);
70
        $rsm->addFieldResult($alias, 's__id', 'id');
71
        $rsm->addFieldResult($alias, 's__name', 'name');
72
        $rsm->addScalarResult('sclr0', 'nameUpper', 'string');
73
74
        // Faked result set
75
        $resultSet = array(
76
            array(
77
                's__id' => '1',
78
                's__name' => 'romanb',
79
                'sclr0' => 'ROMANB',
80
            ),
81
            array(
82
                's__id' => '2',
83
                's__name' => 'jwage',
84
                'sclr0' => 'JWAGE',
85
            )
86
        );
87
88
        $stmt     = new HydratorMockStatement($resultSet);
89
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
90
        $result   = $hydrator->hydrateAll($stmt, $rsm);
91
92
        $this->assertEquals(2, count($result));
93
        $this->assertTrue(is_array($result));
94
95
        $this->assertArrayHasKey('nameUpper', $result[0]);
96
        $this->assertArrayNotHasKey('id', $result[0]);
97
        $this->assertArrayNotHasKey('name', $result[0]);
98
99
        $this->assertArrayHasKey(0, $result[0]);
100
        $this->assertArrayHasKey('id', $result[0][0]);
101
        $this->assertArrayHasKey('name', $result[0][0]);
102
103
        $this->assertArrayHasKey('nameUpper', $result[1]);
104
        $this->assertArrayNotHasKey('id', $result[1]);
105
        $this->assertArrayNotHasKey('name', $result[1]);
106
107
        $this->assertArrayHasKey(0, $result[1]);
108
        $this->assertArrayHasKey('id', $result[1][0]);
109
        $this->assertArrayHasKey('name', $result[1][0]);
110
    }
111
112
    /**
113
     * SELECT PARTIAL u.{id, name} AS user
114
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
115
     */
116
    public function testSimpleEntityQueryWithAliasedUserEntity()
117
    {
118
        $rsm = new ResultSetMapping;
119
120
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
121
        $rsm->addFieldResult('u', 'u__id', 'id');
122
        $rsm->addFieldResult('u', 'u__name', 'name');
123
124
        // Faked result set
125
        $resultSet = array(
126
            array(
127
                'u__id' => '1',
128
                'u__name' => 'romanb'
129
            ),
130
            array(
131
                'u__id' => '2',
132
                'u__name' => 'jwage'
133
            )
134
        );
135
136
        $stmt     = new HydratorMockStatement($resultSet);
137
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
138
        $result   = $hydrator->hydrateAll($stmt, $rsm);
139
140
        $this->assertEquals(2, count($result));
141
        $this->assertTrue(is_array($result));
142
143
        $this->assertArrayHasKey('user', $result[0]);
144
        $this->assertEquals(1, $result[0]['user']['id']);
145
        $this->assertEquals('romanb', $result[0]['user']['name']);
146
147
        $this->assertArrayHasKey('user', $result[1]);
148
        $this->assertEquals(2, $result[1]['user']['id']);
149
        $this->assertEquals('jwage', $result[1]['user']['name']);
150
    }
151
152
    /**
153
     * SELECT PARTIAL u.{id, name}, PARTIAL a.{id, topic}
154
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
155
     */
156
    public function testSimpleMultipleRootEntityQuery()
157
    {
158
        $rsm = new ResultSetMapping;
159
160
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
161
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a');
162
        $rsm->addFieldResult('u', 'u__id', 'id');
163
        $rsm->addFieldResult('u', 'u__name', 'name');
164
        $rsm->addFieldResult('a', 'a__id', 'id');
165
        $rsm->addFieldResult('a', 'a__topic', 'topic');
166
167
        // Faked result set
168
        $resultSet = array(
169
            array(
170
                'u__id' => '1',
171
                'u__name' => 'romanb',
172
                'a__id' => '1',
173
                'a__topic' => 'Cool things.'
174
            ),
175
            array(
176
                'u__id' => '2',
177
                'u__name' => 'jwage',
178
                'a__id' => '2',
179
                'a__topic' => 'Cool things II.'
180
            )
181
        );
182
183
        $stmt     = new HydratorMockStatement($resultSet);
184
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
185
        $result   = $hydrator->hydrateAll($stmt, $rsm);
186
187
        $this->assertEquals(4, count($result));
188
189
        $this->assertEquals(1, $result[0]['id']);
190
        $this->assertEquals('romanb', $result[0]['name']);
191
192
        $this->assertEquals(1, $result[1]['id']);
193
        $this->assertEquals('Cool things.', $result[1]['topic']);
194
195
        $this->assertEquals(2, $result[2]['id']);
196
        $this->assertEquals('jwage', $result[2]['name']);
197
198
        $this->assertEquals(2, $result[3]['id']);
199
        $this->assertEquals('Cool things II.', $result[3]['topic']);
200
    }
201
202
    /**
203
     * SELECT PARTIAL u.{id, name} AS user, PARTIAL a.{id, topic}
204
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
205
     */
206
    public function testSimpleMultipleRootEntityQueryWithAliasedUserEntity()
207
    {
208
        $rsm = new ResultSetMapping;
209
210
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
211
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a');
212
        $rsm->addFieldResult('u', 'u__id', 'id');
213
        $rsm->addFieldResult('u', 'u__name', 'name');
214
        $rsm->addFieldResult('a', 'a__id', 'id');
215
        $rsm->addFieldResult('a', 'a__topic', 'topic');
216
217
        // Faked result set
218
        $resultSet = array(
219
            array(
220
                'u__id' => '1',
221
                'u__name' => 'romanb',
222
                'a__id' => '1',
223
                'a__topic' => 'Cool things.'
224
            ),
225
            array(
226
                'u__id' => '2',
227
                'u__name' => 'jwage',
228
                'a__id' => '2',
229
                'a__topic' => 'Cool things II.'
230
            )
231
        );
232
233
        $stmt     = new HydratorMockStatement($resultSet);
234
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
235
        $result   = $hydrator->hydrateAll($stmt, $rsm);
236
237
        $this->assertEquals(4, count($result));
238
239
        $this->assertArrayHasKey('user', $result[0]);
240
        $this->assertEquals(1, $result[0]['user']['id']);
241
        $this->assertEquals('romanb', $result[0]['user']['name']);
242
243
        $this->assertArrayHasKey(0, $result[1]);
244
        $this->assertEquals(1, $result[1][0]['id']);
245
        $this->assertEquals('Cool things.', $result[1][0]['topic']);
246
247
        $this->assertArrayHasKey('user', $result[2]);
248
        $this->assertEquals(2, $result[2]['user']['id']);
249
        $this->assertEquals('jwage', $result[2]['user']['name']);
250
251
        $this->assertArrayHasKey(0, $result[3]);
252
        $this->assertEquals(2, $result[3][0]['id']);
253
        $this->assertEquals('Cool things II.', $result[3][0]['topic']);
254
    }
255
256
    /**
257
     * SELECT PARTIAL u.{id, name}, PARTIAL a.{id, topic} AS article
258
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
259
     */
260
    public function testSimpleMultipleRootEntityQueryWithAliasedArticleEntity()
261
    {
262
        $rsm = new ResultSetMapping;
263
264
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
265
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a', 'article');
266
        $rsm->addFieldResult('u', 'u__id', 'id');
267
        $rsm->addFieldResult('u', 'u__name', 'name');
268
        $rsm->addFieldResult('a', 'a__id', 'id');
269
        $rsm->addFieldResult('a', 'a__topic', 'topic');
270
271
        // Faked result set
272
        $resultSet = array(
273
            array(
274
                'u__id' => '1',
275
                'u__name' => 'romanb',
276
                'a__id' => '1',
277
                'a__topic' => 'Cool things.'
278
            ),
279
            array(
280
                'u__id' => '2',
281
                'u__name' => 'jwage',
282
                'a__id' => '2',
283
                'a__topic' => 'Cool things II.'
284
            )
285
        );
286
287
        $stmt     = new HydratorMockStatement($resultSet);
288
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
289
        $result   = $hydrator->hydrateAll($stmt, $rsm);
290
291
        $this->assertEquals(4, count($result));
292
293
        $this->assertArrayHasKey(0, $result[0]);
294
        $this->assertEquals(1, $result[0][0]['id']);
295
        $this->assertEquals('romanb', $result[0][0]['name']);
296
297
        $this->assertArrayHasKey('article', $result[1]);
298
        $this->assertEquals(1, $result[1]['article']['id']);
299
        $this->assertEquals('Cool things.', $result[1]['article']['topic']);
300
301
        $this->assertArrayHasKey(0, $result[2]);
302
        $this->assertEquals(2, $result[2][0]['id']);
303
        $this->assertEquals('jwage', $result[2][0]['name']);
304
305
        $this->assertArrayHasKey('article', $result[3]);
306
        $this->assertEquals(2, $result[3]['article']['id']);
307
        $this->assertEquals('Cool things II.', $result[3]['article']['topic']);
308
    }
309
310
    /**
311
     * SELECT PARTIAL u.{id, name} AS user, PARTIAL a.{id, topic} AS article
312
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
313
     */
314
    public function testSimpleMultipleRootEntityQueryWithAliasedEntities()
315
    {
316
        $rsm = new ResultSetMapping;
317
318
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
319
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a', 'article');
320
        $rsm->addFieldResult('u', 'u__id', 'id');
321
        $rsm->addFieldResult('u', 'u__name', 'name');
322
        $rsm->addFieldResult('a', 'a__id', 'id');
323
        $rsm->addFieldResult('a', 'a__topic', 'topic');
324
325
        // Faked result set
326
        $resultSet = array(
327
            array(
328
                'u__id' => '1',
329
                'u__name' => 'romanb',
330
                'a__id' => '1',
331
                'a__topic' => 'Cool things.'
332
            ),
333
            array(
334
                'u__id' => '2',
335
                'u__name' => 'jwage',
336
                'a__id' => '2',
337
                'a__topic' => 'Cool things II.'
338
            )
339
        );
340
341
        $stmt     = new HydratorMockStatement($resultSet);
342
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
343
        $result   = $hydrator->hydrateAll($stmt, $rsm);
344
345
        $this->assertEquals(4, count($result));
346
347
        $this->assertArrayHasKey('user', $result[0]);
348
        $this->assertEquals(1, $result[0]['user']['id']);
349
        $this->assertEquals('romanb', $result[0]['user']['name']);
350
351
        $this->assertArrayHasKey('article', $result[1]);
352
        $this->assertEquals(1, $result[1]['article']['id']);
353
        $this->assertEquals('Cool things.', $result[1]['article']['topic']);
354
355
        $this->assertArrayHasKey('user', $result[2]);
356
        $this->assertEquals(2, $result[2]['user']['id']);
357
        $this->assertEquals('jwage', $result[2]['user']['name']);
358
359
        $this->assertArrayHasKey('article', $result[3]);
360
        $this->assertEquals(2, $result[3]['article']['id']);
361
        $this->assertEquals('Cool things II.', $result[3]['article']['topic']);
362
    }
363
364
    /**
365
     * SELECT PARTIAL u.{id, status}, COUNT(p.phonenumber) AS numPhones
366
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
367
     *   JOIN u.phonenumbers p
368
     *  GROUP BY u.status, u.id
369
     *
370
     * @dataProvider provideDataForUserEntityResult
371
     */
372
    public function testMixedQueryNormalJoin($userEntityKey)
373
    {
374
        $rsm = new ResultSetMapping;
375
376
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
377
        $rsm->addFieldResult('u', 'u__id', 'id');
378
        $rsm->addFieldResult('u', 'u__status', 'status');
379
        $rsm->addScalarResult('sclr0', 'numPhones', 'integer');
380
381
        // Faked result set
382
        $resultSet = array(
383
            //row1
384
            array(
385
                'u__id' => '1',
386
                'u__status' => 'developer',
387
                'sclr0' => '2',
388
            ),
389
            array(
390
                'u__id' => '2',
391
                'u__status' => 'developer',
392
                'sclr0' => '1',
393
            )
394
        );
395
396
        $stmt     = new HydratorMockStatement($resultSet);
397
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
398
        $result   = $hydrator->hydrateAll($stmt, $rsm);
399
400
        $this->assertEquals(2, count($result));
401
        $this->assertTrue(is_array($result));
402
        $this->assertTrue(is_array($result[0]));
403
        $this->assertTrue(is_array($result[1]));
404
405
        // first user => 2 phonenumbers
406
        $this->assertArrayHasKey($userEntityKey, $result[0]);
407
        $this->assertEquals(2, $result[0]['numPhones']);
408
409
        // second user => 1 phonenumber
410
        $this->assertArrayHasKey($userEntityKey, $result[1]);
411
        $this->assertEquals(1, $result[1]['numPhones']);
412
    }
413
414
    /**
415
     * SELECT PARTIAL u.{id, status}, PARTIAL p.{phonenumber}, UPPER(u.name) AS nameUpper
416
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
417
     *   JOIN u.phonenumbers p
418
     *
419
     * @dataProvider provideDataForUserEntityResult
420
     */
421
    public function testMixedQueryFetchJoin($userEntityKey)
422
    {
423
        $rsm = new ResultSetMapping;
424
425
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
426
        $rsm->addJoinedEntityResult(
427
            'Doctrine\Tests\Models\CMS\CmsPhonenumber',
428
            'p',
429
            'u',
430
            'phonenumbers'
431
        );
432
        $rsm->addFieldResult('u', 'u__id', 'id');
433
        $rsm->addFieldResult('u', 'u__status', 'status');
434
        $rsm->addScalarResult('sclr0', 'nameUpper', 'string');
435
        $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
436
437
        // Faked result set
438
        $resultSet = array(
439
            //row1
440
            array(
441
                'u__id' => '1',
442
                'u__status' => 'developer',
443
                'sclr0' => 'ROMANB',
444
                'p__phonenumber' => '42',
445
            ),
446
            array(
447
                'u__id' => '1',
448
                'u__status' => 'developer',
449
                'sclr0' => 'ROMANB',
450
                'p__phonenumber' => '43',
451
            ),
452
            array(
453
                'u__id' => '2',
454
                'u__status' => 'developer',
455
                'sclr0' => 'JWAGE',
456
                'p__phonenumber' => '91'
457
            )
458
        );
459
460
        $stmt     = new HydratorMockStatement($resultSet);
461
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
462
        $result   = $hydrator->hydrateAll($stmt, $rsm);
463
464
        $this->assertEquals(2, count($result));
465
466
        $this->assertTrue(is_array($result));
467
        $this->assertTrue(is_array($result[0]));
468
        $this->assertTrue(is_array($result[1]));
469
470
        // first user => 2 phonenumbers
471
        $this->assertEquals(2, count($result[0][$userEntityKey]['phonenumbers']));
472
        $this->assertEquals('ROMANB', $result[0]['nameUpper']);
473
474
        // second user => 1 phonenumber
475
        $this->assertEquals(1, count($result[1][$userEntityKey]['phonenumbers']));
476
        $this->assertEquals('JWAGE', $result[1]['nameUpper']);
477
478
        $this->assertEquals(42, $result[0][$userEntityKey]['phonenumbers'][0]['phonenumber']);
479
        $this->assertEquals(43, $result[0][$userEntityKey]['phonenumbers'][1]['phonenumber']);
480
        $this->assertEquals(91, $result[1][$userEntityKey]['phonenumbers'][0]['phonenumber']);
481
    }
482
483
    /**
484
     * SELECT PARTIAL u.{id, status}, UPPER(u.name) nameUpper
485
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
486
     *        INDEX BY u.id
487
     *   JOIN u.phonenumbers p
488
     *        INDEX BY p.phonenumber
489
     *
490
     * @dataProvider provideDataForUserEntityResult
491
     */
492
    public function testMixedQueryFetchJoinCustomIndex($userEntityKey)
493
    {
494
        $rsm = new ResultSetMapping;
495
496
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
497
        $rsm->addJoinedEntityResult(
498
            'Doctrine\Tests\Models\CMS\CmsPhonenumber',
499
            'p',
500
            'u',
501
            'phonenumbers'
502
        );
503
        $rsm->addFieldResult('u', 'u__id', 'id');
504
        $rsm->addFieldResult('u', 'u__status', 'status');
505
        $rsm->addScalarResult('sclr0', 'nameUpper', 'string');
506
        $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
507
        $rsm->addIndexBy('u', 'id');
508
        $rsm->addIndexBy('p', 'phonenumber');
509
510
        // Faked result set
511
        $resultSet = array(
512
            //row1
513
            array(
514
                'u__id' => '1',
515
                'u__status' => 'developer',
516
                'sclr0' => 'ROMANB',
517
                'p__phonenumber' => '42',
518
            ),
519
            array(
520
                'u__id' => '1',
521
                'u__status' => 'developer',
522
                'sclr0' => 'ROMANB',
523
                'p__phonenumber' => '43',
524
            ),
525
            array(
526
                'u__id' => '2',
527
                'u__status' => 'developer',
528
                'sclr0' => 'JWAGE',
529
                'p__phonenumber' => '91'
530
            )
531
        );
532
533
534
        $stmt     = new HydratorMockStatement($resultSet);
535
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
536
        $result   = $hydrator->hydrateAll($stmt, $rsm);
537
538
        $this->assertEquals(2, count($result));
539
540
        $this->assertTrue(is_array($result));
541
        $this->assertTrue(is_array($result[1]));
542
        $this->assertTrue(is_array($result[2]));
543
544
        // test the scalar values
545
        $this->assertEquals('ROMANB', $result[1]['nameUpper']);
546
        $this->assertEquals('JWAGE', $result[2]['nameUpper']);
547
548
        // first user => 2 phonenumbers. notice the custom indexing by user id
549
        $this->assertEquals(2, count($result[1][$userEntityKey]['phonenumbers']));
550
551
        // second user => 1 phonenumber. notice the custom indexing by user id
552
        $this->assertEquals(1, count($result[2][$userEntityKey]['phonenumbers']));
553
554
        // test the custom indexing of the phonenumbers
555
        $this->assertTrue(isset($result[1][$userEntityKey]['phonenumbers']['42']));
556
        $this->assertTrue(isset($result[1][$userEntityKey]['phonenumbers']['43']));
557
        $this->assertTrue(isset($result[2][$userEntityKey]['phonenumbers']['91']));
558
    }
559
560
    /**
561
     * select u.id, u.status, p.phonenumber, upper(u.name) nameUpper, a.id, a.topic
562
     * from User u
563
     * join u.phonenumbers p
564
     * join u.articles a
565
     * =
566
     * select u.id, u.status, p.phonenumber, upper(u.name) AS u___0, a.id, a.topic
567
     * from USERS u
568
     * inner join PHONENUMBERS p ON u.id = p.user_id
569
     * inner join ARTICLES a ON u.id = a.user_id
570
     */
571
    public function testMixedQueryMultipleFetchJoin()
572
    {
573
        $rsm = new ResultSetMapping;
574
575
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
576
        $rsm->addJoinedEntityResult(
577
            'Doctrine\Tests\Models\CMS\CmsPhonenumber',
578
            'p',
579
            'u',
580
            'phonenumbers'
581
        );
582
        $rsm->addJoinedEntityResult(
583
            'Doctrine\Tests\Models\CMS\CmsArticle',
584
            'a',
585
            'u',
586
            'articles'
587
        );
588
        $rsm->addFieldResult('u', 'u__id', 'id');
589
        $rsm->addFieldResult('u', 'u__status', 'status');
590
        $rsm->addScalarResult('sclr0', 'nameUpper', 'string');
591
        $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
592
        $rsm->addFieldResult('a', 'a__id', 'id');
593
        $rsm->addFieldResult('a', 'a__topic', 'topic');
594
595
        // Faked result set
596
        $resultSet = array(
597
            //row1
598
            array(
599
                'u__id' => '1',
600
                'u__status' => 'developer',
601
                'sclr0' => 'ROMANB',
602
                'p__phonenumber' => '42',
603
                'a__id' => '1',
604
                'a__topic' => 'Getting things done!'
605
            ),
606
            array(
607
                'u__id' => '1',
608
                'u__status' => 'developer',
609
                'sclr0' => 'ROMANB',
610
                'p__phonenumber' => '43',
611
                'a__id' => '1',
612
                'a__topic' => 'Getting things done!'
613
            ),
614
            array(
615
                'u__id' => '1',
616
                'u__status' => 'developer',
617
                'sclr0' => 'ROMANB',
618
                'p__phonenumber' => '42',
619
                'a__id' => '2',
620
                'a__topic' => 'ZendCon'
621
            ),
622
            array(
623
                'u__id' => '1',
624
                'u__status' => 'developer',
625
                'sclr0' => 'ROMANB',
626
                'p__phonenumber' => '43',
627
                'a__id' => '2',
628
                'a__topic' => 'ZendCon'
629
            ),
630
            array(
631
                'u__id' => '2',
632
                'u__status' => 'developer',
633
                'sclr0' => 'JWAGE',
634
                'p__phonenumber' => '91',
635
                'a__id' => '3',
636
                'a__topic' => 'LINQ'
637
            ),
638
            array(
639
                'u__id' => '2',
640
                'u__status' => 'developer',
641
                'sclr0' => 'JWAGE',
642
                'p__phonenumber' => '91',
643
                'a__id' => '4',
644
                'a__topic' => 'PHP7'
645
            ),
646
        );
647
648
        $stmt     = new HydratorMockStatement($resultSet);
649
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
650
        $result   = $hydrator->hydrateAll($stmt, $rsm);
651
652
        $this->assertEquals(2, count($result));
653
        $this->assertTrue(is_array($result));
654
        $this->assertTrue(is_array($result[0]));
655
        $this->assertTrue(is_array($result[1]));
656
        // first user => 2 phonenumbers, 2 articles
657
        $this->assertEquals(2, count($result[0][0]['phonenumbers']));
658
        $this->assertEquals(2, count($result[0][0]['articles']));
659
        $this->assertEquals('ROMANB', $result[0]['nameUpper']);
660
        // second user => 1 phonenumber, 2 articles
661
        $this->assertEquals(1, count($result[1][0]['phonenumbers']));
662
        $this->assertEquals(2, count($result[1][0]['articles']));
663
        $this->assertEquals('JWAGE', $result[1]['nameUpper']);
664
665
        $this->assertEquals(42, $result[0][0]['phonenumbers'][0]['phonenumber']);
666
        $this->assertEquals(43, $result[0][0]['phonenumbers'][1]['phonenumber']);
667
        $this->assertEquals(91, $result[1][0]['phonenumbers'][0]['phonenumber']);
668
669
        $this->assertEquals('Getting things done!', $result[0][0]['articles'][0]['topic']);
670
        $this->assertEquals('ZendCon', $result[0][0]['articles'][1]['topic']);
671
        $this->assertEquals('LINQ', $result[1][0]['articles'][0]['topic']);
672
        $this->assertEquals('PHP7', $result[1][0]['articles'][1]['topic']);
673
    }
674
675
    /**
676
     * select u.id, u.status, p.phonenumber, upper(u.name) nameUpper, a.id, a.topic,
677
     * c.id, c.topic
678
     * from User u
679
     * join u.phonenumbers p
680
     * join u.articles a
681
     * left join a.comments c
682
     * =
683
     * select u.id, u.status, p.phonenumber, upper(u.name) AS u___0, a.id, a.topic,
684
     * c.id, c.topic
685
     * from USERS u
686
     * inner join PHONENUMBERS p ON u.id = p.user_id
687
     * inner join ARTICLES a ON u.id = a.user_id
688
     * left outer join COMMENTS c ON a.id = c.article_id
689
     */
690
    public function testMixedQueryMultipleDeepMixedFetchJoin()
691
    {
692
        $rsm = new ResultSetMapping;
693
694
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
695
        $rsm->addJoinedEntityResult(
696
            'Doctrine\Tests\Models\CMS\CmsPhonenumber',
697
            'p',
698
            'u',
699
            'phonenumbers'
700
        );
701
        $rsm->addJoinedEntityResult(
702
            'Doctrine\Tests\Models\CMS\CmsArticle',
703
            'a',
704
            'u',
705
            'articles'
706
        );
707
        $rsm->addJoinedEntityResult(
708
            'Doctrine\Tests\Models\CMS\CmsComment',
709
            'c',
710
            'a',
711
            'comments'
712
        );
713
        $rsm->addFieldResult('u', 'u__id', 'id');
714
        $rsm->addFieldResult('u', 'u__status', 'status');
715
        $rsm->addScalarResult('sclr0', 'nameUpper', 'string');
716
        $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
717
        $rsm->addFieldResult('a', 'a__id', 'id');
718
        $rsm->addFieldResult('a', 'a__topic', 'topic');
719
        $rsm->addFieldResult('c', 'c__id', 'id');
720
        $rsm->addFieldResult('c', 'c__topic', 'topic');
721
722
        // Faked result set
723
        $resultSet = array(
724
            //row1
725
            array(
726
                'u__id' => '1',
727
                'u__status' => 'developer',
728
                'sclr0' => 'ROMANB',
729
                'p__phonenumber' => '42',
730
                'a__id' => '1',
731
                'a__topic' => 'Getting things done!',
732
                'c__id' => '1',
733
                'c__topic' => 'First!'
734
            ),
735
            array(
736
                'u__id' => '1',
737
                'u__status' => 'developer',
738
                'sclr0' => 'ROMANB',
739
                'p__phonenumber' => '43',
740
                'a__id' => '1',
741
                'a__topic' => 'Getting things done!',
742
                'c__id' => '1',
743
                'c__topic' => 'First!'
744
            ),
745
            array(
746
                'u__id' => '1',
747
                'u__status' => 'developer',
748
                'sclr0' => 'ROMANB',
749
                'p__phonenumber' => '42',
750
                'a__id' => '2',
751
                'a__topic' => 'ZendCon',
752
                'c__id' => null,
753
                'c__topic' => null
754
            ),
755
            array(
756
                'u__id' => '1',
757
                'u__status' => 'developer',
758
                'sclr0' => 'ROMANB',
759
                'p__phonenumber' => '43',
760
                'a__id' => '2',
761
                'a__topic' => 'ZendCon',
762
                'c__id' => null,
763
                'c__topic' => null
764
            ),
765
            array(
766
                'u__id' => '2',
767
                'u__status' => 'developer',
768
                'sclr0' => 'JWAGE',
769
                'p__phonenumber' => '91',
770
                'a__id' => '3',
771
                'a__topic' => 'LINQ',
772
                'c__id' => null,
773
                'c__topic' => null
774
            ),
775
            array(
776
                'u__id' => '2',
777
                'u__status' => 'developer',
778
                'sclr0' => 'JWAGE',
779
                'p__phonenumber' => '91',
780
                'a__id' => '4',
781
                'a__topic' => 'PHP7',
782
                'c__id' => null,
783
                'c__topic' => null
784
            ),
785
        );
786
787
        $stmt     = new HydratorMockStatement($resultSet);
788
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
789
        $result   = $hydrator->hydrateAll($stmt, $rsm);
790
791
        $this->assertEquals(2, count($result));
792
        $this->assertTrue(is_array($result));
793
        $this->assertTrue(is_array($result[0]));
794
        $this->assertTrue(is_array($result[1]));
795
796
        // first user => 2 phonenumbers, 2 articles, 1 comment on first article
797
        $this->assertEquals(2, count($result[0][0]['phonenumbers']));
798
        $this->assertEquals(2, count($result[0][0]['articles']));
799
        $this->assertEquals(1, count($result[0][0]['articles'][0]['comments']));
800
        $this->assertEquals('ROMANB', $result[0]['nameUpper']);
801
        // second user => 1 phonenumber, 2 articles, no comments
802
        $this->assertEquals(1, count($result[1][0]['phonenumbers']));
803
        $this->assertEquals(2, count($result[1][0]['articles']));
804
        $this->assertEquals('JWAGE', $result[1]['nameUpper']);
805
806
        $this->assertEquals(42, $result[0][0]['phonenumbers'][0]['phonenumber']);
807
        $this->assertEquals(43, $result[0][0]['phonenumbers'][1]['phonenumber']);
808
        $this->assertEquals(91, $result[1][0]['phonenumbers'][0]['phonenumber']);
809
810
        $this->assertEquals('Getting things done!', $result[0][0]['articles'][0]['topic']);
811
        $this->assertEquals('ZendCon', $result[0][0]['articles'][1]['topic']);
812
        $this->assertEquals('LINQ', $result[1][0]['articles'][0]['topic']);
813
        $this->assertEquals('PHP7', $result[1][0]['articles'][1]['topic']);
814
815
        $this->assertEquals('First!', $result[0][0]['articles'][0]['comments'][0]['topic']);
816
817
        $this->assertTrue(isset($result[0][0]['articles'][0]['comments']));
818
819
        // empty comment collections
820
        $this->assertTrue(is_array($result[0][0]['articles'][1]['comments']));
821
        $this->assertEquals(0, count($result[0][0]['articles'][1]['comments']));
822
        $this->assertTrue(is_array($result[1][0]['articles'][0]['comments']));
823
        $this->assertEquals(0, count($result[1][0]['articles'][0]['comments']));
824
        $this->assertTrue(is_array($result[1][0]['articles'][1]['comments']));
825
        $this->assertEquals(0, count($result[1][0]['articles'][1]['comments']));
826
    }
827
828
    /**
829
     * Tests that the hydrator does not rely on a particular order of the rows
830
     * in the result set.
831
     *
832
     * DQL:
833
     * select c.id, c.position, c.name, b.id, b.position
834
     * from \Doctrine\Tests\Models\Forum\ForumCategory c inner join c.boards b
835
     * order by c.position asc, b.position asc
836
     *
837
     * Checks whether the boards are correctly assigned to the categories.
838
     *
839
     * The 'evil' result set that confuses the object population is displayed below.
840
     *
841
     * c.id  | c.position | c.name   | boardPos | b.id | b.category_id (just for clarity)
842
     *  1    | 0          | First    | 0        |   1  | 1
843
     *  2    | 0          | Second   | 0        |   2  | 2   <--
844
     *  1    | 0          | First    | 1        |   3  | 1
845
     *  1    | 0          | First    | 2        |   4  | 1
846
     */
847
    public function testEntityQueryCustomResultSetOrder()
848
    {
849
        $rsm = new ResultSetMapping;
850
851
        $rsm->addEntityResult('Doctrine\Tests\Models\Forum\ForumCategory', 'c');
852
        $rsm->addJoinedEntityResult(
853
            'Doctrine\Tests\Models\Forum\ForumBoard',
854
            'b',
855
            'c',
856
            'boards'
857
        );
858
859
        $rsm->addFieldResult('c', 'c__id', 'id');
860
        $rsm->addFieldResult('c', 'c__position', 'position');
861
        $rsm->addFieldResult('c', 'c__name', 'name');
862
        $rsm->addFieldResult('b', 'b__id', 'id');
863
        $rsm->addFieldResult('b', 'b__position', 'position');
864
865
        // Faked result set
866
        $resultSet = array(
867
            array(
868
                'c__id' => '1',
869
                'c__position' => '0',
870
                'c__name' => 'First',
871
                'b__id' => '1',
872
                'b__position' => '0',
873
                //'b__category_id' => '1'
874
            ),
875
            array(
876
                'c__id' => '2',
877
                'c__position' => '0',
878
                'c__name' => 'Second',
879
                'b__id' => '2',
880
                'b__position' => '0',
881
                //'b__category_id' => '2'
882
            ),
883
            array(
884
                'c__id' => '1',
885
                'c__position' => '0',
886
                'c__name' => 'First',
887
                'b__id' => '3',
888
                'b__position' => '1',
889
                //'b__category_id' => '1'
890
            ),
891
            array(
892
                'c__id' => '1',
893
                'c__position' => '0',
894
                'c__name' => 'First',
895
                'b__id' => '4',
896
                'b__position' => '2',
897
                //'b__category_id' => '1'
898
            )
899
        );
900
901
        $stmt     = new HydratorMockStatement($resultSet);
902
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
903
        $result   = $hydrator->hydrateAll($stmt, $rsm);
904
905
        $this->assertEquals(2, count($result));
906
        $this->assertTrue(is_array($result));
907
        $this->assertTrue(is_array($result[0]));
908
        $this->assertTrue(is_array($result[1]));
909
        $this->assertTrue(isset($result[0]['boards']));
910
        $this->assertEquals(3, count($result[0]['boards']));
911
        $this->assertTrue(isset($result[1]['boards']));
912
        $this->assertEquals(1, count($result[1]['boards']));
913
    }
914
915
    /**
916
     * SELECT PARTIAL u.{id,status}, a.id, a.topic, c.id as cid, c.topic as ctopic
917
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
918
     *   LEFT JOIN u.articles a
919
     *   LEFT JOIN a.comments c
920
     *
921
     * @dataProvider provideDataForUserEntityResult
922
     */
923
    public function testChainedJoinWithScalars($entityKey)
924
    {
925
        $rsm = new ResultSetMapping;
926
927
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $entityKey ?: null);
928
        $rsm->addFieldResult('u', 'u__id', 'id');
929
        $rsm->addFieldResult('u', 'u__status', 'status');
930
        $rsm->addScalarResult('a__id', 'id', 'integer');
931
        $rsm->addScalarResult('a__topic', 'topic', 'string');
932
        $rsm->addScalarResult('c__id', 'cid', 'integer');
933
        $rsm->addScalarResult('c__topic', 'ctopic', 'string');
934
935
        // Faked result set
936
        $resultSet = array(
937
            //row1
938
            array(
939
                'u__id' => '1',
940
                'u__status' => 'developer',
941
                'a__id' => '1',
942
                'a__topic' => 'The First',
943
                'c__id' => '1',
944
                'c__topic' => 'First Comment'
945
            ),
946
            array(
947
                'u__id' => '1',
948
                'u__status' => 'developer',
949
                'a__id' => '1',
950
                'a__topic' => 'The First',
951
                'c__id' => '2',
952
                'c__topic' => 'Second Comment'
953
            ),
954
            array(
955
                'u__id' => '1',
956
                'u__status' => 'developer',
957
                'a__id' => '42',
958
                'a__topic' => 'The Answer',
959
                'c__id' => null,
960
                'c__topic' => null
961
            ),
962
        );
963
964
        $stmt     = new HydratorMockStatement($resultSet);
965
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
966
        $result   = $hydrator->hydrateAll($stmt, $rsm);
967
968
        $this->assertEquals(3, count($result));
969
970
        $this->assertEquals(2, count($result[0][$entityKey])); // User array
971
        $this->assertEquals(1, $result[0]['id']);
972
        $this->assertEquals('The First', $result[0]['topic']);
973
        $this->assertEquals(1, $result[0]['cid']);
974
        $this->assertEquals('First Comment', $result[0]['ctopic']);
975
976
        $this->assertEquals(2, count($result[1][$entityKey])); // User array, duplicated
977
        $this->assertEquals(1, $result[1]['id']); // duplicated
978
        $this->assertEquals('The First', $result[1]['topic']); // duplicated
979
        $this->assertEquals(2, $result[1]['cid']);
980
        $this->assertEquals('Second Comment', $result[1]['ctopic']);
981
982
        $this->assertEquals(2, count($result[2][$entityKey])); // User array, duplicated
983
        $this->assertEquals(42, $result[2]['id']);
984
        $this->assertEquals('The Answer', $result[2]['topic']);
985
        $this->assertNull($result[2]['cid']);
986
        $this->assertNull($result[2]['ctopic']);
987
    }
988
989
    /**
990
     * SELECT PARTIAL u.{id, status}
991
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
992
     */
993
    public function testResultIteration()
994
    {
995
        $rsm = new ResultSetMapping;
996
997
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
998
        $rsm->addFieldResult('u', 'u__id', 'id');
999
        $rsm->addFieldResult('u', 'u__name', 'name');
1000
1001
        // Faked result set
1002
        $resultSet = array(
1003
            array(
1004
                'u__id' => '1',
1005
                'u__name' => 'romanb'
1006
            ),
1007
            array(
1008
                'u__id' => '2',
1009
                'u__name' => 'jwage'
1010
            )
1011
        );
1012
1013
        $stmt     = new HydratorMockStatement($resultSet);
1014
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
1015
        $iterator = $hydrator->iterate($stmt, $rsm);
1016
        $rowNum   = 0;
1017
1018
        while (($row = $iterator->next()) !== false) {
1019
            $this->assertEquals(1, count($row));
1020
            $this->assertTrue(is_array($row[0]));
1021
1022
            if ($rowNum == 0) {
1023
                $this->assertEquals(1, $row[0]['id']);
1024
                $this->assertEquals('romanb', $row[0]['name']);
1025
            } else if ($rowNum == 1) {
1026
                $this->assertEquals(2, $row[0]['id']);
1027
                $this->assertEquals('jwage', $row[0]['name']);
1028
            }
1029
1030
            ++$rowNum;
1031
        }
1032
    }
1033
1034
    /**
1035
     * SELECT PARTIAL u.{id, status}
1036
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
1037
     */
1038
    public function testResultIterationWithAliasedUserEntity()
1039
    {
1040
        $rsm = new ResultSetMapping;
1041
1042
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
1043
        $rsm->addFieldResult('u', 'u__id', 'id');
1044
        $rsm->addFieldResult('u', 'u__name', 'name');
1045
1046
        // Faked result set
1047
        $resultSet = array(
1048
            array(
1049
                'u__id' => '1',
1050
                'u__name' => 'romanb'
1051
            ),
1052
            array(
1053
                'u__id' => '2',
1054
                'u__name' => 'jwage'
1055
            )
1056
        );
1057
1058
        $stmt     = new HydratorMockStatement($resultSet);
1059
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
1060
        $iterator = $hydrator->iterate($stmt, $rsm);
1061
        $rowNum   = 0;
1062
1063
        while (($row = $iterator->next()) !== false) {
1064
            $this->assertEquals(1, count($row));
1065
            $this->assertArrayHasKey(0, $row);
1066
            $this->assertArrayHasKey('user', $row[0]);
1067
1068
            if ($rowNum == 0) {
1069
                $this->assertEquals(1, $row[0]['user']['id']);
1070
                $this->assertEquals('romanb', $row[0]['user']['name']);
1071
            } else if ($rowNum == 1) {
1072
                $this->assertEquals(2, $row[0]['user']['id']);
1073
                $this->assertEquals('jwage', $row[0]['user']['name']);
1074
            }
1075
1076
            ++$rowNum;
1077
        }
1078
    }
1079
1080
    /**
1081
     * SELECT PARTIAL u.{id, name}
1082
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
1083
     *
1084
     * @group DDC-644
1085
     */
1086
    public function testSkipUnknownColumns()
1087
    {
1088
        $rsm = new ResultSetMapping;
1089
1090
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
1091
        $rsm->addFieldResult('u', 'u__id', 'id');
1092
        $rsm->addFieldResult('u', 'u__name', 'name');
1093
1094
        // Faked result set
1095
        $resultSet = array(
1096
            array(
1097
                'u__id' => '1',
1098
                'u__name' => 'romanb',
1099
                'foo' => 'bar', // unknown!
1100
            ),
1101
        );
1102
1103
        $stmt     = new HydratorMockStatement($resultSet);
1104
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
1105
        $result   = $hydrator->hydrateAll($stmt, $rsm);
1106
1107
        $this->assertEquals(1, count($result));
1108
        $this->assertArrayHasKey('id', $result[0]);
1109
        $this->assertArrayHasKey('name', $result[0]);
1110
        $this->assertArrayNotHasKey('foo', $result[0]);
1111
    }
1112
1113
    /**
1114
     * SELECT PARTIAL u.{id, status}, UPPER(u.name) AS nameUpper
1115
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
1116
     *
1117
     * @group DDC-1358
1118
     * @dataProvider provideDataForUserEntityResult
1119
     */
1120
    public function testMissingIdForRootEntity($userEntityKey)
1121
    {
1122
        $rsm = new ResultSetMapping;
1123
1124
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1125
        $rsm->addFieldResult('u', 'u__id', 'id');
1126
        $rsm->addFieldResult('u', 'u__status', 'status');
1127
        $rsm->addScalarResult('sclr0', 'nameUpper', 'string');
1128
1129
        // Faked result set
1130
        $resultSet = array(
1131
            //row1
1132
            array(
1133
                'u__id' => '1',
1134
                'u__status' => 'developer',
1135
                'sclr0' => 'ROMANB',
1136
            ),
1137
            array(
1138
                'u__id' => null,
1139
                'u__status' => null,
1140
                'sclr0' => 'ROMANB',
1141
            ),
1142
            array(
1143
                'u__id' => '2',
1144
                'u__status' => 'developer',
1145
                'sclr0' => 'JWAGE',
1146
            ),
1147
            array(
1148
                'u__id' => null,
1149
                'u__status' => null,
1150
                'sclr0' => 'JWAGE',
1151
            ),
1152
        );
1153
1154
        $stmt     = new HydratorMockStatement($resultSet);
1155
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
1156
        $result   = $hydrator->hydrateAll($stmt, $rsm);
1157
1158
        $this->assertEquals(4, count($result), "Should hydrate four results.");
1159
1160
        $this->assertEquals('ROMANB', $result[0]['nameUpper']);
1161
        $this->assertEquals('ROMANB', $result[1]['nameUpper']);
1162
        $this->assertEquals('JWAGE', $result[2]['nameUpper']);
1163
        $this->assertEquals('JWAGE', $result[3]['nameUpper']);
1164
1165
        $this->assertEquals(array('id' => 1, 'status' => 'developer'), $result[0][$userEntityKey]);
1166
        $this->assertNull($result[1][$userEntityKey]);
1167
        $this->assertEquals(array('id' => 2, 'status' => 'developer'), $result[2][$userEntityKey]);
1168
        $this->assertNull($result[3][$userEntityKey]);
1169
    }
1170
1171
    /**
1172
     * SELECT PARTIAL u.{id, status}, UPPER(u.name) AS nameUpper
1173
     *   FROM Doctrine\Tests\Models\CMS\CmsUser u
1174
     *        INDEX BY u.id
1175
     *
1176
     * @group DDC-1385
1177
     * @dataProvider provideDataForUserEntityResult
1178
     */
1179
    public function testIndexByAndMixedResult($userEntityKey)
1180
    {
1181
        $rsm = new ResultSetMapping;
1182
1183
        $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1184
        $rsm->addFieldResult('u', 'u__id', 'id');
1185
        $rsm->addFieldResult('u', 'u__status', 'status');
1186
        $rsm->addScalarResult('sclr0', 'nameUpper', 'string');
1187
        $rsm->addIndexBy('u', 'id');
1188
1189
        // Faked result set
1190
        $resultSet = array(
1191
            //row1
1192
            array(
1193
                'u__id' => '1',
1194
                'u__status' => 'developer',
1195
                'sclr0' => 'ROMANB',
1196
            ),
1197
            array(
1198
                'u__id' => '2',
1199
                'u__status' => 'developer',
1200
                'sclr0' => 'JWAGE',
1201
            ),
1202
        );
1203
1204
        $stmt     = new HydratorMockStatement($resultSet);
1205
        $hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
1206
        $result   = $hydrator->hydrateAll($stmt, $rsm);
1207
1208
        $this->assertEquals(2, count($result));
1209
1210
        $this->assertTrue(isset($result[1]));
1211
        $this->assertEquals(1, $result[1][$userEntityKey]['id']);
1212
1213
        $this->assertTrue(isset($result[2]));
1214
        $this->assertEquals(2, $result[2][$userEntityKey]['id']);
1215
    }
1216
}
1217