1
0
mirror of synced 2025-02-02 21:41:45 +03:00

Merge pull request #1547 from doctrine/fix-result-cache

[RFC] fixes result cache setting query caching
This commit is contained in:
Guilherme Blanco 2015-11-07 11:22:14 -05:00
commit 6dfafad33c
5 changed files with 140 additions and 3 deletions

View File

@ -294,6 +294,8 @@ final class Query extends AbstractQuery
if ($this->_queryCacheProfile) {
$executor->setQueryCacheProfile($this->_queryCacheProfile);
} else {
$executor->removeQueryCacheProfile();
}
if ($this->_resultSetMapping === null) {

View File

@ -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.
*

View File

@ -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();
}
/**

View 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);
}
}

View File

@ -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());
}
}