Failed Conditions
Pull Request — develop (#6873)
by
unknown
112:44 queued 47:41
created

testEntityQueryCustomResultSetOrder()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 66
Code Lines 44

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 44
nc 1
nop 0
dl 0
loc 66
rs 9.3191
c 0
b 0
f 0

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