Issue #2983887 by Berdir: Add static cache to \Drupal\Core\Entity\ContentEntityStorageBase::getLatest*RevisionId()
parent
f0d889eb3a
commit
8f00a9a1ee
|
|
@ -7,6 +7,7 @@ use Drupal\Core\Cache\CacheBackendInterface;
|
|||
use Drupal\Core\Cache\MemoryCache\MemoryCacheInterface;
|
||||
use Drupal\Core\Field\FieldDefinitionInterface;
|
||||
use Drupal\Core\Field\FieldStorageDefinitionInterface;
|
||||
use Drupal\Core\Language\LanguageInterface;
|
||||
use Drupal\Core\TypedData\TranslationStatusInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
|
|
@ -36,6 +37,13 @@ abstract class ContentEntityStorageBase extends EntityStorageBase implements Con
|
|||
*/
|
||||
protected $cacheBackend;
|
||||
|
||||
/**
|
||||
* Stores the latest revision IDs for entities.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $latestRevisionIds = [];
|
||||
|
||||
/**
|
||||
* Constructs a ContentEntityStorageBase object.
|
||||
*
|
||||
|
|
@ -350,13 +358,17 @@ abstract class ContentEntityStorageBase extends EntityStorageBase implements Con
|
|||
return NULL;
|
||||
}
|
||||
|
||||
$result = $this->getQuery()
|
||||
->latestRevision()
|
||||
->condition($this->entityType->getKey('id'), $entity_id)
|
||||
->accessCheck(FALSE)
|
||||
->execute();
|
||||
if (!isset($this->latestRevisionIds[$entity_id][LanguageInterface::LANGCODE_DEFAULT])) {
|
||||
$result = $this->getQuery()
|
||||
->latestRevision()
|
||||
->condition($this->entityType->getKey('id'), $entity_id)
|
||||
->accessCheck(FALSE)
|
||||
->execute();
|
||||
|
||||
return key($result);
|
||||
$this->latestRevisionIds[$entity_id][LanguageInterface::LANGCODE_DEFAULT] = key($result);
|
||||
}
|
||||
|
||||
return $this->latestRevisionIds[$entity_id][LanguageInterface::LANGCODE_DEFAULT];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -371,16 +383,19 @@ abstract class ContentEntityStorageBase extends EntityStorageBase implements Con
|
|||
return $this->getLatestRevisionId($entity_id);
|
||||
}
|
||||
|
||||
$result = $this->getQuery()
|
||||
->allRevisions()
|
||||
->condition($this->entityType->getKey('id'), $entity_id)
|
||||
->condition($this->entityType->getKey('revision_translation_affected'), 1, '=', $langcode)
|
||||
->range(0, 1)
|
||||
->sort($this->entityType->getKey('revision'), 'DESC')
|
||||
->accessCheck(FALSE)
|
||||
->execute();
|
||||
if (!isset($this->latestRevisionIds[$entity_id][$langcode])) {
|
||||
$result = $this->getQuery()
|
||||
->allRevisions()
|
||||
->condition($this->entityType->getKey('id'), $entity_id)
|
||||
->condition($this->entityType->getKey('revision_translation_affected'), 1, '=', $langcode)
|
||||
->range(0, 1)
|
||||
->sort($this->entityType->getKey('revision'), 'DESC')
|
||||
->accessCheck(FALSE)
|
||||
->execute();
|
||||
|
||||
return key($result);
|
||||
$this->latestRevisionIds[$entity_id][$langcode] = key($result);
|
||||
}
|
||||
return $this->latestRevisionIds[$entity_id][$langcode];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1005,6 +1020,7 @@ abstract class ContentEntityStorageBase extends EntityStorageBase implements Con
|
|||
if ($this->entityType->isPersistentlyCacheable()) {
|
||||
$cids = [];
|
||||
foreach ($ids as $id) {
|
||||
unset($this->latestRevisionIds[$id]);
|
||||
$cids[] = $this->buildCacheId($id);
|
||||
}
|
||||
$this->cacheBackend->deleteMultiple($cids);
|
||||
|
|
@ -1015,6 +1031,7 @@ abstract class ContentEntityStorageBase extends EntityStorageBase implements Con
|
|||
if ($this->entityType->isPersistentlyCacheable()) {
|
||||
Cache::invalidateTags([$this->entityTypeId . '_values']);
|
||||
}
|
||||
$this->latestRevisionIds = [];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -482,6 +482,9 @@ class ModerationLocaleTest extends ModerationStateTestBase {
|
|||
protected function loadTranslation(NodeInterface $node, $langcode) {
|
||||
/** @var \Drupal\node\NodeStorageInterface $storage */
|
||||
$storage = $this->container->get('entity_type.manager')->getStorage('node');
|
||||
// Explicitly invalidate the cache for that node, as the call below is
|
||||
// statically cached.
|
||||
$storage->resetCache([$node->id()]);
|
||||
/** @var \Drupal\node\NodeInterface $node */
|
||||
$node = $storage->loadRevision($storage->getLatestRevisionId($node->id()));
|
||||
return $node->getTranslation($langcode);
|
||||
|
|
|
|||
|
|
@ -127,6 +127,9 @@ abstract class ContentTranslationPendingRevisionTestBase extends ContentTranslat
|
|||
* The active revision translation or NULL if none could be identified.
|
||||
*/
|
||||
protected function loadRevisionTranslation(ContentEntityInterface $entity, $langcode) {
|
||||
// Explicitly invalidate the cache for that node, as the call below is
|
||||
// statically cached.
|
||||
$this->storage->resetCache([$entity->id()]);
|
||||
$revision_id = $this->storage->getLatestTranslationAffectedRevisionId($entity->id(), $langcode);
|
||||
/** @var \Drupal\Core\Entity\ContentEntityInterface $revision */
|
||||
$revision = $revision_id ? $this->storage->loadRevision($revision_id) : NULL;
|
||||
|
|
|
|||
Loading…
Reference in New Issue