/**
  * If the $onTableAliasName is used (not null):
  * Special use of sort attribute resolution. If you are resolving a sort attribute against a relation then
  * the joins must utilize a left join in the case of casting up.  Does not support when the attribute is a
  * relation itself as this expects any relation processing to be done before this is called.
  *
  * @param RedBeanModelAttributeToDataProviderAdapter $modelAttributeToDataProviderAdapter
  * @param RedBeanModelJoinTablesQueryAdapter $joinTablesAdapter
  * @param null | string $onTableAliasName
  * @return string
  * @throws NotSupportedException
  */
 public static function resolveSortAttributeColumnName(RedBeanModelAttributeToDataProviderAdapter $modelAttributeToDataProviderAdapter, RedBeanModelJoinTablesQueryAdapter $joinTablesAdapter, $onTableAliasName = null)
 {
     assert('is_string($onTableAliasName) || $onTableAliasName == null');
     $builder = new ModelJoinBuilder($modelAttributeToDataProviderAdapter, $joinTablesAdapter);
     $tableAliasName = $builder->resolveJoins($onTableAliasName, self::resolveCanUseFromJoins($onTableAliasName));
     $shouldConcatenate = false;
     if ($modelAttributeToDataProviderAdapter->hasRelatedAttribute()) {
         if ($modelAttributeToDataProviderAdapter->relatedAttributesSortUsesTwoAttributes()) {
             $resolvedSortColumnName = $modelAttributeToDataProviderAdapter->getRelatedAttributeColumnNameByPosition(0);
             $sortColumnsNameString = self::resolveSortColumnNameString($tableAliasName, $resolvedSortColumnName);
             $resolvedSortColumnName = $modelAttributeToDataProviderAdapter->getRelatedAttributeColumnNameByPosition(1);
             $shouldConcatenate = true;
         } else {
             $resolvedSortColumnName = $modelAttributeToDataProviderAdapter->getRelatedAttributeColumnName();
         }
     } else {
         if ($modelAttributeToDataProviderAdapter->sortUsesTwoAttributes()) {
             $resolvedSortColumnName = $modelAttributeToDataProviderAdapter->getColumnNameByPosition(0);
             $sortColumnsNameString = self::resolveSortColumnNameString($tableAliasName, $resolvedSortColumnName);
             $resolvedSortColumnName = $modelAttributeToDataProviderAdapter->getColumnNameByPosition(1);
             $shouldConcatenate = true;
         } else {
             $resolvedSortColumnName = $modelAttributeToDataProviderAdapter->getColumnName();
         }
     }
     if ($shouldConcatenate) {
         $sortColumnsNameString = DatabaseCompatibilityUtil::concat(array($sortColumnsNameString, self::resolveSortColumnNameString($tableAliasName, $resolvedSortColumnName)));
     } else {
         $sortColumnsNameString = self::resolveSortColumnNameString($tableAliasName, $resolvedSortColumnName);
     }
     return $sortColumnsNameString;
 }
 public function testRelatedAttributesSortUsesTwoAttributes()
 {
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('A', 'a');
     $this->assertFalse($adapter->sortUsesTwoAttributes());
     $this->assertEquals('a', $adapter->getColumnNameByPosition(0));
     try {
         $adapter->getColumnNameByPosition(1);
     } catch (InvalidArgumentException $exception) {
         $this->assertEquals('Attribute position is not valid', $exception->getMessage());
     }
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('Q', 'a');
     $this->assertTrue($adapter->sortUsesTwoAttributes());
     $this->assertEquals('a', $adapter->getColumnNameByPosition(0));
     $this->assertEquals('junk', $adapter->getColumnNameByPosition(1));
     $this->assertEquals('uniquerequiredemail', $adapter->getColumnNameByPosition(2));
     try {
         $adapter->getColumnNameByPosition(3);
     } catch (InvalidArgumentException $exception) {
         $this->assertEquals('Attribute position is not valid', $exception->getMessage());
     }
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('QQ', 'q');
     $this->assertTrue($adapter->relatedAttributesSortUsesTwoAttributes());
     $this->assertEquals('q_id', $adapter->getColumnNameByPosition(0));
     $this->assertEquals('junk', $adapter->getColumnNameByPosition(1));
     $this->assertEquals('uniquerequiredemail', $adapter->getColumnNameByPosition(2));
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('QQ', 'qRequired');
     $this->assertTrue($adapter->relatedAttributesSortUsesTwoAttributes());
     $this->assertEquals('erequired_q_id', $adapter->getColumnNameByPosition(0));
     $this->assertEquals('junk', $adapter->getColumnNameByPosition(1));
     $this->assertEquals('uniquerequiredemail', $adapter->getColumnNameByPosition(2));
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('QQ', 'qUnique');
     $this->assertTrue($adapter->relatedAttributesSortUsesTwoAttributes());
     $this->assertEquals('eunique_q_id', $adapter->getColumnNameByPosition(0));
     $this->assertEquals('junk', $adapter->getColumnNameByPosition(1));
     $this->assertEquals('uniquerequiredemail', $adapter->getColumnNameByPosition(2));
     $adapter = new RedBeanModelAttributeToDataProviderAdapter('QQ', 'qMany');
     $this->assertTrue($adapter->relatedAttributesSortUsesTwoAttributes());
     $this->assertEquals('qq_id', $adapter->getColumnNameByPosition(0));
     $this->assertEquals('junk', $adapter->getColumnNameByPosition(1));
     $this->assertEquals('uniquerequiredemail', $adapter->getColumnNameByPosition(2));
 }