File "ArrayHydrator.php"
Full Path: /home/warrior1/public_html/languages/wp-content-20241001222009/plugins/mailpoet/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php
File size: 6.31 KB
MIME-type: text/x-php
Charset: utf-8
<?php
declare (strict_types=1);
namespace MailPoetVendor\Doctrine\ORM\Internal\Hydration;
if (!defined('ABSPATH')) exit;
use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata;
use function count;
use function end;
use function is_array;
use function key;
use function reset;
class ArrayHydrator extends AbstractHydrator
{
private $_rootAliases = [];
private $_isSimpleQuery = \false;
private $_identifierMap = [];
private $_resultPointers = [];
private $_idTemplate = [];
private $_resultCounter = 0;
protected function prepare()
{
$this->_isSimpleQuery = count($this->resultSetMapping()->aliasMap) <= 1;
foreach ($this->resultSetMapping()->aliasMap as $dqlAlias => $className) {
$this->_identifierMap[$dqlAlias] = [];
$this->_resultPointers[$dqlAlias] = [];
$this->_idTemplate[$dqlAlias] = '';
}
}
protected function hydrateAllData()
{
$result = [];
while ($data = $this->statement()->fetchAssociative()) {
$this->hydrateRowData($data, $result);
}
return $result;
}
protected function hydrateRowData(array $row, array &$result)
{
// 1) Initialize
$id = $this->_idTemplate;
// initialize the id-memory
$nonemptyComponents = [];
$rowData = $this->gatherRowData($row, $id, $nonemptyComponents);
// 2) Now hydrate the data found in the current row.
foreach ($rowData['data'] as $dqlAlias => $data) {
$index = \false;
if (isset($this->resultSetMapping()->parentAliasMap[$dqlAlias])) {
// It's a joined result
$parent = $this->resultSetMapping()->parentAliasMap[$dqlAlias];
$path = $parent . '.' . $dqlAlias;
// missing parent data, skipping as RIGHT JOIN hydration is not supported.
if (!isset($nonemptyComponents[$parent])) {
continue;
}
// Get a reference to the right element in the result tree.
// This element will get the associated element attached.
if ($this->resultSetMapping()->isMixed && isset($this->_rootAliases[$parent])) {
$first = reset($this->_resultPointers);
// TODO: Exception if $key === null ?
$baseElement =& $this->_resultPointers[$parent][key($first)];
} elseif (isset($this->_resultPointers[$parent])) {
$baseElement =& $this->_resultPointers[$parent];
} else {
unset($this->_resultPointers[$dqlAlias]);
// Ticket #1228
continue;
}
$relationAlias = $this->resultSetMapping()->relationMap[$dqlAlias];
$parentClass = $this->_metadataCache[$this->resultSetMapping()->aliasMap[$parent]];
$relation = $parentClass->associationMappings[$relationAlias];
// Check the type of the relation (many or single-valued)
if (!($relation['type'] & ClassMetadata::TO_ONE)) {
$oneToOne = \false;
if (!isset($baseElement[$relationAlias])) {
$baseElement[$relationAlias] = [];
}
if (isset($nonemptyComponents[$dqlAlias])) {
$indexExists = isset($this->_identifierMap[$path][$id[$parent]][$id[$dqlAlias]]);
$index = $indexExists ? $this->_identifierMap[$path][$id[$parent]][$id[$dqlAlias]] : \false;
$indexIsValid = $index !== \false ? isset($baseElement[$relationAlias][$index]) : \false;
if (!$indexExists || !$indexIsValid) {
$element = $data;
if (isset($this->resultSetMapping()->indexByMap[$dqlAlias])) {
$baseElement[$relationAlias][$row[$this->resultSetMapping()->indexByMap[$dqlAlias]]] = $element;
} else {
$baseElement[$relationAlias][] = $element;
}
end($baseElement[$relationAlias]);
$this->_identifierMap[$path][$id[$parent]][$id[$dqlAlias]] = key($baseElement[$relationAlias]);
}
}
} else {
$oneToOne = \true;
if (!isset($nonemptyComponents[$dqlAlias]) && !isset($baseElement[$relationAlias])) {
$baseElement[$relationAlias] = null;
} elseif (!isset($baseElement[$relationAlias])) {
$baseElement[$relationAlias] = $data;
}
}
$coll =& $baseElement[$relationAlias];
if (is_array($coll)) {
$this->updateResultPointer($coll, $index, $dqlAlias, $oneToOne);
}
} else {
// It's a root result element
$this->_rootAliases[$dqlAlias] = \true;
// Mark as root
$entityKey = $this->resultSetMapping()->entityMappings[$dqlAlias] ?: 0;
// if this row has a NULL value for the root result id then make it a null result.
if (!isset($nonemptyComponents[$dqlAlias])) {
$result[] = $this->resultSetMapping()->isMixed ? [$entityKey => null] : null;
$resultKey = $this->_resultCounter;
++$this->_resultCounter;
continue;
}
// Check for an existing element
if ($this->_isSimpleQuery || !isset($this->_identifierMap[$dqlAlias][$id[$dqlAlias]])) {
$element = $this->resultSetMapping()->isMixed ? [$entityKey => $data] : $data;
if (isset($this->resultSetMapping()->indexByMap[$dqlAlias])) {
$resultKey = $row[$this->resultSetMapping()->indexByMap[$dqlAlias]];
$result[$resultKey] = $element;
} else {
$resultKey = $this->_resultCounter;
$result[] = $element;
++$this->_resultCounter;
}
$this->_identifierMap[$dqlAlias][$id[$dqlAlias]] = $resultKey;
} else {
$index = $this->_identifierMap[$dqlAlias][$id[$dqlAlias]];
$resultKey = $index;
}
$this->updateResultPointer($result, $index, $dqlAlias, \false);
}
}
if (!isset($resultKey)) {
$this->_resultCounter++;
}
// Append scalar values to mixed result sets
if (isset($rowData['scalars'])) {
if (!isset($resultKey)) {
// this only ever happens when no object is fetched (scalar result only)
$resultKey = isset($this->resultSetMapping()->indexByMap['scalars']) ? $row[$this->resultSetMapping()->indexByMap['scalars']] : $this->_resultCounter - 1;
}
foreach ($rowData['scalars'] as $name => $value) {
$result[$resultKey][$name] = $value;
}
}
// Append new object to mixed result sets
if (isset($rowData['newObjects'])) {
if (!isset($resultKey)) {
$resultKey = $this->_resultCounter - 1;
}
$scalarCount = isset($rowData['scalars']) ? count($rowData['scalars']) : 0;
foreach ($rowData['newObjects'] as $objIndex => $newObject) {
$class = $newObject['class'];
$args = $newObject['args'];
$obj = $class->newInstanceArgs($args);
if (count($args) === $scalarCount || $scalarCount === 0 && count($rowData['newObjects']) === 1) {
$result[$resultKey] = $obj;
continue;
}
$result[$resultKey][$objIndex] = $obj;
}
}
}
private function updateResultPointer(?array &$coll, $index, string $dqlAlias, bool $oneToOne) : void
{
if ($coll === null) {
unset($this->_resultPointers[$dqlAlias]);
// Ticket #1228
return;
}
if ($oneToOne) {
$this->_resultPointers[$dqlAlias] =& $coll;
return;
}
if ($index !== \false) {
$this->_resultPointers[$dqlAlias] =& $coll[$index];
return;
}
if (!$coll) {
return;
}
end($coll);
$this->_resultPointers[$dqlAlias] =& $coll[key($coll)];
}
}