ArrayHydratorTest.php 41 KB

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