first (ugly) draft for array population algorithm
This commit is contained in:
parent
7130cb5a38
commit
e77b65bbcf
@ -626,7 +626,7 @@ class Doctrine_Hydrate implements Serializable
|
|||||||
}
|
}
|
||||||
|
|
||||||
$stmt = $this->_conn->execute($query, $params);
|
$stmt = $this->_conn->execute($query, $params);
|
||||||
return (array) $this->parseData($stmt);
|
return $stmt;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* execute
|
* execute
|
||||||
@ -646,7 +646,8 @@ class Doctrine_Hydrate implements Serializable
|
|||||||
|
|
||||||
if ($cached === null) {
|
if ($cached === null) {
|
||||||
// cache miss
|
// cache miss
|
||||||
$array = $this->_execute($params, $return);
|
$stmt = $this->_execute($params, $return);
|
||||||
|
$array = $this->parseData($stmt);
|
||||||
|
|
||||||
$cached = $this->getCachedForm($array);
|
$cached = $this->getCachedForm($array);
|
||||||
|
|
||||||
@ -673,11 +674,12 @@ class Doctrine_Hydrate implements Serializable
|
|||||||
$this->_aliasMap = $map;
|
$this->_aliasMap = $map;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$array = $this->_execute($params, $return);
|
$stmt = $this->_execute($params, $return);
|
||||||
}
|
if ($return === Doctrine::FETCH_ARRAY) {
|
||||||
|
return $this->parseData2($stmt);
|
||||||
if ($return === Doctrine::FETCH_ARRAY) {
|
} else {
|
||||||
return $array;
|
$array = $this->parseData($stmt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($this->_aliasMap)) {
|
if (empty($this->_aliasMap)) {
|
||||||
@ -892,6 +894,127 @@ class Doctrine_Hydrate implements Serializable
|
|||||||
|
|
||||||
return $str;
|
return $str;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* parseData
|
||||||
|
* parses the data returned by statement object
|
||||||
|
*
|
||||||
|
* @param mixed $stmt
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function parseData2($stmt)
|
||||||
|
{
|
||||||
|
$array = array();
|
||||||
|
$cache = array();
|
||||||
|
$rootMap = reset($this->_aliasMap);
|
||||||
|
$rootAlias = key($this->_aliasMap);
|
||||||
|
$index = 0;
|
||||||
|
$incr = true;
|
||||||
|
$lastAlias = '';
|
||||||
|
$currData = array();
|
||||||
|
|
||||||
|
|
||||||
|
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
|
foreach ($data as $key => $value) {
|
||||||
|
if ( ! isset($cache[$key])) {
|
||||||
|
$e = explode('__', $key);
|
||||||
|
$cache[$key]['field'] = $field = strtolower(array_pop($e));
|
||||||
|
$componentAlias = $this->_tableAliases[strtolower(implode('__', $e))];
|
||||||
|
|
||||||
|
$cache[$key]['alias'] = $componentAlias;
|
||||||
|
|
||||||
|
if (isset($this->_aliasMap[$componentAlias]['relation'])) {
|
||||||
|
$cache[$key]['component'] = $this->_aliasMap[$componentAlias]['relation']->getAlias();
|
||||||
|
$cache[$key]['parent'] = $this->_aliasMap[$componentAlias]['parent'];
|
||||||
|
} else {
|
||||||
|
$cache[$key]['component'] = $this->_aliasMap[$componentAlias]['table']->getComponentName();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp = array();
|
||||||
|
$alias = $cache[$key]['alias'];
|
||||||
|
$component = $cache[$key]['component'];
|
||||||
|
|
||||||
|
|
||||||
|
if ( ! isset($currData[$alias])) {
|
||||||
|
$currData[$alias] = array();
|
||||||
|
}
|
||||||
|
if ( ! isset($prev[$alias])) {
|
||||||
|
$prev[$alias] = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($lastAlias !== $alias) {
|
||||||
|
// component changed
|
||||||
|
|
||||||
|
if ($alias === $rootAlias) {
|
||||||
|
// dealing with root component
|
||||||
|
|
||||||
|
if ( ! isset($prevData[$alias]) || $currData[$alias] !== $prevData[$alias]) {
|
||||||
|
if ( ! empty($currData[$alias])) {
|
||||||
|
|
||||||
|
$array[$index] = $currData[$alias];
|
||||||
|
$prev[$alias] =& $array[$index];
|
||||||
|
$index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$parent = $cache[$key]['parent'];
|
||||||
|
$relation = $this->_aliasMap[$cache[$key]['alias']]['relation'];
|
||||||
|
|
||||||
|
if ( ! isset($prevData[$alias]) || $currData[$alias] !== $prevData[$alias]) {
|
||||||
|
if ($relation->getType() >= Doctrine_Relation::MANY) {
|
||||||
|
$prev[$parent][$component][] = $currData[$alias];
|
||||||
|
} else {
|
||||||
|
$prev[$parent][$component] = $currData[$alias];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isset($currData[$alias])) {
|
||||||
|
$prevData[$alias] = $currData[$alias];
|
||||||
|
} else {
|
||||||
|
$prevData[$alias] = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$field = $cache[$key]['field'];
|
||||||
|
$currData[$alias][$field] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lastAlias = $alias;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($currData as $alias => $data) {
|
||||||
|
if ($alias === $rootAlias) {
|
||||||
|
// dealing with root component
|
||||||
|
|
||||||
|
if ( ! isset($prevData[$alias]) || $currData[$alias] !== $prevData[$alias]) {
|
||||||
|
if ( ! empty($currData[$alias])) {
|
||||||
|
|
||||||
|
$array[$index] = $currData[$alias];
|
||||||
|
$prev[$alias] =& $array[$index];
|
||||||
|
$index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$parent = $cache[$key]['parent'];
|
||||||
|
$relation = $this->_aliasMap[$cache[$key]['alias']]['relation'];
|
||||||
|
|
||||||
|
if ( ! isset($prevData[$alias]) || $currData[$alias] !== $prevData[$alias]) {
|
||||||
|
if ($relation->getType() >= Doctrine_Relation::MANY) {
|
||||||
|
$prev[$parent][$component][] = $currData[$alias];
|
||||||
|
} else {
|
||||||
|
$prev[$parent][$component] = $currData[$alias];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$stmt->closeCursor();
|
||||||
|
unset($cache);
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* parseData
|
* parseData
|
||||||
* parses the data returned by statement object
|
* parses the data returned by statement object
|
||||||
@ -906,7 +1029,7 @@ class Doctrine_Hydrate implements Serializable
|
|||||||
|
|
||||||
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
foreach ($data as $key => $value) {
|
foreach ($data as $key => $value) {
|
||||||
if (!isset($cache[$key])) {
|
if ( ! isset($cache[$key])) {
|
||||||
$e = explode('__', $key);
|
$e = explode('__', $key);
|
||||||
$cache[$key]['field'] = strtolower(array_pop($e));
|
$cache[$key]['field'] = strtolower(array_pop($e));
|
||||||
$cache[$key]['component'] = strtolower(implode('__', $e));
|
$cache[$key]['component'] = strtolower(implode('__', $e));
|
||||||
@ -915,11 +1038,11 @@ class Doctrine_Hydrate implements Serializable
|
|||||||
$data[$cache[$key]['component']][$cache[$key]['field']] = $value;
|
$data[$cache[$key]['component']][$cache[$key]['field']] = $value;
|
||||||
|
|
||||||
unset($data[$key]);
|
unset($data[$key]);
|
||||||
};
|
}
|
||||||
$array[] = $data;
|
$array[] = $data;
|
||||||
};
|
}
|
||||||
$stmt->closeCursor();
|
$stmt->closeCursor();
|
||||||
unset($cache);
|
|
||||||
return $array;
|
return $array;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user