/**
  * 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 testResolve
  */
 public function testResolveForTestModel()
 {
     $expectedSchema = array('emailtemplatemodeltestitem' => array('columns' => array(array('name' => 'firstname', 'type' => 'VARCHAR(32)', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => 'COLLATE utf8_unicode_ci', 'default' => 'DEFAULT NULL'), array('name' => 'lastname', 'type' => 'VARCHAR(32)', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => 'COLLATE utf8_unicode_ci', 'default' => 'DEFAULT NULL'), array('name' => 'boolean', 'type' => 'TINYINT(1) UNSIGNED', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'boolean2', 'type' => 'TINYINT(1) UNSIGNED', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'date', 'type' => 'DATE', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'date2', 'type' => 'DATE', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'date3', 'type' => 'DATE', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'date4', 'type' => 'DATE', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'datetime', 'type' => 'DATETIME', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'datetime2', 'type' => 'DATETIME', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'datetime3', 'type' => 'DATETIME', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'datetime4', 'type' => 'DATETIME', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'float', 'type' => 'DOUBLE', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'integer', 'type' => 'INT(11)', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'phone', 'type' => 'VARCHAR(14)', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => 'COLLATE utf8_unicode_ci', 'default' => 'DEFAULT NULL'), array('name' => 'string', 'type' => 'VARCHAR(64)', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => 'COLLATE utf8_unicode_ci', 'default' => 'DEFAULT NULL'), array('name' => 'textarea', 'type' => 'TEXT', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => 'COLLATE utf8_unicode_ci', 'default' => 'DEFAULT NULL'), array('name' => 'url', 'type' => 'VARCHAR(255)', 'unsigned' => null, 'notNull' => 'NULL', 'collation' => 'COLLATE utf8_unicode_ci', 'default' => 'DEFAULT NULL'), array('name' => 'ownedsecurableitem_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'currencyvalue_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'dropdown_customfield_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'dropdown2_customfield_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'radiodropdown_customfield_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'multidropdown_multiplevaluescustomfield_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'tagcloud_multiplevaluescustomfield_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'primaryemail_email_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'primaryaddress_address_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'secondaryemail_email_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'likecontactstate_contactstate_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => '_user_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL'), array('name' => 'user2__user_id', 'type' => 'INT(11)', 'unsigned' => 'UNSIGNED', 'notNull' => 'NULL', 'collation' => null, 'default' => 'DEFAULT NULL')), 'indexes' => array()));
     $modelClassName = 'EmailTemplateModelTestItem';
     $schema = RedBeanModelToTableSchemaAdapter::resolve($modelClassName, static::$messageLogger);
     $this->assertNotEmpty($schema);
     $this->assertEquals($expectedSchema, $schema);
 }