/**
* @param DibiRow[] $data
* @param HydratorMeta $hydratorMeta
* @param array|null $relationshipsFilter
* @return array
*/
public function buildResultsGraph(array $data, HydratorMeta $hydratorMeta, array $relationshipsFilter = null)
{
$results = array_fill_keys(array_keys($hydratorMeta->getTablesByPrefixes()), array());
$index = array();
foreach ($data as $row) {
$currentPrimaryKeys = array();
foreach ($hydratorMeta->getTablesByPrefixes() as $prefix => $table) {
$alias = $prefix . QueryHelper::PREFIX_SEPARATOR . $hydratorMeta->getPrimaryKeyByTable($table);
if (isset($row[$alias])) {
$currentPrimaryKeys[$prefix] = $row[$alias];
}
}
foreach ($row as $field => $value) {
if (!isset($index[$field])) {
$index[$field] = explode(QueryHelper::PREFIX_SEPARATOR, $field, 2);
}
list($prefix, $field) = $index[$field];
if (!isset($results[$prefix]) or !isset($currentPrimaryKeys[$prefix]) or isset($results[$prefix][$currentPrimaryKeys[$prefix]][$field])) {
continue;
}
if (!isset($results[$prefix][$currentPrimaryKeys[$prefix]])) {
$results[$prefix][$currentPrimaryKeys[$prefix]] = array();
}
$results[$prefix][$currentPrimaryKeys[$prefix]][$field] = $value;
}
}
foreach ($results as $prefix => $rows) {
$results[$prefix] = Result::createInstance($rows, $hydratorMeta->getTableByPrefix($prefix), $this->connection, $this->mapper);
}
$relationships = $hydratorMeta->getRelationships($relationshipsFilter);
if (!empty($relationships)) {
$this->linkResults($results, $relationships);
}
return $results;
}