diff --git a/src/Adapter/DbSelect.php b/src/Adapter/DbSelect.php index 92c7b53..c9ade72 100644 --- a/src/Adapter/DbSelect.php +++ b/src/Adapter/DbSelect.php @@ -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(); diff --git a/test/Adapter/DbSelectTest.php b/test/Adapter/DbSelectTest.php index ac21f28..599cc29 100644 --- a/test/Adapter/DbSelectTest.php +++ b/test/Adapter/DbSelectTest.php @@ -25,19 +25,31 @@ 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( @@ -45,9 +57,21 @@ public function setup() 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() @@ -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);