1
0
mirror of synced 2025-03-06 21:06:16 +03:00

Merge pull request #6243 from enumag/patch-3

Fix CountOutputWalker for queries with GROUP BY
This commit is contained in:
Luís Cobucci 2017-06-22 07:16:38 +02:00 committed by GitHub
commit 3df6b7316b
2 changed files with 23 additions and 3 deletions

View File

@ -91,6 +91,14 @@ class CountOutputWalker extends SqlWalker
$sql = parent::walkSelectStatement($AST); $sql = parent::walkSelectStatement($AST);
if ($AST->groupByClause) {
return sprintf(
'SELECT %s AS dctrn_count FROM (%s) dctrn_table',
$this->platform->getCountExpression('*'),
$sql
);
}
// Find out the SQL alias of the identifier column of the root entity // Find out the SQL alias of the identifier column of the root entity
// It may be possible to make this work with multiple root entities but that // It may be possible to make this work with multiple root entities but that
// would probably require issuing multiple queries or doing a UNION SELECT // would probably require issuing multiple queries or doing a UNION SELECT

View File

@ -31,15 +31,27 @@ class CountOutputWalkerTest extends PaginationTestCase
); );
} }
public function testCountQuery_Having() public function testCountQuery_GroupBy(): void
{
$query = $this->entityManager->createQuery(
'SELECT p.name FROM Doctrine\Tests\ORM\Tools\Pagination\Person p GROUP BY p.name');
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CountOutputWalker::class);
$query->setFirstResult(null)->setMaxResults(null);
$this->assertSame(
"SELECT COUNT(*) AS dctrn_count FROM (SELECT p0_.name AS name_0 FROM Person p0_ GROUP BY p0_.name) dctrn_table", $query->getSQL()
);
}
public function testCountQuery_Having(): void
{ {
$query = $this->entityManager->createQuery( $query = $this->entityManager->createQuery(
'SELECT g, u, count(u.id) AS userCount FROM Doctrine\Tests\ORM\Tools\Pagination\Group g LEFT JOIN g.users u GROUP BY g.id HAVING userCount > 0'); 'SELECT g, u, count(u.id) AS userCount FROM Doctrine\Tests\ORM\Tools\Pagination\Group g LEFT JOIN g.users u GROUP BY g.id HAVING userCount > 0');
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CountOutputWalker::class); $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CountOutputWalker::class);
$query->setFirstResult(null)->setMaxResults(null); $query->setFirstResult(null)->setMaxResults(null);
$this->assertEquals( $this->assertSame(
"SELECT COUNT(*) AS dctrn_count FROM (SELECT DISTINCT id_1 FROM (SELECT count(u0_.id) AS sclr_0, g1_.id AS id_1, u0_.id AS id_2 FROM groups g1_ LEFT JOIN user_group u2_ ON g1_.id = u2_.group_id LEFT JOIN User u0_ ON u0_.id = u2_.user_id GROUP BY g1_.id HAVING sclr_0 > 0) dctrn_result) dctrn_table", $query->getSQL() "SELECT COUNT(*) AS dctrn_count FROM (SELECT count(u0_.id) AS sclr_0, g1_.id AS id_1, u0_.id AS id_2 FROM groups g1_ LEFT JOIN user_group u2_ ON g1_.id = u2_.group_id LEFT JOIN User u0_ ON u0_.id = u2_.user_id GROUP BY g1_.id HAVING sclr_0 > 0) dctrn_table", $query->getSQL()
); );
} }