public function buildComparisonSchema(PhabricatorConfigServerSchema $expect, PhabricatorConfigServerSchema $actual)
 {
     $comp_server = $actual->newEmptyClone();
     $all_databases = $actual->getDatabases() + $expect->getDatabases();
     foreach ($all_databases as $database_name => $database_template) {
         $actual_database = $actual->getDatabase($database_name);
         $expect_database = $expect->getDatabase($database_name);
         $issues = $this->compareSchemata($expect_database, $actual_database);
         $comp_database = $database_template->newEmptyClone()->setIssues($issues);
         if (!$actual_database) {
             $actual_database = $expect_database->newEmptyClone();
         }
         if (!$expect_database) {
             $expect_database = $actual_database->newEmptyClone();
         }
         $all_tables = $actual_database->getTables() + $expect_database->getTables();
         foreach ($all_tables as $table_name => $table_template) {
             $actual_table = $actual_database->getTable($table_name);
             $expect_table = $expect_database->getTable($table_name);
             $issues = $this->compareSchemata($expect_table, $actual_table);
             $comp_table = $table_template->newEmptyClone()->setIssues($issues);
             if (!$actual_table) {
                 $actual_table = $expect_table->newEmptyClone();
             }
             if (!$expect_table) {
                 $expect_table = $actual_table->newEmptyClone();
             }
             $all_columns = $actual_table->getColumns() + $expect_table->getColumns();
             foreach ($all_columns as $column_name => $column_template) {
                 $actual_column = $actual_table->getColumn($column_name);
                 $expect_column = $expect_table->getColumn($column_name);
                 $issues = $this->compareSchemata($expect_column, $actual_column);
                 $comp_column = $column_template->newEmptyClone()->setIssues($issues);
                 $comp_table->addColumn($comp_column);
             }
             $all_keys = $actual_table->getKeys() + $expect_table->getKeys();
             foreach ($all_keys as $key_name => $key_template) {
                 $actual_key = $actual_table->getKey($key_name);
                 $expect_key = $expect_table->getKey($key_name);
                 $issues = $this->compareSchemata($expect_key, $actual_key);
                 $comp_key = $key_template->newEmptyClone()->setIssues($issues);
                 $comp_table->addKey($comp_key);
             }
             $comp_database->addTable($comp_table);
         }
         $comp_server->addDatabase($comp_database);
     }
     return $comp_server;
 }