/**
  * Generates a column definition or processes junctions table depending on relation and link type.
  * @param string $modelClassName
  * @param string $relationName
  * @param array $relationMetadata
  * @param $messageLogger
  * @return array|null
  */
 public static function resolve($modelClassName, $relationName, array $relationMetadata, &$messageLogger)
 {
     $column = null;
     if (!empty($modelClassName) && @class_exists($modelClassName) && !empty($relationName) && count($relationMetadata) >= 2 && @class_exists($relationMetadata[1])) {
         $relationType = $relationMetadata[0];
         $relatedModelClass = $relationMetadata[1];
         $linkType = RedBeanModel::LINK_TYPE_ASSUMPTIVE;
         if (isset($relationMetadata[3])) {
             $linkType = $relationMetadata[3];
         }
         if (!in_array($relationType, array(RedBeanModel::HAS_ONE_BELONGS_TO, RedBeanModel::HAS_MANY_BELONGS_TO, RedBeanModel::HAS_ONE, RedBeanModel::HAS_MANY, RedBeanModel::MANY_MANY))) {
             return false;
         }
         if ($relationType == RedBeanModel::MANY_MANY) {
             RedBeanModelToJoinTableAdapter::resolve($modelClassName, $relationMetadata, $messageLogger);
             return null;
         } elseif (in_array($relationType, array(RedBeanModel::HAS_ONE, RedBeanModel::HAS_MANY_BELONGS_TO))) {
             $linkName = null;
             if ($linkType == RedBeanModel::LINK_TYPE_ASSUMPTIVE && strtolower($relatedModelClass) != strtolower($relationName)) {
                 $linkName = strtolower($relationName) . '_';
             }
             $name = $linkName . RedBeanModel::getForeignKeyName($modelClassName, $relationName);
             $column = RedBeanModelMemberToColumnUtil::resolveForeignKeyColumnMetadata($name);
         } elseif ($relationType == RedBeanModel::HAS_MANY && $linkType == RedBeanModel::LINK_TYPE_POLYMORPHIC) {
             static::setColumnsForPolymorphicLink($relatedModelClass, $relationMetadata[4]);
         }
         // ignore HAS_MANY(non-polymorphic) and HAS_ONE_BELONGS_TO as we are dealing with HAS_ONE and HAS_MANY_BELONGS e.g.
         // we are ignore the sides which shouldn't have columns.
     } else {
         return false;
     }
     return $column;
 }
 /**
  * @depends testResolveWithNonManyManyRelationship
  */
 public function testResolve()
 {
     $modelClassName = 'Person';
     $relationMetadata = array(RedBeanModel::MANY_MANY, 'User');
     RedBeanModelToJoinTableAdapter::resolve($modelClassName, $relationMetadata, static::$messageLogger);
     $processedTables = RedBeanModelToJoinTableAdapter::resolveProcessedTableNames();
     $this->assertNotEmpty($processedTables);
     $this->assertCount(1, $processedTables);
     $this->assertEquals('_user_person', $processedTables[0]);
 }
 /**
  * @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]);
 }