/**
  * Provided an array of modelClassNames database schema generation is performed using each model's metadata.
  * @param array $modelClassNames
  * @param $messageLogger
  */
 public static function generateTablesFromModelClassNames(array $modelClassNames, &$messageLogger)
 {
     $tables = array();
     if (empty($modelClassNames)) {
         return;
     }
     $messageLogger->addInfoMessage(Zurmo::t('Core', 'Building Table Schema for {{count}} Models', array('{{count}}' => count($modelClassNames))));
     foreach ($modelClassNames as $modelClassName) {
         $table = RedBeanModelToTableSchemaAdapter::resolve($modelClassName, $messageLogger);
         if ($table) {
             $tables[] = $table;
         }
     }
     foreach ($tables as $schemaDefinition) {
         $tableName = key($schemaDefinition);
         $polymorphicColumns = RedBeanModelRelationToColumnAdapter::resolvePolymorphicColumnsByTableName($tableName);
         if (!empty($polymorphicColumns)) {
             $columns = CMap::mergeArray($schemaDefinition[$tableName]['columns'], $polymorphicColumns);
             $schemaDefinition[$tableName]['columns'] = $columns;
         }
         CreateOrUpdateExistingTableFromSchemaDefinitionArrayUtil::generateOrUpdateTableBySchemaDefinition($schemaDefinition, $messageLogger);
         $messageLogger->addInfoMessage(Zurmo::t('Core', 'Scheme generated for {{table}}.', array('{{table}}' => $tableName)));
     }
     $messageLogger->addInfoMessage(Zurmo::t('Core', 'Schema generation completed'));
 }
 /**
  * @depends testResolveWithHasManyAndLinkTypeSpecific
  */
 public function testResolveWithHasManyAndLinkTypePolymorphic()
 {
     $modelClassName = 'Campaign';
     $relationName = 'files';
     $relationMetadata = array(RedBeanModel::HAS_MANY, 'FileModel', RedBeanModel::OWNED, RedBeanModel::LINK_TYPE_POLYMORPHIC, 'relatedModel');
     $column = RedBeanModelRelationToColumnAdapter::resolve($modelClassName, $relationName, $relationMetadata, static::$messageLogger);
     $this->assertNull($column);
     $polymorphicColumns = RedBeanModelRelationToColumnAdapter::resolvePolymorphicColumnsByTableName('filemodel');
     $this->assertNotEmpty($polymorphicColumns);
     $this->assertCount(2, $polymorphicColumns);
     $this->assertArrayHasKey('name', $polymorphicColumns[0]);
     $this->assertArrayHasKey('type', $polymorphicColumns[0]);
     $this->assertArrayHasKey('unsigned', $polymorphicColumns[0]);
     $this->assertArrayHasKey('notNull', $polymorphicColumns[0]);
     $this->assertArrayHasKey('collation', $polymorphicColumns[0]);
     $this->assertArrayHasKey('default', $polymorphicColumns[0]);
     $this->assertEquals('relatedmodel_id', $polymorphicColumns[0]['name']);
     $this->assertEquals('INT(11)', $polymorphicColumns[0]['type']);
     $this->assertEquals('UNSIGNED', $polymorphicColumns[0]['unsigned']);
     $this->assertEquals('NULL', $polymorphicColumns[0]['notNull']);
     // Not Coding Standard
     $this->assertNull($polymorphicColumns[0]['collation']);
     $this->assertEquals('DEFAULT NULL', $polymorphicColumns[0]['default']);
     // Not Coding Standard
     $this->assertArrayHasKey('name', $polymorphicColumns[1]);
     $this->assertArrayHasKey('type', $polymorphicColumns[1]);
     $this->assertArrayHasKey('unsigned', $polymorphicColumns[1]);
     $this->assertArrayHasKey('notNull', $polymorphicColumns[1]);
     $this->assertArrayHasKey('collation', $polymorphicColumns[1]);
     $this->assertArrayHasKey('default', $polymorphicColumns[1]);
     $this->assertEquals('relatedmodel_type', $polymorphicColumns[1]['name']);
     $this->assertEquals('VARCHAR(255)', $polymorphicColumns[1]['type']);
     $this->assertNull($polymorphicColumns[1]['unsigned']);
     $this->assertEquals('NULL', $polymorphicColumns[1]['notNull']);
     // Not Coding Standard
     $this->assertEquals('COLLATE utf8_unicode_ci', $polymorphicColumns[1]['collation']);
     $this->assertEquals('DEFAULT NULL', $polymorphicColumns[1]['default']);
     // Not Coding Standard
 }