[DDC-1294] Add discriminator information to subselects
This commit is contained in:
parent
4b85d7a683
commit
65f7e897b5
@ -359,13 +359,7 @@ class SqlWalker implements TreeWalker
|
|||||||
{
|
{
|
||||||
$sql = $this->walkSelectClause($AST->selectClause);
|
$sql = $this->walkSelectClause($AST->selectClause);
|
||||||
$sql .= $this->walkFromClause($AST->fromClause);
|
$sql .= $this->walkFromClause($AST->fromClause);
|
||||||
|
$sql .= $this->walkWhereClause($AST->whereClause);
|
||||||
if (($whereClause = $AST->whereClause) !== null) {
|
|
||||||
$sql .= $this->walkWhereClause($whereClause);
|
|
||||||
} else if (($discSql = $this->_generateDiscriminatorColumnConditionSQL($this->_rootAliases)) !== '') {
|
|
||||||
$sql .= ' WHERE ' . $discSql;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql .= $AST->groupByClause ? $this->walkGroupByClause($AST->groupByClause) : '';
|
$sql .= $AST->groupByClause ? $this->walkGroupByClause($AST->groupByClause) : '';
|
||||||
$sql .= $AST->havingClause ? $this->walkHavingClause($AST->havingClause) : '';
|
$sql .= $AST->havingClause ? $this->walkHavingClause($AST->havingClause) : '';
|
||||||
|
|
||||||
@ -407,12 +401,7 @@ class SqlWalker implements TreeWalker
|
|||||||
{
|
{
|
||||||
$this->_useSqlTableAliases = false;
|
$this->_useSqlTableAliases = false;
|
||||||
$sql = $this->walkUpdateClause($AST->updateClause);
|
$sql = $this->walkUpdateClause($AST->updateClause);
|
||||||
|
$sql .= $this->walkWhereClause($AST->whereClause);
|
||||||
if (($whereClause = $AST->whereClause) !== null) {
|
|
||||||
$sql .= $this->walkWhereClause($whereClause);
|
|
||||||
} else if (($discSql = $this->_generateDiscriminatorColumnConditionSQL($this->_rootAliases)) !== '') {
|
|
||||||
$sql .= ' WHERE ' . $discSql;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $sql;
|
return $sql;
|
||||||
}
|
}
|
||||||
@ -427,12 +416,7 @@ class SqlWalker implements TreeWalker
|
|||||||
{
|
{
|
||||||
$this->_useSqlTableAliases = false;
|
$this->_useSqlTableAliases = false;
|
||||||
$sql = $this->walkDeleteClause($AST->deleteClause);
|
$sql = $this->walkDeleteClause($AST->deleteClause);
|
||||||
|
$sql .= $this->walkWhereClause($AST->whereClause);
|
||||||
if (($whereClause = $AST->whereClause) !== null) {
|
|
||||||
$sql .= $this->walkWhereClause($whereClause);
|
|
||||||
} else if (($discSql = $this->_generateDiscriminatorColumnConditionSQL($this->_rootAliases)) !== '') {
|
|
||||||
$sql .= ' WHERE ' . $discSql;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $sql;
|
return $sql;
|
||||||
}
|
}
|
||||||
@ -1158,15 +1142,19 @@ class SqlWalker implements TreeWalker
|
|||||||
public function walkSubselect($subselect)
|
public function walkSubselect($subselect)
|
||||||
{
|
{
|
||||||
$useAliasesBefore = $this->_useSqlTableAliases;
|
$useAliasesBefore = $this->_useSqlTableAliases;
|
||||||
|
$rootAliasesBefore = $this->_rootAliases;
|
||||||
|
|
||||||
|
$this->_rootAliases = array(); // reset the rootAliases for the subselect
|
||||||
$this->_useSqlTableAliases = true;
|
$this->_useSqlTableAliases = true;
|
||||||
|
|
||||||
$sql = $this->walkSimpleSelectClause($subselect->simpleSelectClause);
|
$sql = $this->walkSimpleSelectClause($subselect->simpleSelectClause);
|
||||||
$sql .= $this->walkSubselectFromClause($subselect->subselectFromClause);
|
$sql .= $this->walkSubselectFromClause($subselect->subselectFromClause);
|
||||||
$sql .= $subselect->whereClause ? $this->walkWhereClause($subselect->whereClause) : '';
|
$sql .= $this->walkWhereClause($subselect->whereClause);
|
||||||
$sql .= $subselect->groupByClause ? $this->walkGroupByClause($subselect->groupByClause) : '';
|
$sql .= $subselect->groupByClause ? $this->walkGroupByClause($subselect->groupByClause) : '';
|
||||||
$sql .= $subselect->havingClause ? $this->walkHavingClause($subselect->havingClause) : '';
|
$sql .= $subselect->havingClause ? $this->walkHavingClause($subselect->havingClause) : '';
|
||||||
$sql .= $subselect->orderByClause ? $this->walkOrderByClause($subselect->orderByClause) : '';
|
$sql .= $subselect->orderByClause ? $this->walkOrderByClause($subselect->orderByClause) : '';
|
||||||
|
|
||||||
|
$this->_rootAliases = $rootAliasesBefore; // put the main aliases back
|
||||||
$this->_useSqlTableAliases = $useAliasesBefore;
|
$this->_useSqlTableAliases = $useAliasesBefore;
|
||||||
|
|
||||||
return $sql;
|
return $sql;
|
||||||
@ -1193,6 +1181,8 @@ class SqlWalker implements TreeWalker
|
|||||||
$sql .= $class->getQuotedTableName($this->_platform) . ' '
|
$sql .= $class->getQuotedTableName($this->_platform) . ' '
|
||||||
. $this->getSQLTableAlias($class->table['name'], $dqlAlias);
|
. $this->getSQLTableAlias($class->table['name'], $dqlAlias);
|
||||||
|
|
||||||
|
$this->_rootAliases[] = $dqlAlias;
|
||||||
|
|
||||||
if ($class->isInheritanceTypeJoined()) {
|
if ($class->isInheritanceTypeJoined()) {
|
||||||
$sql .= $this->_generateClassTableInheritanceJoins($class, $dqlAlias);
|
$sql .= $this->_generateClassTableInheritanceJoins($class, $dqlAlias);
|
||||||
}
|
}
|
||||||
@ -1414,16 +1404,23 @@ class SqlWalker implements TreeWalker
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Walks down a WhereClause AST node, thereby generating the appropriate SQL.
|
* Walks down a WhereClause AST node, thereby generating the appropriate SQL.
|
||||||
|
* WhereClause or not, the appropriate discriminator sql is added.
|
||||||
*
|
*
|
||||||
* @param WhereClause
|
* @param WhereClause
|
||||||
* @return string The SQL.
|
* @return string The SQL.
|
||||||
*/
|
*/
|
||||||
public function walkWhereClause($whereClause)
|
public function walkWhereClause($whereClause)
|
||||||
{
|
{
|
||||||
|
$condSql = null !== $whereClause ? $this->walkConditionalExpression($whereClause->conditionalExpression) : '';
|
||||||
$discrSql = $this->_generateDiscriminatorColumnConditionSql($this->_rootAliases);
|
$discrSql = $this->_generateDiscriminatorColumnConditionSql($this->_rootAliases);
|
||||||
$condSql = $this->walkConditionalExpression($whereClause->conditionalExpression);
|
|
||||||
|
|
||||||
return ' WHERE ' . (( ! $discrSql) ? $condSql : '(' . $condSql . ') AND ' . $discrSql);
|
if ($condSql) {
|
||||||
|
return ' WHERE ' . (( ! $discrSql) ? $condSql : '(' . $condSql . ') AND ' . $discrSql);
|
||||||
|
} else if ($discrSql) {
|
||||||
|
return ' WHERE ' . $discrSql;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -922,6 +922,17 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase
|
|||||||
"SELECT COALESCE(NULLIF(c0_.name, ''), c0_.username) AS sclr0 FROM cms_users c0_"
|
"SELECT COALESCE(NULLIF(c0_.name, ''), c0_.username) AS sclr0 FROM cms_users c0_"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that the right discriminator data is inserted in a subquery.
|
||||||
|
*/
|
||||||
|
public function testSubSelectDiscriminator()
|
||||||
|
{
|
||||||
|
$this->assertSqlGeneration(
|
||||||
|
"SELECT u.name, (SELECT COUNT(cfc.id) total FROM Doctrine\Tests\Models\Company\CompanyFixContract cfc) as cfc_count FROM Doctrine\Tests\Models\CMS\CmsUser u",
|
||||||
|
"SELECT c0_.name AS name0, (SELECT COUNT(c1_.id) AS dctrn__total FROM company_contracts c1_ WHERE c1_.discr IN ('fix')) AS sclr1 FROM cms_users c0_"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user