/**
  * 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'));
 }
 /**
  * Generates column definitions and/or junction tables depending on relationships
  * @param string $modelClassName
  * @param array $relations
  * @param $messageLogger
  * @return array
  * @throws CException
  */
 public static function resolve($modelClassName, array $relations, &$messageLogger)
 {
     $messageLogger->addInfoMessage(Zurmo::t('Core', 'Building Column definitions for relations of {{model}}', array('{{model}}' => $modelClassName)));
     $columns = array();
     if ($modelClassName && @class_exists($modelClassName)) {
         foreach ($relations as $relationName => $relationMetadata) {
             $column = RedBeanModelRelationToColumnAdapter::resolve($modelClassName, $relationName, $relationMetadata, $messageLogger);
             if ($column) {
                 $columns[] = $column;
             } elseif ($column === false) {
                 $errorMessage = Zurmo::t('Core', 'Failed to resolve {{model}}.{{relation}} to column', array('{{model}}' => $modelClassName, '{{relation}}' => $relationName));
                 $messageLogger->addErrorMessage($errorMessage);
                 throw new CException($errorMessage);
             }
         }
     }
     $messageLogger->addInfoMessage(Zurmo::t('Core', 'Column definitions for relations Built'));
     return $columns;
 }
 /**
  * @depends testResolveWithManyManyAndLinkTypeAssumptive
  */
 public function testResolveWithManyManyAndLinkTypeSpecific()
 {
     $modelClassName = 'Conversation';
     $relationName = 'conversationItems';
     $relationMetadata = array(RedBeanModel::MANY_MANY, 'Item', RedBeanModel::OWNED, RedBeanModel::LINK_TYPE_SPECIFIC, 'cItems');
     $column = RedBeanModelRelationToColumnAdapter::resolve($modelClassName, $relationName, $relationMetadata, static::$messageLogger);
     $this->assertNull($column);
     $processedTables = RedBeanModelToJoinTableAdapter::resolveProcessedTableNames();
     $this->assertNotEmpty($processedTables);
     $this->assertCount(3, $processedTables);
     $this->assertEquals('contact_opportunity', $processedTables[0]);
     $this->assertEquals('conversation_item', $processedTables[1]);
     $this->assertEquals('citems_conversation_item', $processedTables[2]);
 }