I think uploading packs is more or less working. I nutted out a few bugs in a lot...
[rock.divinelegy.git] / DataAccess / DataMapper / DataMapper.php
index 24b7994..24a7d5a 100644 (file)
@@ -23,7 +23,7 @@ class DataMapper implements IDataMapper
     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
@@ -56,6 +56,12 @@ class DataMapper implements IDataMapper
     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
@@ -63,26 +69,49 @@ class DataMapper implements IDataMapper
         {\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
@@ -99,7 +128,7 @@ class DataMapper implements IDataMapper
             \r
             $queries[] = $query;\r
         }\r
-        \r
+                        \r
        // if($queries['TYPE'] == AbstractPopulationHelper::QUERY_TYPE_CREATE)\r
        // {\r
             $idMap = [];\r
@@ -123,8 +152,15 @@ class DataMapper implements IDataMapper
                 {\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
@@ -140,8 +176,8 @@ class DataMapper implements IDataMapper
                 $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