1
0
mirror of synced 2024-12-14 15:16:04 +03:00
doctrine2/tests/Doctrine/Tests/ORM/Functional/SecondLevelCacheQueryCacheTest.php
2013-12-16 11:05:04 -05:00

843 lines
39 KiB
PHP

<?php
namespace Doctrine\Tests\ORM\Functional;
use Doctrine\Tests\Models\Cache\Country;
use Doctrine\ORM\Query\ResultSetMapping;
use Doctrine\Tests\Models\Cache\State;
use Doctrine\Tests\Models\Cache\City;
use Doctrine\ORM\Cache\QueryCacheKey;
use Doctrine\ORM\Cache\EntityCacheKey;
use Doctrine\ORM\Cache\EntityCacheEntry;
use Doctrine\ORM\Cache;
/**
* @group DDC-2183
*/
class SecondLevelCacheQueryCacheTest extends SecondLevelCacheAbstractTest
{
public function testBasicQueryCache()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$result1 = $this->_em->createQuery($dql)->setCacheable(true)->getResult();
$this->assertCount(2, $result1);
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
$this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
$this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
$this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->_em->clear();
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertCount(2, $result2);
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
$this->assertEquals($result1[0]->getId(), $result2[0]->getId());
$this->assertEquals($result1[1]->getId(), $result2[1]->getId());
$this->assertEquals($result1[0]->getName(), $result2[0]->getName());
$this->assertEquals($result1[1]->getName(), $result2[1]->getName());
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
}
public function testQueryCacheModeGet()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->evictRegions();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$queryGet = $this->_em->createQuery($dql)
->setCacheMode(Cache::MODE_GET)
->setCacheable(true);
// MODE_GET should never add items to the cache.
$this->assertCount(2, $queryGet->getResult());
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertCount(2, $queryGet->getResult());
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$result = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertCount(2, $result);
$this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
// MODE_GET should read items if exists.
$this->assertCount(2, $queryGet->getResult());
$this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
}
public function testQueryCacheModePut()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->evictRegions();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$result = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$this->assertCount(2, $result);
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$queryPut = $this->_em->createQuery($dql)
->setCacheMode(Cache::MODE_PUT)
->setCacheable(true);
// MODE_PUT should never read itens from cache.
$this->assertCount(2, $queryPut->getResult());
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$this->assertCount(2, $queryPut->getResult());
$this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
}
public function testQueryCacheModeRefresh()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->evictRegions();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$region = $this->cache->getEntityCacheRegion(Country::CLASSNAME);
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$result = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$this->assertCount(2, $result);
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$countryId1 = $this->countries[0]->getId();
$countryId2 = $this->countries[1]->getId();
$countryName1 = $this->countries[0]->getName();
$countryName2 = $this->countries[1]->getName();
$key1 = new EntityCacheKey(Country::CLASSNAME, array('id'=>$countryId1));
$key2 = new EntityCacheKey(Country::CLASSNAME, array('id'=>$countryId2));
$entry1 = new EntityCacheEntry(Country::CLASSNAME, array('id'=>$countryId1, 'name'=>'outdated'));
$entry2 = new EntityCacheEntry(Country::CLASSNAME, array('id'=>$countryId2, 'name'=>'outdated'));
$region->put($key1, $entry1);
$region->put($key2, $entry2);
$this->_em->clear();
$queryRefresh = $this->_em->createQuery($dql)
->setCacheMode(Cache::MODE_REFRESH)
->setCacheable(true);
// MODE_REFRESH should never read itens from cache.
$result1 = $queryRefresh->getResult();
$this->assertCount(2, $result1);
$this->assertEquals($countryName1, $result1[0]->getName());
$this->assertEquals($countryName2, $result1[1]->getName());
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->_em->clear();
$result2 = $queryRefresh->getResult();
$this->assertCount(2, $result2);
$this->assertEquals($countryName1, $result2[0]->getName());
$this->assertEquals($countryName2, $result2[1]->getName());
$this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
}
public function testBasicQueryCachePutEntityCache()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->evictRegions();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$result1 = $this->_em->createQuery($dql)->setCacheable(true)->getResult();
$this->assertCount(2, $result1);
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
$this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
$this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
$this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(Country::CLASSNAME)));
$this->_em->clear();
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertCount(2, $result2);
$this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
$this->assertEquals($result1[0]->getId(), $result2[0]->getId());
$this->assertEquals($result1[1]->getId(), $result2[1]->getId());
$this->assertEquals($result1[0]->getName(), $result2[0]->getName());
$this->assertEquals($result1[1]->getName(), $result2[1]->getName());
$this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
}
public function testBasicQueryParams()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->_em->clear();
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$queryCount = $this->getCurrentQueryCount();
$name = $this->countries[0]->getName();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c WHERE c.name = :name';
$result1 = $this->_em->createQuery($dql)
->setCacheable(true)
->setParameter('name', $name)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
$this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
$this->_em->clear();
$result2 = $this->_em->createQuery($dql)->setCacheable(true)
->setParameter('name', $name)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertCount(1, $result2);
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
$this->assertEquals($result1[0]->getId(), $result2[0]->getId());
$this->assertEquals($result1[0]->getName(), $result2[0]->getName());
}
public function testLoadFromDatabaseWhenEntityMissing()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->_em->clear();
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$result1 = $this->_em->createQuery($dql)->setCacheable(true)->getResult();
$this->assertCount(2, $result1);
$this->assertEquals($queryCount + 1 , $this->getCurrentQueryCount());
$this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
$this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
$this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
$this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
$this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->cache->evictEntity(Country::CLASSNAME, $result1[0]->getId());
$this->assertFalse($this->cache->containsEntity(Country::CLASSNAME, $result1[0]->getId()));
$this->_em->clear();
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertEquals($queryCount + 2 , $this->getCurrentQueryCount());
$this->assertCount(2, $result2);
$this->assertEquals(5, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(2, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
$this->assertEquals($result1[0]->getId(), $result2[0]->getId());
$this->assertEquals($result1[1]->getId(), $result2[1]->getId());
$this->assertEquals($result1[0]->getName(), $result2[0]->getName());
$this->assertEquals($result1[1]->getName(), $result2[1]->getName());
$this->assertEquals($queryCount + 2 , $this->getCurrentQueryCount());
}
public function testBasicQueryFetchJoinsOneToMany()
{
$this->loadFixturesCountries();
$this->loadFixturesStates();
$this->loadFixturesCities();
$this->evictRegions();
$this->_em->clear();
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c';
$result1 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertInstanceOf(State::CLASSNAME, $result1[0]);
$this->assertInstanceOf(State::CLASSNAME, $result1[1]);
$this->assertCount(2, $result1[0]->getCities());
$this->assertCount(2, $result1[1]->getCities());
$this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(1));
$this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(1));
$this->assertNotNull($result1[0]->getCities()->get(0)->getId());
$this->assertNotNull($result1[0]->getCities()->get(1)->getId());
$this->assertNotNull($result1[1]->getCities()->get(0)->getId());
$this->assertNotNull($result1[1]->getCities()->get(1)->getId());
$this->assertNotNull($result1[0]->getCities()->get(0)->getName());
$this->assertNotNull($result1[0]->getCities()->get(1)->getName());
$this->assertNotNull($result1[1]->getCities()->get(0)->getName());
$this->assertNotNull($result1[1]->getCities()->get(1)->getName());
$this->_em->clear();
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertInstanceOf(State::CLASSNAME, $result2[0]);
$this->assertInstanceOf(State::CLASSNAME, $result2[1]);
$this->assertCount(2, $result2[0]->getCities());
$this->assertCount(2, $result2[1]->getCities());
$this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(1));
$this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(1));
$this->assertNotNull($result2[0]->getCities()->get(0)->getId());
$this->assertNotNull($result2[0]->getCities()->get(1)->getId());
$this->assertNotNull($result2[1]->getCities()->get(0)->getId());
$this->assertNotNull($result2[1]->getCities()->get(1)->getId());
$this->assertNotNull($result2[0]->getCities()->get(0)->getName());
$this->assertNotNull($result2[0]->getCities()->get(1)->getName());
$this->assertNotNull($result2[1]->getCities()->get(0)->getName());
$this->assertNotNull($result2[1]->getCities()->get(1)->getName());
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
}
public function testBasicQueryFetchJoinsManyToOne()
{
$this->loadFixturesCountries();
$this->loadFixturesStates();
$this->loadFixturesCities();
$this->_em->clear();
$this->evictRegions();
$this->secondLevelCacheLogger->clearStats();
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s';
$result1 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertCount(4, $result1);
$this->assertInstanceOf(City::CLASSNAME, $result1[0]);
$this->assertInstanceOf(City::CLASSNAME, $result1[1]);
$this->assertInstanceOf(State::CLASSNAME, $result1[0]->getState());
$this->assertInstanceOf(State::CLASSNAME, $result1[1]->getState());
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[0]->getId()));
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[1]->getId()));
$this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[0]->getState()->getId()));
$this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[1]->getState()->getId()));
$this->assertEquals(7, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->assertEquals(2, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(State::CLASSNAME)));
$this->assertEquals(4, $this->secondLevelCacheLogger->getRegionPutCount($this->getEntityRegion(City::CLASSNAME)));
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->_em->clear();
$this->secondLevelCacheLogger->clearStats();
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertCount(4, $result1);
$this->assertInstanceOf(City::CLASSNAME, $result2[0]);
$this->assertInstanceOf(City::CLASSNAME, $result2[1]);
$this->assertInstanceOf(State::CLASSNAME, $result2[0]->getState());
$this->assertInstanceOf(State::CLASSNAME, $result2[1]->getState());
$this->assertNotNull($result2[0]->getId());
$this->assertNotNull($result2[0]->getId());
$this->assertNotNull($result2[1]->getState()->getId());
$this->assertNotNull($result2[1]->getState()->getId());
$this->assertNotNull($result2[0]->getName());
$this->assertNotNull($result2[0]->getName());
$this->assertNotNull($result2[1]->getState()->getName());
$this->assertNotNull($result2[1]->getState()->getName());
$this->assertEquals($result1[0]->getName(), $result2[0]->getName());
$this->assertEquals($result1[1]->getName(), $result2[1]->getName());
$this->assertEquals($result1[0]->getState()->getName(), $result2[0]->getState()->getName());
$this->assertEquals($result1[1]->getState()->getName(), $result2[1]->getState()->getName());
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
}
public function testReloadQueryIfToOneIsNotFound()
{
$this->loadFixturesCountries();
$this->loadFixturesStates();
$this->loadFixturesCities();
$this->_em->clear();
$this->evictRegions();
$this->secondLevelCacheLogger->clearStats();
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c, s FROM Doctrine\Tests\Models\Cache\City c JOIN c.state s';
$result1 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertCount(4, $result1);
$this->assertInstanceOf(City::CLASSNAME, $result1[0]);
$this->assertInstanceOf(City::CLASSNAME, $result1[1]);
$this->assertInstanceOf(State::CLASSNAME, $result1[0]->getState());
$this->assertInstanceOf(State::CLASSNAME, $result1[1]->getState());
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[0]->getId()));
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $result1[1]->getId()));
$this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[0]->getState()->getId()));
$this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $result1[1]->getState()->getId()));
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->_em->clear();
$this->cache->evictEntityRegion(State::CLASSNAME);
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertCount(4, $result1);
$this->assertInstanceOf(City::CLASSNAME, $result2[0]);
$this->assertInstanceOf(City::CLASSNAME, $result2[1]);
$this->assertInstanceOf(State::CLASSNAME, $result2[0]->getState());
$this->assertInstanceOf(State::CLASSNAME, $result2[1]->getState());
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
}
public function testReloadQueryIfToManyAssociationItemIsNotFound()
{
$this->loadFixturesCountries();
$this->loadFixturesStates();
$this->loadFixturesCities();
$this->evictRegions();
$this->_em->clear();
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT s, c FROM Doctrine\Tests\Models\Cache\State s JOIN s.cities c';
$result1 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertInstanceOf(State::CLASSNAME, $result1[0]);
$this->assertInstanceOf(State::CLASSNAME, $result1[1]);
$this->assertCount(2, $result1[0]->getCities());
$this->assertCount(2, $result1[1]->getCities());
$this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result1[0]->getCities()->get(1));
$this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result1[1]->getCities()->get(1));
$this->_em->clear();
$this->cache->evictEntityRegion(City::CLASSNAME);
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertInstanceOf(State::CLASSNAME, $result2[0]);
$this->assertInstanceOf(State::CLASSNAME, $result2[1]);
$this->assertCount(2, $result2[0]->getCities());
$this->assertCount(2, $result2[1]->getCities());
$this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result2[0]->getCities()->get(1));
$this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(0));
$this->assertInstanceOf(City::CLASSNAME, $result2[1]->getCities()->get(1));
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
}
public function testBasicNativeQueryCache()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[0]->getId()));
$this->assertTrue($this->cache->containsEntity(Country::CLASSNAME, $this->countries[1]->getId()));
$rsm = new ResultSetMapping;
$rsm->addEntityResult(Country::CLASSNAME, 'c');
$rsm->addFieldResult('c', 'name', 'name');
$rsm->addFieldResult('c', 'id', 'id');
$queryCount = $this->getCurrentQueryCount();
$sql = 'SELECT id, name FROM cache_country';
$result1 = $this->_em->createNativeQuery($sql, $rsm)->setCacheable(true)->getResult();
$this->assertCount(2, $result1);
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertEquals($this->countries[0]->getId(), $result1[0]->getId());
$this->assertEquals($this->countries[1]->getId(), $result1[1]->getId());
$this->assertEquals($this->countries[0]->getName(), $result1[0]->getName());
$this->assertEquals($this->countries[1]->getName(), $result1[1]->getName());
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->_em->clear();
$result2 = $this->_em->createNativeQuery($sql, $rsm)
->setCacheable(true)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertCount(2, $result2);
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[0]);
$this->assertInstanceOf('Doctrine\Tests\Models\Cache\Country', $result2[1]);
$this->assertEquals($result1[0]->getId(), $result2[0]->getId());
$this->assertEquals($result1[1]->getId(), $result2[1]->getId());
$this->assertEquals($result1[0]->getName(), $result2[0]->getName());
$this->assertEquals($result1[1]->getName(), $result2[1]->getName());
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount($this->getDefaultQueryRegionName()));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount($this->getDefaultQueryRegionName()));
}
public function testQueryDependsOnFirstAndMaxResultResult()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$result1 = $this->_em->createQuery($dql)
->setCacheable(true)
->setFirstResult(1)
->setMaxResults(1)
->getResult();
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->_em->clear();
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->setFirstResult(2)
->setMaxResults(1)
->getResult();
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
$this->_em->clear();
$result3 = $this->_em->createQuery($dql)
->setCacheable(true)
->getResult();
$this->assertEquals($queryCount + 3, $this->getCurrentQueryCount());
$this->assertEquals(3, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(3, $this->secondLevelCacheLogger->getMissCount());
}
public function testQueryCacheLifetime()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$getHash = function(\Doctrine\ORM\AbstractQuery $query){
$method = new \ReflectionMethod($query, 'getHash');
$method->setAccessible(true);
return $method->invoke($query);
};
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$query = $this->_em->createQuery($dql);
$result1 = $query->setCacheable(true)
->setLifetime(3600)
->getResult();
$this->assertNotEmpty($result1);
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->_em->clear();
$key = new QueryCacheKey($getHash($query), 3600);
$entry = $this->cache->getQueryCache()
->getRegion()
->get($key);
$this->assertInstanceOf('Doctrine\ORM\Cache\QueryCacheEntry', $entry);
$entry->time = $entry->time / 2;
$this->cache->getQueryCache()
->getRegion()
->put($key, $entry);
$result2 = $this->_em->createQuery($dql)
->setCacheable(true)
->setLifetime(3600)
->getResult();
$this->assertNotEmpty($result2);
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
}
public function testQueryCacheRegion()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->secondLevelCacheLogger->clearStats();
$this->_em->clear();
$queryCount = $this->getCurrentQueryCount();
$dql = 'SELECT c FROM Doctrine\Tests\Models\Cache\Country c';
$query = $this->_em->createQuery($dql);
$query1 = clone $query;
$result1 = $query1->setCacheable(true)
->setCacheRegion('foo_region')
->getResult();
$this->assertNotEmpty($result1);
$this->assertEquals($queryCount + 1, $this->getCurrentQueryCount());
$this->assertEquals(0, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('foo_region'));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('foo_region'));
$query2 = clone $query;
$result2 = $query2->setCacheable(true)
->setCacheRegion('bar_region')
->getResult();
$this->assertNotEmpty($result2);
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->assertEquals(0, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('bar_region'));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('bar_region'));
$query3 = clone $query;
$result3 = $query3->setCacheable(true)
->setCacheRegion('foo_region')
->getResult();
$this->assertNotEmpty($result3);
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount('foo_region'));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('foo_region'));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('foo_region'));
$query4 = clone $query;
$result4 = $query4->setCacheable(true)
->setCacheRegion('bar_region')
->getResult();
$this->assertNotEmpty($result3);
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getHitCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getPutCount());
$this->assertEquals(2, $this->secondLevelCacheLogger->getMissCount());
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionHitCount('bar_region'));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionPutCount('bar_region'));
$this->assertEquals(1, $this->secondLevelCacheLogger->getRegionMissCount('bar_region'));
}
/**
* @expectedException \Doctrine\ORM\Cache\CacheException
* @expectedExceptionMessage Second level cache does not support partial entities.
*/
public function testCacheablePartialQueryException()
{
$this->evictRegions();
$this->loadFixturesCountries();
$this->_em->createQuery("SELECT PARTIAL c.{id} FROM Doctrine\Tests\Models\Cache\Country c")
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->setCacheable(true)
->getResult();
}
}