/**
  * This issue tests if, with multiple joined multiple-valued collections the hydration is done correctly.
  *
  * User x Phonenumbers x Groups blow up the resultset quite a bit, however the hydration should correctly assemble those.
  *
  * @group DDC-809
  */
 public function testManyToManyHydration()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsUser', 'u');
     $rsm->addFieldResult('u', 'u__id', 'id');
     $rsm->addFieldResult('u', 'u__name', 'name');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsGroup', 'g', 'u', 'groups');
     $rsm->addFieldResult('g', 'g__id', 'id');
     $rsm->addFieldResult('g', 'g__name', 'name');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsPhonenumber', 'p', 'u', 'phonenumbers');
     $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
     // Faked result set
     $resultSet = array(array('u__id' => '1', 'u__name' => 'romanb', 'g__id' => '3', 'g__name' => 'TestGroupB', 'p__phonenumber' => 1111), array('u__id' => '1', 'u__name' => 'romanb', 'g__id' => '5', 'g__name' => 'TestGroupD', 'p__phonenumber' => 1111), array('u__id' => '1', 'u__name' => 'romanb', 'g__id' => '3', 'g__name' => 'TestGroupB', 'p__phonenumber' => 2222), array('u__id' => '1', 'u__name' => 'romanb', 'g__id' => '5', 'g__name' => 'TestGroupD', 'p__phonenumber' => 2222), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '2', 'g__name' => 'TestGroupA', 'p__phonenumber' => 3333), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '3', 'g__name' => 'TestGroupB', 'p__phonenumber' => 3333), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '4', 'g__name' => 'TestGroupC', 'p__phonenumber' => 3333), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '5', 'g__name' => 'TestGroupD', 'p__phonenumber' => 3333), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '2', 'g__name' => 'TestGroupA', 'p__phonenumber' => 4444), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '3', 'g__name' => 'TestGroupB', 'p__phonenumber' => 4444), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '4', 'g__name' => 'TestGroupC', 'p__phonenumber' => 4444), array('u__id' => '2', 'u__name' => 'jwage', 'g__id' => '5', 'g__name' => 'TestGroupD', 'p__phonenumber' => 4444));
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
     $this->assertEquals(2, count($result));
     $this->assertContainsOnly('Doctrine\\Tests\\Models\\CMS\\CmsUser', $result);
     $this->assertEquals(2, count($result[0]->groups));
     $this->assertEquals(2, count($result[0]->phonenumbers));
     $this->assertEquals(4, count($result[1]->groups));
     $this->assertEquals(2, count($result[1]->phonenumbers));
 }
