/** * @param bool $sort = true * @return array */ public function getCreateStatements($sort = true) { if (!$sort || $this->createsSorted) { return $this->changes['createTables']; } $resolved = []; $dependencyMap = []; $pending = []; //resolve simple tables (no dependencies) foreach ($this->changes['createTables'] as $query) { $table = new Table($query); $tableName = $table->getName(); $depends = $table->getDependencies(); if (!$depends) { $resolved[$tableName] = $query; } elseif ($this->dependenciesMet($resolved, $depends)) { $resolved[$tableName] = $query; } else { $dependencyMap[$tableName] = $depends; $pending[$tableName] = ['query' => $query, 'parsed' => $table]; } } //keep checking pending alters until we can't resolve any more queries $afterCount = count($resolved); do { $preCount = $afterCount; foreach ($dependencyMap as $name => $depends) { if ($this->dependenciesMet($resolved, $depends)) { $resolved[$name] = $pending[$name]['query']; unset($pending[$name]); } else { //remove dependencies that might not be in create list here $clean = []; foreach ($depends as $name) { if (isset($resolved[$name]) || isset($pending[$name])) { $clean[] = $name; } } //rework map $dependencyMap[$name] = $clean; } } $afterCount = count($resolved); } while ($preCount != $afterCount); $this->changes['createTables'] = $this->addMarkedCreates($pending, $resolved); $this->createsSorted = true; return $this->changes['createTables']; }