/**
  * @param $modelClassName
  * @param $attributeModelClassName
  * @return string
  * @throws NotSupportedException
  */
 private function processFromJoinsForAttributeThatIsCastedUp($modelClassName, $attributeModelClassName)
 {
     assert('is_string($modelClassName)');
     assert('is_string($attributeModelClassName)');
     $attributeTableName = $attributeModelClassName::getTableName();
     $tableAliasName = $attributeTableName;
     $castedDownModelClassName = $modelClassName;
     $onTableAliasName = null;
     while (get_parent_class($modelClassName) != $attributeModelClassName && get_parent_class($modelClassName) != 'RedBeanModel') {
         $castedDownFurtherModelClassName = $castedDownModelClassName;
         $castedDownModelClassName = $modelClassName;
         $modelClassName = get_parent_class($modelClassName);
         if ($modelClassName::getCanHaveBean()) {
             $castedUpAttributeTableName = $modelClassName::getTableName();
             if (!$this->joinTablesAdapter->isTableInFromTables($castedUpAttributeTableName)) {
                 if ($onTableAliasName == null && $castedDownModelClassName::getCanHaveBean()) {
                     $onTableAliasName = $castedDownModelClassName::getTableName();
                 } elseif ($onTableAliasName == null && $castedDownFurtherModelClassName::getCanHaveBean()) {
                     $onTableAliasName = $castedDownFurtherModelClassName::getTableName();
                 } elseif ($onTableAliasName == null) {
                     throw new NotSupportedException();
                 }
                 $onTableAliasName = $this->joinTablesAdapter->addFromTableAndGetAliasName($castedUpAttributeTableName, self::resolveForeignKey($castedUpAttributeTableName), $onTableAliasName);
             }
         }
     }
     if (!$this->joinTablesAdapter->isTableInFromTables($attributeTableName)) {
         if ($onTableAliasName == null) {
             $modelClassName = static::resolveModelClassNameThatCanHaveTable($modelClassName, $castedDownModelClassName);
             $onTableAliasName = $modelClassName::getTableName();
         }
         $tableAliasName = $this->joinTablesAdapter->addFromTableAndGetAliasName($attributeTableName, self::resolveForeignKey($attributeTableName), $onTableAliasName);
     } else {
         $existingTableAliasName = $this->joinTablesAdapter->getAlreadyFromJoinedTableAliasName($attributeTableName);
         if ($existingTableAliasName != null) {
             $tableAliasName = $existingTableAliasName;
         }
     }
     return $tableAliasName;
 }
 public function testGetAlreadyFromJoinedTableAliasName()
 {
     $adapter = new RedBeanModelJoinTablesQueryAdapter('QueryFromModel');
     $this->assertNull($adapter->GetAlreadyFromJoinedTableAliasName('zz'));
     $alias = $adapter->addFromTableAndGetAliasName('z', 'joinid');
     $this->assertEquals($alias, $adapter->getAlreadyFromJoinedTableAliasName('z'));
 }