Esempio n. 2
0
 /**
  * @group DDC-3076
  *
  * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException
  * @expectedExceptionMessage The discriminator value "subworker" is invalid. It must be one of "person", "manager", "employee".
  */
 public function testInvalidDiscriminatorValueException()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\Company\\CompanyPerson', 'p');
     $rsm->addFieldResult('p', 'p__id', 'id');
     $rsm->addFieldResult('p', 'p__name', 'name');
     $rsm->addMetaResult('p', 'discr', 'discr');
     $rsm->setDiscriminatorColumn('p', 'discr');
     $resultSet = array(array('p__id' => '1', 'p__name' => 'Fabio B. Silva', 'discr' => 'subworker'));
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $hydrator->hydrateAll($stmt, $rsm);
 }
 /**
  * @group DDC-1470
  *
  * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException
  * @expectedExceptionMessage The discriminator column "discr" is missing for "Doctrine\Tests\Models\Company\CompanyEmployee" using the DQL alias "e".
  */
 public function testMissingDiscriminatorColumnException()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\Company\\CompanyFixContract', 'c');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\Company\\CompanyEmployee', 'e', 'c', 'salesPerson');
     $rsm->addFieldResult('c', 'c__id', 'id');
     $rsm->addMetaResult('c', 'c_discr', 'discr');
     $rsm->setDiscriminatorColumn('c', 'c_discr');
     $rsm->addFieldResult('e', 'e__id', 'id');
     $rsm->addFieldResult('e', 'e__name', 'name');
     $rsm->addMetaResult('e ', 'e_discr', 'discr');
     $rsm->setDiscriminatorColumn('e', 'e_discr');
     $resultSet = array(array('c__id' => '1', 'c_discr' => 'fix', 'e__id' => '1', 'e__name' => 'Fabio B. Silva'));
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $hydrator->hydrateAll($stmt, $rsm);
 }
 /**
  * [romanb: 2000 rows => 0.6 seconds]
  *
  * MAXIMUM TIME: 1 second
  */
 public function testMixedQueryFetchJoinFullObjectHydrationPerformance2000Rows()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsUser', 'u');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsPhonenumber', 'p', 'u', 'phonenumbers');
     $rsm->addFieldResult('u', 'u__id', 'id');
     $rsm->addFieldResult('u', 'u__status', 'status');
     $rsm->addFieldResult('u', 'u__username', 'username');
     $rsm->addFieldResult('u', 'u__name', 'name');
     $rsm->addScalarResult('sclr0', 'nameUpper');
     $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsAddress', 'a', 'u', 'address');
     $rsm->addFieldResult('a', 'a__id', 'id');
     // Faked result set
     $resultSet = array(array('u__id' => '1', 'u__status' => 'developer', 'u__username' => 'romanb', 'u__name' => 'Roman', 'sclr0' => 'ROMANB', 'p__phonenumber' => '42', 'a__id' => '1'));
     for ($i = 2; $i < 2000; ++$i) {
         $resultSet[] = array('u__id' => $i, 'u__status' => 'developer', 'u__username' => 'jwage', 'u__name' => 'Jonathan', 'sclr0' => 'JWAGE' . $i, 'p__phonenumber' => '91', 'a__id' => $i);
     }
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $this->setMaxRunningTime(1);
     $s = microtime(true);
     $result = $hydrator->hydrateAll($stmt, $rsm);
     $e = microtime(true);
     echo __FUNCTION__ . " - " . ($e - $s) . " seconds" . PHP_EOL;
 }
 /**
  * @group DDC-1358
  */
 public function testMissingIdForSingleValuedChildEntity()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsUser', 'u');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsAddress', 'a', 'u', 'address');
     $rsm->addFieldResult('u', 'u__id', 'id');
     $rsm->addFieldResult('u', 'u__status', 'status');
     $rsm->addScalarResult('sclr0', 'nameUpper');
     $rsm->addFieldResult('a', 'a__id', 'id');
     $rsm->addFieldResult('a', 'a__city', 'city');
     $rsm->addMetaResult('a', 'user_id', 'user_id');
     // Faked result set
     $resultSet = array(array('u__id' => '1', 'u__status' => 'developer', 'sclr0' => 'ROMANB', 'a__id' => 1, 'a__city' => 'Berlin'), array('u__id' => '2', 'u__status' => 'developer', 'sclr0' => 'BENJAMIN', 'a__id' => null, 'a__city' => null));
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
     $this->assertEquals(2, count($result));
     $this->assertInstanceOf('Doctrine\\Tests\\Models\\CMS\\CmsAddress', $result[0][0]->address);
     $this->assertNull($result[1][0]->address);
 }
 public function testChainedJoinWithEmptyCollections()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsUser', 'u');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsArticle', 'a', 'u', 'articles');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsComment', 'c', 'a', 'comments');
     $rsm->addFieldResult('u', 'u__id', 'id');
     $rsm->addFieldResult('u', 'u__status', 'status');
     $rsm->addFieldResult('a', 'a__id', 'id');
     $rsm->addFieldResult('a', 'a__topic', 'topic');
     $rsm->addFieldResult('c', 'c__id', 'id');
     $rsm->addFieldResult('c', 'c__topic', 'topic');
     // Faked result set
     $resultSet = array(array('u__id' => '1', 'u__status' => 'developer', 'a__id' => null, 'a__topic' => null, 'c__id' => null, 'c__topic' => null), array('u__id' => '2', 'u__status' => 'developer', 'a__id' => null, 'a__topic' => null, 'c__id' => null, 'c__topic' => null));
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
     $this->assertEquals(2, count($result));
     $this->assertTrue($result[0] instanceof CmsUser);
     $this->assertTrue($result[1] instanceof CmsUser);
     $this->assertEquals(0, $result[0]->articles->count());
     $this->assertEquals(0, $result[1]->articles->count());
 }
 /**
  * [romanb: 2000 rows => 3.1 seconds]
  *
  * MAXIMUM TIME: 4 seconds
  */
 public function testMixedQueryFetchJoinObjectHydrationPerformance()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsUser', 'u');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsPhonenumber', 'p', 'u', $this->_em->getClassMetadata('Doctrine\\Tests\\Models\\CMS\\CmsUser')->getAssociationMapping('phonenumbers'));
     $rsm->addFieldResult('u', 'u__id', 'id');
     $rsm->addFieldResult('u', 'u__status', 'status');
     $rsm->addFieldResult('u', 'u__username', 'username');
     $rsm->addFieldResult('u', 'u__name', 'name');
     $rsm->addScalarResult('sclr0', 'nameUpper');
     $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
     // Faked result set
     $resultSet = array(array('u__id' => '1', 'u__status' => 'developer', 'u__username' => 'romanb', 'u__name' => 'Roman', 'sclr0' => 'ROMANB', 'p__phonenumber' => '42'), array('u__id' => '1', 'u__status' => 'developer', 'u__username' => 'romanb', 'u__name' => 'Roman', 'sclr0' => 'ROMANB', 'p__phonenumber' => '43'), array('u__id' => '2', 'u__status' => 'developer', 'u__username' => 'romanb', 'u__name' => 'Roman', 'sclr0' => 'JWAGE', 'p__phonenumber' => '91'));
     for ($i = 4; $i < 2000; ++$i) {
         $resultSet[] = array('u__id' => $i, 'u__status' => 'developer', 'u__username' => 'jwage', 'u__name' => 'Jonathan', 'sclr0' => 'JWAGE' . $i, 'p__phonenumber' => '91');
     }
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $this->setMaxRunningTime(4);
     $result = $hydrator->hydrateAll($stmt, $rsm);
 }
 /**
  * SELECT UPPER(u.name) AS nameUpper
  *   FROM Doctrine\Tests\Models\CMS\CmsUser u
  *
  * @group DDC-1385
  * @dataProvider provideDataForUserEntityResult
  */
 public function testIndexByScalarsOnly($userEntityKey)
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\CMS\\CmsUser', 'u', $userEntityKey ?: null);
     $rsm->addScalarResult('sclr0', 'nameUpper');
     $rsm->addIndexByScalar('sclr0');
     // Faked result set
     $resultSet = array(array('sclr0' => 'ROMANB'), array('sclr0' => 'JWAGE'));
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
     $this->assertEquals(array('ROMANB' => array('nameUpper' => 'ROMANB'), 'JWAGE' => array('nameUpper' => 'JWAGE')), $result);
 }
