Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Merge branch 'feature/zendframework/zendframework#5518-allow-custom-r…
Browse files Browse the repository at this point in the history
…ow-count-column-name' into develop

Close zendframework/zendframework#5518
  • Loading branch information
Ocramius committed Nov 12, 2014
179 parents fae3afa + 3833182 + fd8deb8 + 4cda17f + b678d4c + e07a576 + ace2d81 + 77f83ca + 130a50a + f12feba + 4452247 + 2630a49 + 43cba4d + e4204b5 + d05ccf2 + e604cfb + ca97c01 + 287eb63 + 51a49db + a59e5dc + 548a07d + 8505b4c + 2716d1a + 37045c3 + 6903d5f + cdad453 + 9db7df2 + 9bb9d9a + 41b2dc0 + 5295cf8 + 27f9b6d + b273434 + 5b111b1 + ee4a022 + 5130ae3 + aff706f + f73a53d + d4a913a + b29f072 + 651a727 + 430d154 + 1839a34 + 0d5d64e + 5cde84e + dc8ee4d + 85d900a + 887c312 + 9c949ae + 0fc5669 + e29d393 + e25c698 + ca5bdbb + 18e54b8 + 73cc878 + a514416 + 778823f + fff1957 + 35beb1b + ecb2a1a + 67a31fa + c0ee14a + 7273469 + 62e104e + 293b0d0 + c59092f + b3e8431 + 615f1cb + 198a3b9 + 1630584 + 7627438 + 84a5bf6 + ad86c9d + a84a8ca + 4198a62 + e822871 + 431867b + 200dbe0 + 7277f0b + 2408da8 + 2413f67 + 4731ffc + d177c96 + b27c24b + ec13154 + 8e7b30c + 6c4437a + 2a2ed86 + 366d656 + 5f3d390 + 666d47b + dd0e03b + 1a5602a + c01cd9c + 6849552 + 8b79ca2 + e84f0d1 + 9f1b34e + c453b3e + 3d74be7 + 999502e + a46d96f + fba87c0 + ce665da + ef2dd94 + a66c89a + b997097 + da0e97d + 1302f0b + a1bbaa9 + 6bfa503 + b4b9ece + 9b1ac2d + 30880b8 + e308f6d + 8da89be + 199755f + 2310cd0 + 4e7316f + 1d6c476 + c2593db + c6ff37b + 5344902 + a35c230 + 39052a9 + 8152f2f + e0f8777 + d1f068b + 006fb88 + 6261074 + 8bf6181 + 33e79d4 + a778f16 + 57199ed + 3653e0c + 5b5a61e + 082fd49 + d56f4bf + d4ad9b4 + c2442b4 + a56d05b + 7400cfb + 8794fff + 0877be7 + 9c75f77 + 261c157 + 94f1dd4 + ae538e5 + bf68265 + c222657 + 56e71f6 + b95fff7 + 7736317 + 8a3b848 + e18ea15 + ae1a095 + a18a97f + c3ef55c + 09f0424 + 6369f0d + bbce3db + e7612d4 + af38e3f + cd3f4d4 + 498edd0 + a792bd9 + 9922da0 + 350dc8b + d9ed179 + 622be5c + 7960d27 + a406fa3 + b68216d + 0ff2c31 + 9b14073 + 3983ab0 + f028776 + 60ef0d1 + 76edd11 + 95564be commit 30f4267
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 41 deletions.
60 changes: 46 additions & 14 deletions src/Adapter/DbSelect.php
Expand Up @@ -18,42 +18,57 @@

