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) {
|
if ($this->_queryCacheProfile) {
|
||||||
$executor->setQueryCacheProfile($this->_queryCacheProfile);
|
$executor->setQueryCacheProfile($this->_queryCacheProfile);
|
||||||
|
} else {
|
||||||
|
$executor->removeQueryCacheProfile();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->_resultSetMapping === null) {
|
if ($this->_resultSetMapping === null) {
|
||||||
|
@ -63,6 +63,16 @@ abstract class AbstractSqlExecutor
|
|||||||
$this->queryCacheProfile = $qcp;
|
$this->queryCacheProfile = $qcp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do not use query cache
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function removeQueryCacheProfile()
|
||||||
|
{
|
||||||
|
$this->queryCacheProfile = null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes all sql statements.
|
* Executes all sql statements.
|
||||||
*
|
*
|
||||||
|
@ -7,12 +7,33 @@ namespace Doctrine\Tests\Mocks;
|
|||||||
*/
|
*/
|
||||||
class DriverConnectionMock implements \Doctrine\DBAL\Driver\Connection
|
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}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function prepare($prepareString)
|
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()
|
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\EntityManager;
|
||||||
use Doctrine\ORM\Query\Parameter;
|
use Doctrine\ORM\Query\Parameter;
|
||||||
|
use Doctrine\Tests\Mocks\DriverConnectionMock;
|
||||||
|
use Doctrine\Tests\Mocks\StatementArrayMock;
|
||||||
|
|
||||||
class QueryTest extends \Doctrine\Tests\OrmTestCase
|
class QueryTest extends \Doctrine\Tests\OrmTestCase
|
||||||
{
|
{
|
||||||
@ -198,6 +200,38 @@ class QueryTest extends \Doctrine\Tests\OrmTestCase
|
|||||||
$this->assertSame($config->getDefaultQueryHints(), $q2->getHints());
|
$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
|
* @group DDC-3741
|
||||||
*/
|
*/
|
||||||
@ -205,7 +239,6 @@ class QueryTest extends \Doctrine\Tests\OrmTestCase
|
|||||||
{
|
{
|
||||||
$query = $this->_em->createQuery();
|
$query = $this->_em->createQuery();
|
||||||
$query->setHydrationCacheProfile(null);
|
$query->setHydrationCacheProfile(null);
|
||||||
|
|
||||||
$this->assertNull($query->getHydrationCacheProfile());
|
$this->assertNull($query->getHydrationCacheProfile());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user