From bb943afabe37d1d04158533bf8e7ecac55e172ef Mon Sep 17 00:00:00 2001 From: Mikhail Polyanin Date: Fri, 20 May 2016 13:42:13 +0300 Subject: [PATCH] Optimization. Multiple get in QueryCache --- lib/Doctrine/ORM/Cache/DefaultQueryCache.php | 15 +++++++-- .../Tests/ORM/Cache/DefaultQueryCacheTest.php | 32 +++++++++++++++---- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/lib/Doctrine/ORM/Cache/DefaultQueryCache.php b/lib/Doctrine/ORM/Cache/DefaultQueryCache.php index 88e594213..4c1fa831d 100644 --- a/lib/Doctrine/ORM/Cache/DefaultQueryCache.php +++ b/lib/Doctrine/ORM/Cache/DefaultQueryCache.php @@ -112,20 +112,29 @@ class DefaultQueryCache implements QueryCache $regionName = $region->getName(); $cm = $this->em->getClassMetadata($entityName); + + $entityCacheKeys = []; + foreach ($entry->result as $index => $concreteEntry) { + $entityCacheKeys[$index] = new EntityCacheKey($cm->rootEntityName, $concreteEntry['identifier']); + } + $entries = $region->getMultiple(new CollectionCacheEntry($entityCacheKeys)); + // @TODO - move to cache hydration component foreach ($entry->result as $index => $entry) { - if (($entityEntry = $region->get($entityKey = new EntityCacheKey($cm->rootEntityName, $entry['identifier']))) === null) { + $entityEntry = is_array($entries) && array_key_exists($index, $entries) ? $entries[$index] : null; + + if ($entityEntry === null) { if ($this->cacheLogger !== null) { - $this->cacheLogger->entityCacheMiss($regionName, $entityKey); + $this->cacheLogger->entityCacheMiss($regionName, $entityCacheKeys[$index]); } return null; } if ($this->cacheLogger !== null) { - $this->cacheLogger->entityCacheHit($regionName, $entityKey); + $this->cacheLogger->entityCacheHit($regionName, $entityCacheKeys[$index]); } if ( ! $hasRelation) { diff --git a/tests/Doctrine/Tests/ORM/Cache/DefaultQueryCacheTest.php b/tests/Doctrine/Tests/ORM/Cache/DefaultQueryCacheTest.php index cfd914209..e011159bd 100644 --- a/tests/Doctrine/Tests/ORM/Cache/DefaultQueryCacheTest.php +++ b/tests/Doctrine/Tests/ORM/Cache/DefaultQueryCacheTest.php @@ -294,8 +294,14 @@ class DefaultQueryCacheTest extends OrmTestCase ]; $this->region->addReturn('get', $entry); - $this->region->addReturn('get', new EntityCacheEntry(Country::class, $data[0])); - $this->region->addReturn('get', new EntityCacheEntry(Country::class, $data[1])); + + $this->region->addReturn( + 'getMultiple', + [ + new EntityCacheEntry(Country::class, $data[0]), + new EntityCacheEntry(Country::class, $data[1]) + ] + ); $rsm->addRootEntityFromClassMetadata(Country::class, 'c'); @@ -458,8 +464,14 @@ class DefaultQueryCacheTest extends OrmTestCase $entry->time = microtime(true) - 100; $this->region->addReturn('get', $entry); - $this->region->addReturn('get', new EntityCacheEntry(Country::class, $entities[0])); - $this->region->addReturn('get', new EntityCacheEntry(Country::class, $entities[1])); + + $this->region->addReturn( + 'getMultiple', + [ + new EntityCacheEntry(Country::class, $entities[0]), + new EntityCacheEntry(Country::class, $entities[1]) + ] + ); $rsm->addRootEntityFromClassMetadata(Country::class, 'c'); @@ -483,8 +495,14 @@ class DefaultQueryCacheTest extends OrmTestCase ]; $this->region->addReturn('get', $entry); - $this->region->addReturn('get', new EntityCacheEntry(Country::class, $data[0])); - $this->region->addReturn('get', new EntityCacheEntry(Country::class, $data[1])); + + $this->region->addReturn( + 'getMultiple', + [ + new EntityCacheEntry(Country::class, $data[0]), + new EntityCacheEntry(Country::class, $data[1]) + ] + ); $rsm->addRootEntityFromClassMetadata(Country::class, 'c'); @@ -503,7 +521,7 @@ class DefaultQueryCacheTest extends OrmTestCase ); $this->region->addReturn('get', $entry); - $this->region->addReturn('get', null); + $this->region->addReturn('getMultiple', [null]); $rsm->addRootEntityFromClassMetadata(Country::class, 'c');