1
0
mirror of synced 2025-02-20 14:13:15 +03:00

DDC-1385 - Fix scalar handling for array hydrator

This commit is contained in:
Benjamin Eberlei 2011-10-16 16:27:50 +02:00
parent 2730f64d90
commit ee924ffaba
3 changed files with 64 additions and 31 deletions

View File

@ -174,26 +174,24 @@ class ArrayHydrator extends AbstractHydrator
// Check for an existing element
if ($this->_isSimpleQuery || ! isset($this->_identifierMap[$dqlAlias][$id[$dqlAlias]])) {
$element = $rowData[$dqlAlias];
if ($this->_rsm->isMixed) {
$element = array(0 => $element);
}
if (isset($this->_rsm->indexByMap[$dqlAlias])) {
$field = $this->_rsm->indexByMap[$dqlAlias];
if ($this->_rsm->isMixed) {
$result[] = array($element[$field] => $element);
++$this->_resultCounter;
} else {
$result[$element[$field]] = $element;
}
$resultKey = $rowData[$dqlAlias][$field];
$result[$resultKey] = $element;
} else {
if ($this->_rsm->isMixed) {
$result[] = array($element);
++$this->_resultCounter;
} else {
$result[] = $element;
}
$resultKey = $this->_resultCounter;
$result[] = $element;
++$this->_resultCounter;
}
end($result);
$this->_identifierMap[$dqlAlias][$id[$dqlAlias]] = key($result);
$this->_identifierMap[$dqlAlias][$id[$dqlAlias]] = $resultKey;
} else {
$index = $this->_identifierMap[$dqlAlias][$id[$dqlAlias]];
$resultKey = $index;
/*if ($this->_rsm->isMixed) {
$result[] =& $result[$index];
++$this->_resultCounter;
@ -205,8 +203,12 @@ class ArrayHydrator extends AbstractHydrator
// Append scalar values to mixed result sets
if (isset($scalars)) {
if ( ! isset($resultKey) ) {
$resultKey = $this->_resultCounter - 1;
}
foreach ($scalars as $name => $value) {
$result[$this->_resultCounter - 1][$name] = $value;
$result[$resultKey][$name] = $value;
}
}
}

View File

@ -256,20 +256,20 @@ class ArrayHydratorTest extends HydrationTestCase
$this->assertEquals(2, count($result));
$this->assertTrue(is_array($result));
$this->assertTrue(is_array($result[0]));
$this->assertTrue(is_array($result[1]));
$this->assertTrue(is_array($result[2]));
// test the scalar values
$this->assertEquals('ROMANB', $result[0]['nameUpper']);
$this->assertEquals('JWAGE', $result[1]['nameUpper']);
$this->assertEquals('ROMANB', $result[1]['nameUpper']);
$this->assertEquals('JWAGE', $result[2]['nameUpper']);
// first user => 2 phonenumbers. notice the custom indexing by user id
$this->assertEquals(2, count($result[0]['1']['phonenumbers']));
$this->assertEquals(2, count($result[1][0]['phonenumbers']));
// second user => 1 phonenumber. notice the custom indexing by user id
$this->assertEquals(1, count($result[1]['2']['phonenumbers']));
$this->assertEquals(1, count($result[2][0]['phonenumbers']));
// test the custom indexing of the phonenumbers
$this->assertTrue(isset($result[0]['1']['phonenumbers']['42']));
$this->assertTrue(isset($result[0]['1']['phonenumbers']['43']));
$this->assertTrue(isset($result[1]['2']['phonenumbers']['91']));
$this->assertTrue(isset($result[1][0]['phonenumbers']['42']));
$this->assertTrue(isset($result[1][0]['phonenumbers']['43']));
$this->assertTrue(isset($result[2][0]['phonenumbers']['91']));
}
/**
@ -817,4 +817,43 @@ class ArrayHydratorTest extends HydrationTestCase
$this->assertEquals(array('id' => 2, 'status' => 'developer'), $result[2][0]);
$this->assertNull($result[3][0]);
}
/**
* @group DDC-1385
*/
public function testIndexByAndMixedResult()
{
$rsm = new ResultSetMapping;
$rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
$rsm->addFieldResult('u', 'u__id', 'id');
$rsm->addFieldResult('u', 'u__status', 'status');
$rsm->addScalarResult('sclr0', 'nameUpper');
$rsm->addIndexBy('u', 'id');
// Faked result set
$resultSet = array(
//row1
array(
'u__id' => '1',
'u__status' => 'developer',
'sclr0' => 'ROMANB',
),
array(
'u__id' => '2',
'u__status' => 'developer',
'sclr0' => 'JWAGE',
),
);
$stmt = new HydratorMockStatement($resultSet);
$hydrator = new \Doctrine\ORM\Internal\Hydration\ArrayHydrator($this->_em);
$result = $hydrator->hydrateAll($stmt, $rsm);
$this->assertEquals(2, count($result));
$this->assertTrue(isset($result[1]));
$this->assertEquals(1, $result[1][0]['id']);
$this->assertTrue(isset($result[2]));
$this->assertEquals(2, $result[2][0]['id']);
}
}

View File

@ -1208,12 +1208,4 @@ class ObjectHydratorTest extends HydrationTestCase
$this->assertTrue(isset($result[2]));
$this->assertEquals(2, $result[2][0]->id);
}
/**
* @group DDC-1385
*/
public function testIndexByAndScalarResult()
{
$rsm = new ResultSetMapping;
}
}