1
0
mirror of synced 2025-01-31 20:41:44 +03:00

Merge pull request #950 from goetas/patch-1

[SLC] Cache empty collections
This commit is contained in:
Fabio B. Silva 2014-02-12 04:26:27 -05:00
commit a3b4104612
4 changed files with 69 additions and 8 deletions

View File

@ -508,7 +508,7 @@ abstract class AbstractEntityPersister implements CachedEntityPersister
$list = $this->persister->loadManyToManyCollection($assoc, $sourceEntity, $coll); $list = $this->persister->loadManyToManyCollection($assoc, $sourceEntity, $coll);
if ($hasCache && ! empty($list)) { if ($hasCache) {
$persister->storeCollectionCache($key, $list); $persister->storeCollectionCache($key, $list);
if ($this->cacheLogger) { if ($this->cacheLogger) {
@ -543,7 +543,7 @@ abstract class AbstractEntityPersister implements CachedEntityPersister
$list = $this->persister->loadOneToManyCollection($assoc, $sourceEntity, $coll); $list = $this->persister->loadOneToManyCollection($assoc, $sourceEntity, $coll);
if ($hasCache && ! empty($list)) { if ($hasCache) {
$persister->storeCollectionCache($key, $list); $persister->storeCollectionCache($key, $list);
if ($this->cacheLogger) { if ($this->cacheLogger) {

View File

@ -121,7 +121,7 @@ abstract class SecondLevelCacheAbstractTest extends OrmFunctionalTestCase
$this->_em->flush(); $this->_em->flush();
} }
protected function loadFixturesTravelersWithProfile() protected function loadFixturesTravelersWithProfile()
{ {
$t1 = new Traveler("Test traveler 1"); $t1 = new Traveler("Test traveler 1");
@ -139,7 +139,7 @@ abstract class SecondLevelCacheAbstractTest extends OrmFunctionalTestCase
$this->travelersWithProfile[] = $t1; $this->travelersWithProfile[] = $t1;
$this->travelersWithProfile[] = $t2; $this->travelersWithProfile[] = $t2;
$this->_em->flush(); $this->_em->flush();
} }
@ -165,6 +165,7 @@ abstract class SecondLevelCacheAbstractTest extends OrmFunctionalTestCase
{ {
$t1 = new Travel($this->travelers[0]); $t1 = new Travel($this->travelers[0]);
$t2 = new Travel($this->travelers[1]); $t2 = new Travel($this->travelers[1]);
$t3 = new Travel($this->travelers[1]);
$t1->addVisitedCity($this->cities[0]); $t1->addVisitedCity($this->cities[0]);
$t1->addVisitedCity($this->cities[1]); $t1->addVisitedCity($this->cities[1]);
@ -175,9 +176,11 @@ abstract class SecondLevelCacheAbstractTest extends OrmFunctionalTestCase
$this->_em->persist($t1); $this->_em->persist($t1);
$this->_em->persist($t2); $this->_em->persist($t2);
$this->_em->persist($t3);
$this->travels[] = $t1; $this->travels[] = $t1;
$this->travels[] = $t2; $this->travels[] = $t2;
$this->travels[] = $t3;
$this->_em->flush(); $this->_em->flush();
} }

View File

@ -171,7 +171,7 @@ class SecondLevelCacheManyToManyTest extends SecondLevelCacheAbstractTest
$this->_em->flush(); $this->_em->flush();
$this->_em->clear(); $this->_em->clear();
$this->assertTrue($this->cache->containsEntity(Traveler::CLASSNAME, $travel->getId())); $this->assertTrue($this->cache->containsEntity(Travel::CLASSNAME, $travel->getId()));
$this->assertTrue($this->cache->containsEntity(Traveler::CLASSNAME, $traveler->getId())); $this->assertTrue($this->cache->containsEntity(Traveler::CLASSNAME, $traveler->getId()));
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[0]->getId())); $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[0]->getId()));
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[1]->getId())); $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->cities[1]->getId()));
@ -214,4 +214,33 @@ class SecondLevelCacheManyToManyTest extends SecondLevelCacheAbstractTest
$this->_em->persist($travel); $this->_em->persist($travel);
$this->_em->flush(); $this->_em->flush();
} }
public function testManyToManyWithEmptyRelation()
{
$this->loadFixturesCountries();
$this->loadFixturesStates();
$this->loadFixturesCities();
$this->loadFixturesTraveler();
$this->loadFixturesTravels();
$this->_em->clear();
$this->evictRegions();
$queryCount = $this->getCurrentQueryCount();
$entitiId = $this->travels[2]->getId(); //empty travel
$entity = $this->_em->find(Travel::CLASSNAME, $entitiId);
$this->assertEquals(0, $entity->getVisitedCities()->count());
$this->assertEquals($queryCount+2, $this->getCurrentQueryCount());
$this->_em->clear();
$entity = $this->_em->find(Travel::CLASSNAME, $entitiId);
$queryCount = $this->getCurrentQueryCount();
$this->assertEquals(0, $entity->getVisitedCities()->count());
$this->assertEquals($queryCount, $this->getCurrentQueryCount());
}
} }

