Skip to content

Commit

Permalink
Merge branch 'hotfix/paginator-db-count-subselect' of https://github.…
Browse files Browse the repository at this point in the history
  • Loading branch information
EvanDotPro committed Jun 12, 2013
2 parents bcda072 + e04fb2a commit 6754264
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 27 deletions.
15 changes: 4 additions & 11 deletions library/Zend/Paginator/Adapter/DbSelect.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,22 +103,15 @@ public function count()
}

$select = clone $this->select;
$select->reset(Select::COLUMNS);
$select->reset(Select::LIMIT);
$select->reset(Select::OFFSET);
$select->reset(Select::ORDER);
$select->reset(Select::GROUP);

// get join information, clear, and repopulate without columns
$joins = $select->getRawState(Select::JOINS);
$select->reset(Select::JOINS);
foreach ($joins as $join) {
$select->join($join['name'], $join['on'], array(), $join['type']);
}

$select->columns(array('c' => new Expression('COUNT(1)')));
$countSelect = new Select;
$countSelect->columns(array('c' => new Expression('COUNT(1)')));
$countSelect->from(array('original_select' => $select));

$statement = $this->sql->prepareStatementForSqlObject($select);
$statement = $this->sql->prepareStatementForSqlObject($countSelect);
$result = $statement->execute();
$row = $result->current();

Expand Down
47 changes: 31 additions & 16 deletions tests/ZendTest/Paginator/Adapter/DbSelectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,29 +25,53 @@ class DbSelectTest extends \PHPUnit_Framework_TestCase
/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $mockSelect;

/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $mockStatement;

/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $mockResult;

/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $mockSql;

/** @var DbSelect */
protected $dbSelect;

public function setup()
{
$mockStatement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface');
$mockResult = $this->getMock('Zend\Db\Adapter\Driver\ResultInterface');
$this->mockResult = $mockResult;

$mockStatement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface');
$this->mockStatement = $mockStatement;

$this->mockStatement->expects($this->any())->method('execute')->will($this->returnValue($this->mockResult));

$mockDriver = $this->getMock('Zend\Db\Adapter\Driver\DriverInterface');
$mockDriver->expects($this->any())->method('createStatement')->will($this->returnValue($mockStatement));
$mockStatement->expects($this->any())->method('execute')->will($this->returnValue($mockResult));

$mockPlatform = $this->getMock('Zend\Db\Adapter\Platform\PlatformInterface');
$mockPlatform->expects($this->any())->method('getName')->will($this->returnValue('platform'));
$mockAdapter = $this->getMockForAbstractClass(
'Zend\Db\Adapter\Adapter',
array($mockDriver, $mockPlatform)
);

$mockSql = $this->getMock(
'Zend\Db\Sql\Sql',
array('prepareStatementForSqlObject', 'execute'),
array($mockAdapter)
);
$this->mockSql = $mockSql;
$this->mockSql->expects($this->once())
->method('prepareStatementForSqlObject')
->with($this->isInstanceOf('Zend\Db\Sql\Select'))
->will($this->returnValue($this->mockStatement));


$this->mockSelect = $this->getMock('Zend\Db\Sql\Select');
$this->mockResult = $mockResult;
$this->dbSelect = new DbSelect($this->mockSelect, $mockAdapter);

$this->dbSelect = new DbSelect($this->mockSelect, $mockSql);
}

public function testGetItems()
Expand All @@ -60,18 +84,9 @@ public function testGetItems()

public function testCount()
{
$this->mockSelect->expects($this->once())->method('columns')->with($this->equalTo(array('c' => new Expression('COUNT(1)'))));
$this->mockResult->expects($this->any())->method('current')->will($this->returnValue(array('c' => 5)));

$this->mockSelect->expects($this->exactly(6))->method('reset'); // called for columns, limit, offset, order
$this->mockSelect->expects($this->once())->method('getRawState')->with($this->equalTo(Select::JOINS))
->will($this->returnValue(array(array('name' => 'Foo', 'on' => 'On Stuff', 'columns' => array('foo', 'bar'), 'type' => Select::JOIN_INNER))));
$this->mockSelect->expects($this->once())->method('join')->with(
'Foo',
'On Stuff',
array(),
Select::JOIN_INNER
);
$this->mockResult->expects($this->once())->method('current')->will($this->returnValue(array('c' => 5)));

$this->mockSelect->expects($this->exactly(3))->method('reset'); // called for columns, limit, offset, order

$count = $this->dbSelect->count();
$this->assertEquals(5, $count);
Expand Down

0 comments on commit 6754264

Please sign in to comment.