Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save angrytoast/32f12fd9624a36a9a8ee35881e95aae9 to your computer and use it in GitHub Desktop.
Save angrytoast/32f12fd9624a36a9a8ee35881e95aae9 to your computer and use it in GitHub Desktop.

Revisions

  1. angrytoast created this gist Apr 13, 2023.
    121 changes: 121 additions & 0 deletions 3204456-tableau-changes-interdiff.patch
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,121 @@
    diff --git a/src/WebformEntityReferenceManager.php b/src/WebformEntityReferenceManager.php
    index b99eb96e4..5c53f495d 100644
    --- a/src/WebformEntityReferenceManager.php
    +++ b/src/WebformEntityReferenceManager.php
    @@ -82,6 +82,13 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    */
    protected $fieldNames = [];

    + /**
    + * Cache of paragraph field names by entity type and bundle.
    + *
    + * @var array
    + */
    + protected $paragraphFieldNames = [];
    +
    /**
    * Constructs a WebformEntityReferenceManager object.
    *
    @@ -194,14 +201,15 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    * {@inheritdoc}
    */
    public function getFieldNames(EntityInterface $entity = NULL) {
    - if ($entity === NULL || !$entity instanceof FieldableEntityInterface) {
    + if (!$entity instanceof FieldableEntityInterface) {
    return [];
    }

    // Cache the source entity's field names.
    - $entity_id = $entity->getEntityTypeId() . '-' . $entity->id();
    - if (isset($this->fieldNames[$entity_id])) {
    - return $this->fieldNames[$entity_id];
    + $entity_type_id = $entity->getEntityTypeId();
    + $entity_bundle = $entity->bundle();
    + if (isset($this->fieldNames[$entity_type_id][$entity_bundle])) {
    + return $this->fieldNames[$entity_type_id][$entity_bundle];
    }

    $field_names = [];
    @@ -217,7 +225,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    // Sort fields alphabetically.
    ksort($field_names);

    - $this->fieldNames[$entity_id] = $field_names;
    + $this->fieldNames[$entity_type_id][$entity_bundle] = $field_names;
    return $field_names;
    }

    @@ -242,16 +250,15 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    public function getWebforms(EntityInterface $entity = NULL) {
    $cid = 'webform_' . $entity->getEntityTypeId() . '_' . $entity->id() . '_webforms';

    - // Cache the source entity's loaded webform ids permanently.
    + // Avoid a potentially expensive lookup if we can.
    + if (isset($this->webforms[$cid])) {
    + return $this->webforms[$cid];
    + }
    $cached = $this->cache->get($cid);
    if ($cached) {
    $this->webforms[$cid] = $cached->data
    ? $this->entityTypeManager->getStorage('webform')->loadMultiple($cached->data)
    : [];
    - }
    -
    - // Cache the source entity's loaded webforms per request.
    - if (isset($this->webforms[$cid])) {
    return $this->webforms[$cid];
    }

    @@ -281,6 +288,8 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    $webforms[$target_id] = $target_entities[$target_id];
    }

    + // Cache the source entity's loaded webforms per request and permanently
    + // for future requests.
    $this->webforms[$cid] = $webforms;
    $this->cache->set($cid, array_keys($webforms), Cache::PERMANENT, $entity->getCacheTags());

    @@ -307,7 +316,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    return;
    }
    // Make sure the entity exists and is fieldable.
    - if ($entity === NULL || !$entity instanceof FieldableEntityInterface) {
    + if (!$entity instanceof FieldableEntityInterface) {
    return;
    }

    @@ -345,8 +354,21 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    * An array of paragraph field names.
    */
    protected function getParagraphFieldNames(EntityInterface $entity) {
    + $entity_type_id = $entity->getEntityTypeId();
    + $cid = 'webform_' . $entity->getEntityTypeId() . '_paragraph_field_names';
    +
    + // Try to get a cached value and avoid loading storage config.
    + if (isset($this->paragraphFieldNames[$entity_type_id])) {
    + return $this->paragraphFieldNames[$entity_type_id];
    + }
    + $cached = $this->cache->get($cid);
    + if ($cached) {
    + $this->paragraphFieldNames[$entity_type_id] = $cached->data;
    + return $this->paragraphFieldNames[$entity_type_id];
    + }
    +
    $fields = $this->entityTypeManager->getStorage('field_storage_config')->loadByProperties([
    - 'entity_type' => $entity->getEntityTypeId(),
    + 'entity_type' => $entity_type_id,
    'type' => 'entity_reference_revisions',
    ]);

    @@ -357,6 +379,11 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInte
    $field_names[$field_name] = $field_name;
    }
    }
    +
    + // Cache the paragraph field names for this request and permanently for
    + // future requests.
    + $this->paragraphFieldNames[$entity_type_id] = $field_names;
    + $this->cache->set($cid, $field_names, Cache::PERMANENT);
    return $field_names;
    }