Merge pull request #1547 from doctrine/fix-result-cache
[RFC] fixes result cache setting query caching
This commit is contained in:
commit
6dfafad33c
@ -294,6 +294,8 @@ final class Query extends AbstractQuery
|
||||
|
||||
if ($this->_queryCacheProfile) {
|
||||
$executor->setQueryCacheProfile($this->_queryCacheProfile);
|
||||
} else {
|
||||
$executor->removeQueryCacheProfile();
|
||||
}
|
||||
|
||||
if ($this->_resultSetMapping === null) {
|
||||
|
@ -63,6 +63,16 @@ abstract class AbstractSqlExecutor
|
||||
$this->queryCacheProfile = $qcp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do not use query cache
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function removeQueryCacheProfile()
|
||||
{
|
||||
$this->queryCacheProfile = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes all sql statements.
|
||||
*
|
||||
|
@ -7,12 +7,33 @@ namespace Doctrine\Tests\Mocks;
|
||||
*/
|
||||
class DriverConnectionMock implements \Doctrine\DBAL\Driver\Connection
|
||||
{
|
||||
/**
|
||||
* @var \Doctrine\DBAL\Driver\Statement
|
||||
*/
|
||||
private $statementMock;
|
||||
|
||||
/**
|
||||
* @return \Doctrine\DBAL\Driver\Statement
|
||||
*/
|
||||
public function getStatementMock()
|
||||
{
|
||||
return $this->statementMock;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Doctrine\DBAL\Driver\Statement $statementMock
|
||||
*/
|
||||
public function setStatementMock($statementMock)
|
||||
{
|
||||
$this->statementMock = $statementMock;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepare($prepareString)
|
||||
{
|
||||
return new StatementMock();
|
||||
return $this->statementMock ?: new StatementMock();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -20,7 +41,7 @@ class DriverConnectionMock implements \Doctrine\DBAL\Driver\Connection
|
||||
*/
|
||||
public function query()
|
||||
{
|
||||
return new StatementMock;
|
||||
return $this->statementMock ?: new StatementMock();
|
||||
}
|
||||
|
||||
/**
|
||||
|
71
tests/Doctrine/Tests/Mocks/StatementArrayMock.php
Normal file
71
tests/Doctrine/Tests/Mocks/StatementArrayMock.php
Normal file
@ -0,0 +1,71 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: avasilenko
|
||||
* Date: 24/04/15
|
||||
* Time: 19:01
|
||||
*/
|
||||
|
||||
namespace Doctrine\Tests\Mocks;
|
||||
|
||||
|
||||
/**
|
||||
* Simple statement mock that returns result based on array.
|
||||
* Doesn't support fetch modes
|
||||
*/
|
||||
class StatementArrayMock extends StatementMock
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $_result;
|
||||
|
||||
public function __construct($result)
|
||||
{
|
||||
$this->_result = $result;
|
||||
}
|
||||
|
||||
public function getIterator()
|
||||
{
|
||||
return new \ArrayIterator($this->_result);
|
||||
}
|
||||
|
||||
public function columnCount()
|
||||
{
|
||||
$row = reset($this->_result);
|
||||
if ($row) {
|
||||
return count($row);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public function fetchAll($fetchStyle = null)
|
||||
{
|
||||
return $this->_result;
|
||||
}
|
||||
|
||||
public function fetch($fetchStyle = null)
|
||||
{
|
||||
$current = current($this->_result);
|
||||
next($this->_result);
|
||||
|
||||
return $current;
|
||||
}
|
||||
|
||||
public function fetchColumn($columnIndex = 0)
|
||||
{
|
||||
$current = current($this->_result);
|
||||
if ($current) {
|
||||
next($this->_result);
|
||||
return reset($current);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function rowCount()
|
||||
{
|
||||
return count($this->_result);
|
||||
}
|
||||
}
|
@ -7,6 +7,8 @@ use Doctrine\Common\Collections\ArrayCollection;
|
||||
|
||||
use Doctrine\ORM\EntityManager;
|
||||
use Doctrine\ORM\Query\Parameter;
|
||||
use Doctrine\Tests\Mocks\DriverConnectionMock;
|
||||
use Doctrine\Tests\Mocks\StatementArrayMock;
|
||||
|
||||
class QueryTest extends \Doctrine\Tests\OrmTestCase
|
||||
{
|
||||
@ -198,6 +200,38 @@ class QueryTest extends \Doctrine\Tests\OrmTestCase
|
||||
$this->assertSame($config->getDefaultQueryHints(), $q2->getHints());
|
||||
}
|
||||
|
||||
/**
|
||||
* @group DDC-3714
|
||||
*/
|
||||
public function testResultCacheCaching()
|
||||
{
|
||||
$this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
|
||||
$this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache());
|
||||
/** @var DriverConnectionMock $driverConnectionMock */
|
||||
$driverConnectionMock = $this->_em->getConnection()->getWrappedConnection();
|
||||
$stmt = new StatementArrayMock([
|
||||
[
|
||||
'id_0' => 1,
|
||||
]
|
||||
]);
|
||||
$driverConnectionMock->setStatementMock($stmt);
|
||||
$res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u")
|
||||
->useQueryCache(true)
|
||||
->useResultCache(true, 60)
|
||||
//let it cache
|
||||
->getResult();
|
||||
|
||||
$this->assertCount(1, $res);
|
||||
|
||||
$driverConnectionMock->setStatementMock(null);
|
||||
|
||||
$res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u")
|
||||
->useQueryCache(true)
|
||||
->useResultCache(false)
|
||||
->getResult();
|
||||
$this->assertCount(0, $res);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group DDC-3741
|
||||
*/
|
||||
@ -205,7 +239,6 @@ class QueryTest extends \Doctrine\Tests\OrmTestCase
|
||||
{
|
||||
$query = $this->_em->createQuery();
|
||||
$query->setHydrationCacheProfile(null);
|
||||
|
||||
$this->assertNull($query->getHydrationCacheProfile());
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user