/** * 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)); }