public function map($entityName, IQueryBuilder $queryBuilder)\r
{\r
$queryString = $queryBuilder->buildQuery();\r
- \r
+\r
$statement = $this->_db->prepare(sprintf($queryString,\r
$this->_maps[$entityName]['table']\r
));\r
public function save(IDivineEntity $entity)\r
{\r
$queries = AbstractPopulationHelper::generateUpdateSaveQuery($this->_maps, $entity, $entity->getId(), $this->_db);\r
+ $mergeMap = array();\r
+ \r
+ echo 'pre flattened: <br />';\r
+ echo '<pre>';\r
+ print_r($queries);\r
+ echo '</pre>';\r
\r
$flattened = array();\r
$flattened_tables = array();\r
{\r
$this_table = $query['table'];\r
$this_columns = $query['columns'];\r
- \r
+ $flatten = true;\r
for($i = $index+1; $i<count($queries); $i++)\r
{\r
if($queries[$i]['table'] == $this_table && !in_array($queries[$i]['table'], $flattened_tables) && !isset($query['id'])) //only merge create queries, updates are fine to run multiple times\r
{\r
- $this_columns = array_merge($this_columns, $queries[$i]['columns']);\r
+ //XXX: This whole biz is tricky. Basically the problem is that when creating a new simfile,\r
+ //the datamapper spews out a bunch of create queries. When parsing a simfile for example, there can\r
+ //be huge redundency - it may produce 5 queries that all create the same step artist, for example.\r
+ //We attempt to flatten equivalent queries. Originally I was basing it purely on the table name or something,\r
+ //but that is not enough. In the case of steps, it ends up mergin all the steps together, so we need to\r
+ //check if the arrays are equal as well, which is what this does.\r
+ if($this_columns === $queries[$i]['columns'])\r
+ {\r
+ $this_columns = array_merge($this_columns, $queries[$i]['columns']);\r
+ //need to keep track of what we merged as future queries might reference the old ids.\r
+ $mergeMap[$i] = $index;\r
+ } else {\r
+ //we need to add these unmerged ones here as further down we record that anything to\r
+ //do with this table has been sorted out.\r
+// $prepared = isset($queries[$i]['prepared']) ? $queries[$i]['prepared'] : null;\r
+// $id = isset($queries[$i]['id']) ? $queries[$i]['id'] : null;\r
+// $flattened[] = array('columns' => $queries[$i]['columns'], 'table' => $queries[$i]['table'], 'prepared' => $prepared, 'id' => $id);\r
+ $flatten = false;\r
+ }\r
}\r
}\r
\r
if(!in_array($this_table, $flattened_tables))\r
{\r
- $flattened_tables[] = $this_table;\r
+ if($flatten) $flattened_tables[] = $this_table;\r
$prepared = isset($query['prepared']) ? $query['prepared'] : null;\r
$id = isset($query['id']) ? $query['id'] : null;\r
$flattened[] = array('columns' => $this_columns, 'table' => $this_table, 'prepared' => $prepared, 'id' => $id);\r
}\r
}\r
\r
- $queries = array();\r
+ echo 'flattened: <br />';\r
+ echo '<pre>';\r
+ print_r($flattened);\r
+ echo '</pre>';\r
\r
+ $queries = array();\r
+ \r
foreach($flattened as $info)\r
{\r
if(isset($info['id']))\r
\r
$queries[] = $query;\r
}\r
- \r
+ \r
// if($queries['TYPE'] == AbstractPopulationHelper::QUERY_TYPE_CREATE)\r
// {\r
$idMap = [];\r
{\r
$statement = $this->_db->prepare($query);\r
$statement->execute();\r
- $refIndex = $index+1;\r
- $idMap['INDEX_REF_' . $refIndex] = $this->_db->lastInsertId();\r
+ //$refIndex = $index+1; This was being used as the index for idMap below. I have nfi why I was adding 1.\r
+ $idMap['INDEX_REF_' . $index] = $this->_db->lastInsertId();\r
+ \r
+ foreach($mergeMap as $oldIndex => $mergedIndex) {\r
+ if($mergedIndex == $index) {\r
+ $idMap['INDEX_REF_' . $oldIndex] = $idMap['INDEX_REF_' . $index];\r
+ }\r
+ }\r
+ \r
unset($queries[$index]);\r
} else {\r
//update query so that other references are resolved.\r
$statement->execute();\r
}\r
//}\r
- \r
- $entity->setId(end($idMap));\r
+ \r
+ if(!$entity->getId()) $entity->setId(end($idMap));\r
\r
return $entity;\r
}\r