diff --git a/lib/Doctrine/ORM/Query.php b/lib/Doctrine/ORM/Query.php index 1911200a9..21c51f042 100644 --- a/lib/Doctrine/ORM/Query.php +++ b/lib/Doctrine/ORM/Query.php @@ -294,6 +294,8 @@ final class Query extends AbstractQuery if ($this->_queryCacheProfile) { $executor->setQueryCacheProfile($this->_queryCacheProfile); + } else { + $executor->removeQueryCacheProfile(); } if ($this->_resultSetMapping === null) { diff --git a/lib/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php b/lib/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php index 9be35df18..8955b9215 100644 --- a/lib/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php +++ b/lib/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php @@ -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. * diff --git a/tests/Doctrine/Tests/Mocks/DriverConnectionMock.php b/tests/Doctrine/Tests/Mocks/DriverConnectionMock.php index 6acb89ba7..9c2215b97 100644 --- a/tests/Doctrine/Tests/Mocks/DriverConnectionMock.php +++ b/tests/Doctrine/Tests/Mocks/DriverConnectionMock.php @@ -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(); } /** diff --git a/tests/Doctrine/Tests/Mocks/StatementArrayMock.php b/tests/Doctrine/Tests/Mocks/StatementArrayMock.php new file mode 100644 index 000000000..4054b9a9e --- /dev/null +++ b/tests/Doctrine/Tests/Mocks/StatementArrayMock.php @@ -0,0 +1,71 @@ +_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); + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Query/QueryTest.php b/tests/Doctrine/Tests/ORM/Query/QueryTest.php index dd509eea2..2618af1db 100644 --- a/tests/Doctrine/Tests/ORM/Query/QueryTest.php +++ b/tests/Doctrine/Tests/ORM/Query/QueryTest.php @@ -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()); } }