Skip to content

Commit

Permalink
[DDC-1918] Fix weird results at the end of paginator when using fetch…
Browse files Browse the repository at this point in the history
… joins
  • Loading branch information
beberlei committed Aug 29, 2012
1 parent 9c682ef commit bc2476f
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 13 deletions.
22 changes: 12 additions & 10 deletions lib/Doctrine/ORM/Tools/Pagination/Paginator.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,16 +174,18 @@ public function getIterator()

$whereInQuery = $this->cloneQuery($this->query);
// don't do this for an empty id array
if (count($ids) > 0) {
$namespace = WhereInWalker::PAGINATOR_ID_ALIAS;

$whereInQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\WhereInWalker'));
$whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids));
$whereInQuery->setFirstResult(null)->setMaxResults(null);
foreach ($ids as $i => $id) {
$i++;
$whereInQuery->setParameter("{$namespace}_{$i}", $id);
}
if (count($ids) == 0) {
return new \ArrayIterator(array());
}

$namespace = WhereInWalker::PAGINATOR_ID_ALIAS;

$whereInQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\WhereInWalker'));
$whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids));
$whereInQuery->setFirstResult(null)->setMaxResults(null);
foreach ($ids as $i => $id) {
$i++;
$whereInQuery->setParameter("{$namespace}_{$i}", $id);
}

$result = $whereInQuery->getResult($this->query->getHydrationMode());
Expand Down
4 changes: 1 addition & 3 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1885Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
use Doctrine\Tests\Models\Quote\Group;
use Doctrine\Tests\Models\Quote\User;

require_once __DIR__ . '/../../../TestInit.php';

/**
* @group DDC-1845
* @group DDC-1885
Expand Down Expand Up @@ -170,4 +168,4 @@ public function testCountExtraLazy()
$this->assertInstanceOf('Doctrine\Tests\Models\Quote\Group', $user->getGroups()->get(0));
$this->assertInstanceOf('Doctrine\Tests\Models\Quote\Group', $user->getGroups()->get(1));
}
}
}
62 changes: 62 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1918Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\Tests\Models\CMS\CmsUser;
use Doctrine\Tests\Models\CMS\CmsGroup;
use Doctrine\ORM\Tools\Pagination\Paginator;

/**
* @group DDC-1918
*/
class DDC1918Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
protected function setUp()
{
$this->useModelSet('cms');
parent::setUp();
}

public function testLastPageCorrect()
{
$groups = array();
for ($i = 0; $i < 3; $i++) {
$group = new CmsGroup();
$group->name = "test";
$this->_em->persist($group);

$groups[] = $group;
}

for ($i = 0; $i < 10; $i++) {
$user = new CmsUser();
$user->username = "user$i";
$user->name = "user$i";
$user->status = "active";
$user->groups = $groups;

$this->_em->persist($user);
}

$this->_em->flush();

$query = $this->_em->createQuery('SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g');
$query->setFirstResult(6);
$query->setMaxResults(3);

$paginator = new Paginator($query, true);
$this->assertEquals(3, count(iterator_to_array($paginator)));

$query->setFirstResult(8);
$query->setMaxResults(3);

$paginator = new Paginator($query, true);
$this->assertEquals(2, count(iterator_to_array($paginator)));

$query->setFirstResult(10);
$query->setMaxResults(3);

$paginator = new Paginator($query, true);
$this->assertEquals(0, count(iterator_to_array($paginator)));
}
}

0 comments on commit bc2476f

Please sign in to comment.