Esempio n. 9
0
 /**
  * Tests that the hydrator does not rely on a particular order of the rows
  * in the result set.
  *
  * DQL:
  * select c.id, c.position, c.name, b.id, b.position
  * from \Doctrine\Tests\Models\Forum\ForumCategory c inner join c.boards b
  * order by c.position asc, b.position asc
  *
  * Checks whether the boards are correctly assigned to the categories.
  *
  * The 'evil' result set that confuses the object population is displayed below.
  *
  * c.id  | c.position | c.name   | boardPos | b.id | b.category_id (just for clarity)
  *  1    | 0          | First    | 0        |   1  | 1
  *  2    | 0          | Second   | 0        |   2  | 2   <--
  *  1    | 0          | First    | 1        |   3  | 1
  *  1    | 0          | First    | 2        |   4  | 1
  */
 public function testNewHydrationEntityQueryCustomResultSetOrder()
 {
     $rsm = new ResultSetMapping();
     $rsm->addEntityResult('Doctrine\\Tests\\Models\\Forum\\ForumCategory', 'c');
     $rsm->addJoinedEntityResult('Doctrine\\Tests\\Models\\Forum\\ForumBoard', 'b', 'c', $this->_em->getClassMetadata('Doctrine\\Tests\\Models\\Forum\\ForumCategory')->getAssociationMapping('boards'));
     $rsm->addFieldResult('c', 'c__id', 'id');
     $rsm->addFieldResult('c', 'c__position', 'position');
     $rsm->addFieldResult('c', 'c__name', 'name');
     $rsm->addFieldResult('b', 'b__id', 'id');
     $rsm->addFieldResult('b', 'b__position', 'position');
     // Faked result set
     $resultSet = array(array('c__id' => '1', 'c__position' => '0', 'c__name' => 'First', 'b__id' => '1', 'b__position' => '0'), array('c__id' => '2', 'c__position' => '0', 'c__name' => 'Second', 'b__id' => '2', 'b__position' => '0'), array('c__id' => '1', 'c__position' => '0', 'c__name' => 'First', 'b__id' => '3', 'b__position' => '1'), array('c__id' => '1', 'c__position' => '0', 'c__name' => 'First', 'b__id' => '4', 'b__position' => '2'));
     $stmt = new HydratorMockStatement($resultSet);
     $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
     $result = $hydrator->hydrateAll($stmt, $rsm);
     $this->assertEquals(2, count($result));
     $this->assertTrue($result[0] instanceof \Doctrine\Tests\Models\Forum\ForumCategory);
     $this->assertTrue($result[1] instanceof \Doctrine\Tests\Models\Forum\ForumCategory);
     $this->assertEquals(1, $result[0]->getId());
     $this->assertEquals(2, $result[1]->getId());
     $this->assertTrue(isset($result[0]->boards));
     $this->assertEquals(3, count($result[0]->boards));
     $this->assertTrue(isset($result[1]->boards));
     $this->assertEquals(1, count($result[1]->boards));
 }