class DbSelect implements AdapterInterface
{
const ROW_COUNT_COLUMN_NAME = 'C';

/**
* @var Sql
*/
protected $sql = null;
protected $sql;

/**
* Database query
*
* @var Select
*/
protected $select = null;
protected $select;

/**
* Database count query
*
* @var Select|null
*/
protected $countSelect;

/**
* @var ResultSet
*/
protected $resultSetPrototype = null;
protected $resultSetPrototype;

/**
* Total item count
*
* @var int
*/
protected $rowCount = null;
protected $rowCount;

/**
* Constructor.
*
* @param Select $select The select query
* @param Adapter|Sql $adapterOrSqlObject DB adapter or Sql object
* @param null|ResultSetInterface $resultSetPrototype
* @param null|Select $countSelect
*
* @throws Exception\InvalidArgumentException
*/
public function __construct(Select $select, $adapterOrSqlObject, ResultSetInterface $resultSetPrototype = null)
{
public function __construct(
Select $select,
$adapterOrSqlObject,
ResultSetInterface $resultSetPrototype = null,
Select $countSelect = null
) {
$this->select = $select;
$this->countSelect = $countSelect;

if ($adapterOrSqlObject instanceof Adapter) {
$adapterOrSqlObject = new Sql($adapterOrSqlObject);
Expand Down Expand Up @@ -102,21 +117,38 @@ public function count()
return $this->rowCount;
}

$select = $this->getSelectCount();

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

$this->rowCount = (int) $row[self::ROW_COUNT_COLUMN_NAME];

return $this->rowCount;
}

/**
* Returns select query for count
*
* @return Select
*/
protected function getSelectCount()
{
if ($this->countSelect) {
return $this->countSelect;
}

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

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

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

$this->rowCount = $row['c'];
$countSelect->columns(array(self::ROW_COUNT_COLUMN_NAME => new Expression('COUNT(1)')));
$countSelect->from(array('original_select' => $select));

return $this->rowCount;
return $countSelect;
}
}
56 changes: 31 additions & 25 deletions test/Adapter/DbSelectTest.php
Expand Up @@ -17,56 +17,53 @@
*/
class DbSelectTest extends \PHPUnit_Framework_TestCase
{
/** @var \PHPUnit_Framework_MockObject_MockObject */
/** @var \PHPUnit_Framework_MockObject_MockObject|\Zend\Db\Sql\Select */
protected $mockSelect;

/** @var \PHPUnit_Framework_MockObject_MockObject */
/** @var PHPUnit_Framework_MockObject_MockObject|\Zend\Db\Sql\Select */
protected $mockSelectCount;

/** @var \PHPUnit_Framework_MockObject_MockObject|\Zend\Db\Adapter\Driver\StatementInterface */
protected $mockStatement;

/** @var \PHPUnit_Framework_MockObject_MockObject */
/** @var \PHPUnit_Framework_MockObject_MockObject|\Zend\Db\Adapter\Driver\ResultInterface */
protected $mockResult;

/** @var \PHPUnit_Framework_MockObject_MockObject */
/** @var \PHPUnit_Framework_MockObject_MockObject|\Zend\Db\Sql\Sql */
protected $mockSql;

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

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

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

$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));

$mockDriver = $this->getMock('Zend\Db\Adapter\Driver\DriverInterface');
$mockPlatform = $this->getMock('Zend\Db\Adapter\Platform\PlatformInterface');

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

$mockSql = $this->getMock(
$this->mockSql = $this->getMock(
'Zend\Db\Sql\Sql',
array('prepareStatementForSqlObject', 'execute'),
array($mockAdapter)
array($this->getMockForAbstractClass('Zend\Db\Adapter\Adapter', array($mockDriver, $mockPlatform)))
);
$this->mockSql = $mockSql;
$this->mockSql->expects($this->once())

$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->dbSelect = new DbSelect($this->mockSelect, $mockSql);
$this->mockSelect = $this->getMock('Zend\Db\Sql\Select');
$this->mockSelectCount = $this->getMock('Zend\Db\Sql\Select');
$this->dbSelect = new DbSelect($this->mockSelect, $this->mockSql);
}

public function testGetItems()
Expand All @@ -79,11 +76,20 @@ public function testGetItems()

public function testCount()
{
$this->mockResult->expects($this->once())->method('current')->will($this->returnValue(array('c' => 5)));
$this->mockResult->expects($this->once())->method('current')->will($this->returnValue(array(DbSelect::ROW_COUNT_COLUMN_NAME => 5)));

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

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

public function testCustomCount()
{
$this->dbSelect = new DbSelect($this->mockSelect, $this->mockSql, null, $this->mockSelectCount);
$this->mockResult->expects($this->once())->method('current')->will($this->returnValue(array(DbSelect::ROW_COUNT_COLUMN_NAME => 7)));

$count = $this->dbSelect->count();
$this->assertEquals(7, $count);
}
}
4 changes: 2 additions & 2 deletions test/Adapter/DbTableGatewayTest.php
Expand Up @@ -10,8 +10,8 @@
namespace ZendTest\Paginator\Adapter;

use Zend\Db\Adapter\Platform\Sql92;
use Zend\Paginator\Adapter\DbSelect;
use Zend\Paginator\Adapter\DbTableGateway;
use Zend\Db\ResultSet\ResultSet;

/**
* @group Zend_Paginator
Expand Down Expand Up @@ -74,7 +74,7 @@ public function testCount()
$mockResult = $this->getMock('Zend\Db\Adapter\Driver\ResultInterface');
$mockResult->expects($this->any())
->method('current')
->will($this->returnValue(array('c' => 10)));
->will($this->returnValue(array(DbSelect::ROW_COUNT_COLUMN_NAME => 10)));

$this->mockStatement->expects($this->any())
->method('execute')
Expand Down

0 comments on commit 30f4267

Please sign in to comment.