View File

@ -90,7 +90,7 @@ class SecondLevelCacheOneToManyTest extends SecondLevelCacheAbstractTest
$s3 = $this->_em->find(State::CLASSNAME, $this->states[0]->getId()); $s3 = $this->_em->find(State::CLASSNAME, $this->states[0]->getId());
$s4 = $this->_em->find(State::CLASSNAME, $this->states[1]->getId()); $s4 = $this->_em->find(State::CLASSNAME, $this->states[1]->getId());
//trigger lazy load from cache //trigger lazy load from cache
$this->assertCount(2, $s3->getCities()); $this->assertCount(2, $s3->getCities());
$this->assertCount(2, $s4->getCities()); $this->assertCount(2, $s4->getCities());
@ -133,12 +133,12 @@ class SecondLevelCacheOneToManyTest extends SecondLevelCacheAbstractTest
//trigger lazy load from database //trigger lazy load from database
$this->assertCount(2, $this->_em->find(State::CLASSNAME, $this->states[0]->getId())->getCities()); $this->assertCount(2, $this->_em->find(State::CLASSNAME, $this->states[0]->getId())->getCities());
$this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $this->states[0]->getId())); $this->assertTrue($this->cache->containsEntity(State::CLASSNAME, $this->states[0]->getId()));
$this->assertTrue($this->cache->containsCollection(State::CLASSNAME, 'cities', $this->states[0]->getId())); $this->assertTrue($this->cache->containsCollection(State::CLASSNAME, 'cities', $this->states[0]->getId()));
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->states[0]->getCities()->get(0)->getId())); $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->states[0]->getCities()->get(0)->getId()));
$this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->states[0]->getCities()->get(1)->getId())); $this->assertTrue($this->cache->containsEntity(City::CLASSNAME, $this->states[0]->getCities()->get(1)->getId()));
$queryCount = $this->getCurrentQueryCount(); $queryCount = $this->getCurrentQueryCount();
$stateId = $this->states[0]->getId(); $stateId = $this->states[0]->getId();
$state = $this->_em->find(State::CLASSNAME, $stateId); $state = $this->_em->find(State::CLASSNAME, $stateId);
@ -284,6 +284,35 @@ class SecondLevelCacheOneToManyTest extends SecondLevelCacheAbstractTest
$this->assertEquals(0, $this->secondLevelCacheLogger->getRegionHitCount($this->getCollectionRegion(State::CLASSNAME, 'cities'))); $this->assertEquals(0, $this->secondLevelCacheLogger->getRegionHitCount($this->getCollectionRegion(State::CLASSNAME, 'cities')));
} }
public function testOneToManyWithEmptyRelation()
{
$this->loadFixturesCountries();
$this->loadFixturesStates();
$this->loadFixturesCities();
$this->secondLevelCacheLogger->clearStats();
$this->cache->evictEntityRegion(City::CLASSNAME);
$this->cache->evictEntityRegion(State::CLASSNAME);
$this->cache->evictCollectionRegion(State::CLASSNAME, 'cities');
$this->_em->clear();
$entitiId = $this->states[2]->getId(); // bavaria (cities count = 0)
$queryCount = $this->getCurrentQueryCount();
$entity = $this->_em->find(State::CLASSNAME, $entitiId);
$this->assertEquals(0, $entity->getCities()->count());
$this->assertEquals($queryCount + 2, $this->getCurrentQueryCount());
$this->_em->clear();
$queryCount = $this->getCurrentQueryCount();
$entity = $this->_em->find(State::CLASSNAME, $entitiId);
$this->assertEquals(0, $entity->getCities()->count());
$this->assertEquals($queryCount, $this->getCurrentQueryCount());
}
public function testOneToManyCount() public function testOneToManyCount()
{ {
$this->loadFixturesCountries(); $this->loadFixturesCountries();