1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
<?php
declare(strict_types=1);
namespace Doctrine\Tests\ORM\Tools\Pagination;
use Doctrine\ORM\Query;
use Doctrine\ORM\Tools\Pagination\CountWalker;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RequiresPhpunit;
use RuntimeException;
#[Group('DDC-1613')]
#[RequiresPhpunit('< 12')]
class CountWalkerTest extends PaginationTestCase
{
public function testCountQuery(): void
{
$query = $this->entityManager->createQuery(
'SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\BlogPost p JOIN p.category c JOIN p.author a',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setHint(CountWalker::HINT_DISTINCT, true);
$query->setFirstResult(0)->setMaxResults(null);
self::assertEquals(
'SELECT count(DISTINCT b0_.id) AS sclr_0 FROM BlogPost b0_ INNER JOIN Category c1_ ON b0_.category_id = c1_.id INNER JOIN Author a2_ ON b0_.author_id = a2_.id',
$query->getSQL(),
);
}
public function testCountQueryWithoutDistinctUsesCountStar(): void
{
$query = $this->entityManager->createQuery(
'SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\BlogPost p JOIN p.category c JOIN p.author a',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setHint(CountWalker::HINT_DISTINCT, false);
self::assertEquals(
'SELECT count(*) AS sclr_0 FROM BlogPost b0_ INNER JOIN Category c1_ ON b0_.category_id = c1_.id INNER JOIN Author a2_ ON b0_.author_id = a2_.id',
$query->getSQL(),
);
}
public function testCountQueryMixedResultsWithName(): void
{
$query = $this->entityManager->createQuery(
'SELECT a, sum(a.name) as foo FROM Doctrine\Tests\ORM\Tools\Pagination\Author a',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setHint(CountWalker::HINT_DISTINCT, true);
$query->setFirstResult(0)->setMaxResults(null);
self::assertEquals(
'SELECT count(DISTINCT a0_.id) AS sclr_0 FROM Author a0_',
$query->getSQL(),
);
}
public function testCountQueryKeepsGroupBy(): void
{
$query = $this->entityManager->createQuery(
'SELECT b FROM Doctrine\Tests\ORM\Tools\Pagination\BlogPost b GROUP BY b.id',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setHint(CountWalker::HINT_DISTINCT, true);
$query->setFirstResult(0)->setMaxResults(null);
self::assertEquals(
'SELECT count(DISTINCT b0_.id) AS sclr_0 FROM BlogPost b0_ GROUP BY b0_.id',
$query->getSQL(),
);
}
public function testCountQueryRemovesOrderBy(): void
{
$query = $this->entityManager->createQuery(
'SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\BlogPost p JOIN p.category c JOIN p.author a ORDER BY a.name',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setHint(CountWalker::HINT_DISTINCT, true);
$query->setFirstResult(0)->setMaxResults(null);
self::assertEquals(
'SELECT count(DISTINCT b0_.id) AS sclr_0 FROM BlogPost b0_ INNER JOIN Category c1_ ON b0_.category_id = c1_.id INNER JOIN Author a2_ ON b0_.author_id = a2_.id',
$query->getSQL(),
);
}
public function testCountQueryRemovesLimits(): void
{
$query = $this->entityManager->createQuery(
'SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\BlogPost p JOIN p.category c JOIN p.author a',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setHint(CountWalker::HINT_DISTINCT, true);
$query->setFirstResult(0)->setMaxResults(null);
self::assertEquals(
'SELECT count(DISTINCT b0_.id) AS sclr_0 FROM BlogPost b0_ INNER JOIN Category c1_ ON b0_.category_id = c1_.id INNER JOIN Author a2_ ON b0_.author_id = a2_.id',
$query->getSQL(),
);
}
public function testCountQueryHavingException(): void
{
$query = $this->entityManager->createQuery(
'SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMS\CmsGroup g LEFT JOIN g.users u GROUP BY g.id HAVING userCount > 0',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setFirstResult(0)->setMaxResults(null);
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Cannot count query that uses a HAVING clause. Use the output walkers for pagination');
$query->getSQL();
}
/**
* Arbitrary Join
*/
public function testCountQueryWithArbitraryJoin(): void
{
$query = $this->entityManager->createQuery(
'SELECT p FROM Doctrine\Tests\ORM\Tools\Pagination\BlogPost p LEFT JOIN Doctrine\Tests\ORM\Tools\Pagination\Category c WITH p.category = c',
);
$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CountWalker::class]);
$query->setHint(CountWalker::HINT_DISTINCT, true);
$query->setFirstResult(0)->setMaxResults(null);
self::assertEquals(
'SELECT count(DISTINCT b0_.id) AS sclr_0 FROM BlogPost b0_ LEFT JOIN Category c1_ ON (b0_.category_id = c1_.id)',
$query->getSQL(),
);
}
}
|