3 namespace Doctrine\Tests\ORM\Functional;
5 use Doctrine\ORM\Tools\SchemaTool;
6 use Doctrine\ORM\Query;
7 use Doctrine\Tests\Models\CMS\CmsUser;
8 use Doctrine\Tests\Models\CMS\CmsPhonenumber;
9 use Doctrine\Tests\Models\CMS\CmsAddress;
10 use Doctrine\Tests\Models\CMS\CmsGroup;
11 use Doctrine\Tests\Models\CMS\CmsArticle;
12 use Doctrine\Tests\Models\CMS\CmsComment;
13 use Doctrine\ORM\Tools\Pagination\Paginator;
18 class PaginationTest extends \Doctrine\Tests\OrmFunctionalTestCase
20 protected function setUp()
22 $this->useModelSet('cms');
28 * @dataProvider useOutputWalkers
30 public function testCountSimpleWithoutJoin($useOutputWalkers)
32 $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
33 $query = $this->_em->createQuery($dql);
35 $paginator = new Paginator($query);
36 $paginator->setUseOutputWalkers($useOutputWalkers);
37 $this->assertCount(3, $paginator);
41 * @dataProvider useOutputWalkers
43 public function testCountWithFetchJoin($useOutputWalkers)
45 $dql = "SELECT u,g FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g";
46 $query = $this->_em->createQuery($dql);
48 $paginator = new Paginator($query);
49 $paginator->setUseOutputWalkers($useOutputWalkers);
50 $this->assertCount(3, $paginator);
53 public function testCountComplexWithOutputWalker()
55 $dql = "SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMS\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0";
56 $query = $this->_em->createQuery($dql);
58 $paginator = new Paginator($query);
59 $paginator->setUseOutputWalkers(true);
60 $this->assertCount(9, $paginator);
64 * @dataProvider useOutputWalkers
66 public function testIterateSimpleWithoutJoinFetchJoinHandlingOff($useOutputWalkers)
68 $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
69 $query = $this->_em->createQuery($dql);
71 $paginator = new Paginator($query, false);
72 $paginator->setUseOutputWalkers($useOutputWalkers);
73 $this->assertCount(3, $paginator->getIterator());
77 * @dataProvider useOutputWalkers
79 public function testIterateSimpleWithoutJoinFetchJoinHandlingOn($useOutputWalkers)
81 $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
82 $query = $this->_em->createQuery($dql);
84 $paginator = new Paginator($query, true);
85 $paginator->setUseOutputWalkers($useOutputWalkers);
86 $this->assertCount(3, $paginator->getIterator());
90 * @dataProvider useOutputWalkers
92 public function testIterateWithFetchJoin($useOutputWalkers)
94 $dql = "SELECT u,g FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g";
95 $query = $this->_em->createQuery($dql);
97 $paginator = new Paginator($query, true);
98 $paginator->setUseOutputWalkers($useOutputWalkers);
99 $this->assertCount(3, $paginator->getIterator());
102 public function testIterateComplexWithOutputWalker()
104 $dql = "SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMS\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0";
105 $query = $this->_em->createQuery($dql);
107 $paginator = new Paginator($query);
108 $paginator->setUseOutputWalkers(true);
109 $this->assertCount(9, $paginator->getIterator());
112 public function testDetectOutputWalker()
114 // This query works using the output walkers but causes an exception using the TreeWalker
115 $dql = "SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMS\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0";
116 $query = $this->_em->createQuery($dql);
118 // If the Paginator detects the custom output walker it should fall back to using the
119 // Tree walkers for pagination, which leads to an exception. If the query works, the output walkers were used
120 $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Query\SqlWalker');
121 $paginator = new Paginator($query);
123 $this->setExpectedException(
125 'Cannot count query that uses a HAVING clause. Use the output walkers for pagination'
131 public function testCloneQuery()
133 $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
134 $query = $this->_em->createQuery($dql);
136 $paginator = new Paginator($query);
137 $paginator->getIterator();
139 $this->assertTrue($query->getParameters()->isEmpty());
142 public function populate()
144 for ($i = 0; $i < 3; $i++) {
145 $user = new CmsUser();
146 $user->name = "Name$i";
147 $user->username = "username$i";
148 $user->status = "active";
149 $this->_em->persist($user);
151 for ($j = 0; $j < 3; $j++) {;
152 $group = new CmsGroup();
153 $group->name = "group$j";
154 $user->addGroup($group);
155 $this->_em->persist($group);
161 public function useOutputWalkers()