Commit bedd1afc authored by Damien McKenna's avatar Damien McKenna Committed by Damien McKenna
Browse files

Issue #3367290 by DamienMcKenna: Streamline the post update scripts.

parent 010fd3c1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ Metatag 8.x-1.x-dev, 2023-xx-xx
#3366285 by DamienMcKenna: Work out solution for binary data in Metatag v1
  fixture file.
By DamienMcKenna: Run updates in batches of 100 records, not 10.
#3367290 by DamienMcKenna: Streamline the post update scripts.


Metatag 8.x-1.25, 2023-05-31
+119 −150
Original line number Diff line number Diff line
@@ -8,6 +8,77 @@
use Drupal\Core\Config\Entity\ConfigEntityUpdater;
use Drupal\metatag\Entity\MetatagDefaults;

/**
 * Get a list of all metatag field tables.
 *
 * @return array
 *   A list of meta tag field tables with the table name as the key and the
 *   field value column as the value, e.g.:
 *   - node__field_meta_tags: field_meta_tags_value
 *   - node_revision__field_meta_tags: field_meta_tags_value
 */
function _metatag_list_entity_field_tables(): array {
  static $drupal_static_fast;
  if (!isset($drupal_static_fast)) {
    $drupal_static_fast[__FUNCTION__] = &drupal_static(__FUNCTION__);
  }
  $tables = &$drupal_static_fast[__FUNCTION__];

  if (is_null($tables)) {
    $tables = [];
    $entity_type_manager = \Drupal::entityTypeManager();
    $database = \Drupal::database();

    // Get all of the field storage entities of type metatag.
    /** @var \Drupal\field\FieldStorageConfigInterface[] $field_storage_configs */
    $field_storage_configs = $entity_type_manager
      ->getStorage('field_storage_config')
      ->loadByProperties(['type' => 'metatag']);

    foreach ($field_storage_configs as $field_storage) {
      $field_name = $field_storage->getName();

      // Get the individual fields (field instances) associated with bundles.
      $fields = $entity_type_manager
        ->getStorage('field_config')
        ->loadByProperties([
          'field_name' => $field_name,
          'entity_type' => $field_storage->getTargetEntityTypeId(),
        ]);

      $tables = [];
      foreach ($fields as $field) {
        $entity_type_id = $field->getTargetEntityTypeId();
        $entity_type = $entity_type_manager->getDefinition($entity_type_id);

        // Determine the table and "value" field names.
        $table_mapping = $entity_type_manager->getStorage($entity_type_id)
          ->getTableMapping();
        $field_table = $table_mapping->getFieldTableName($field_name);
        $field_value_field = $table_mapping->getFieldColumnName($field_storage, 'value');

        $tables[$field_table] = $field_value_field;
        if ($entity_type->isRevisionable() && $field_storage->isRevisionable()) {
          if ($table_mapping->requiresDedicatedTableStorage($field_storage)) {
            $revision_table = $table_mapping->getDedicatedRevisionTableName($field_storage);
            if ($database->schema()->tableExists($revision_table)) {
              $tables[$revision_table] = $field_value_field;
            }
          }
          elseif ($table_mapping->allowsSharedTableStorage($field_storage)) {
            $revision_table = $entity_type->getRevisionDataTable() ?: $entity_type->getRevisionTable();
            if ($database->schema()->tableExists($revision_table)) {
              $tables[$revision_table] = $field_value_field;
            }
          }
        }
      }
    }
  }

  return $tables;
}

/**
 * Convert mask-icon to array values.
 */
@@ -62,62 +133,13 @@ function metatag_post_update_convert_author_data(&$sandbox) {
    // by number rather than name.
    $field_counter = 0;

    // Get all of the field storage entities of type metatag.
    /** @var \Drupal\field\FieldStorageConfigInterface[] $field_storage_configs */
    $field_storage_configs = $entity_type_manager
      ->getStorage('field_storage_config')
      ->loadByProperties(['type' => 'metatag']);

    foreach ($field_storage_configs as $field_storage) {
      $field_name = $field_storage->getName();

      // Get the individual fields (field instances) associated with bundles.
      $fields = $entity_type_manager
        ->getStorage('field_config')
        ->loadByProperties([
          'field_name' => $field_name,
          'entity_type' => $field_storage->getTargetEntityTypeId(),
        ]);

      foreach ($fields as $field) {
        // Get the bundle this field is attached to.
        $bundle = $field->getTargetBundle();
        $entity_type_id = $field->getTargetEntityTypeId();
        $entity_type = $entity_type_manager->getDefinition($entity_type_id);

        // Determine the table and "value" field names.
        // @todo The class path to getTableMapping() seems to be invalid?
        $table_mapping = $entity_type_manager->getStorage($entity_type_id)
          ->getTableMapping();
        $field_table = $table_mapping->getFieldTableName($field_name);
        $field_value_field = $table_mapping->getFieldColumnName($field_storage, 'value');

        $tables = [];
        $tables[] = $field_table;
        if ($entity_type->isRevisionable() && $field_storage->isRevisionable()) {
          if ($table_mapping->requiresDedicatedTableStorage($field_storage)) {
            $revision_table = $table_mapping->getDedicatedRevisionTableName($field_storage);
            if ($database->schema()->tableExists($revision_table)) {
              $tables[] = $revision_table;
            }
          }
          elseif ($table_mapping->allowsSharedTableStorage($field_storage)) {
            $revision_table = $entity_type->getRevisionDataTable() ?: $entity_type->getRevisionTable();
            if ($database->schema()->tableExists($revision_table)) {
              $tables[] = $revision_table;
            }
          }
        }

        if ($tables) {
          $tables = array_unique($tables);
          foreach ($tables as $table) {
    // Look for the appropriate data in all metatag field tables.
    foreach (_metatag_list_entity_field_tables() as $table => $field_value_field) {
      $query = $database->select($table);
      $query->addField($table, 'entity_id');
      $query->addField($table, 'revision_id');
      $query->addField($table, 'langcode');
      $query->addField($table, $field_value_field);
            $query->condition('bundle', $bundle, '=');
      $db_or = $query->orConditionGroup();
      $db_or->condition($field_value_field, '%google_plus_author%', 'LIKE');
      $query->condition($db_or);
@@ -139,9 +161,6 @@ function metatag_post_update_convert_author_data(&$sandbox) {
      $field_counter++;
    }
  }
      }
    }
  }

  if ($sandbox['total_records'] == 0) {
    // No partially overridden fields so we can skip the whole batch process.
@@ -231,60 +250,13 @@ function metatag_post_update_remove_robots_noydir_noodp(&$sandbox) {
    // by number rather than name.
    $field_counter = 0;

    // Get all of the field storage entities of type metatag.
    /** @var \Drupal\field\FieldStorageConfigInterface[] $field_storage_configs */
    $field_storage_configs = $entity_type_manager
      ->getStorage('field_storage_config')
      ->loadByProperties(['type' => 'metatag']);

    foreach ($field_storage_configs as $field_storage) {
      $field_name = $field_storage->getName();

      // Get the individual fields (field instances) associated with bundles.
      $fields = $entity_type_manager
        ->getStorage('field_config')
        ->loadByProperties([
          'field_name' => $field_name,
          'entity_type' => $field_storage->getTargetEntityTypeId(),
        ]);

      foreach ($fields as $field) {
        // Get the bundle this field is attached to.
        $bundle = $field->getTargetBundle();
        $entity_type_id = $field->getTargetEntityTypeId();
        $entity_type = $entity_type_manager->getDefinition($entity_type_id);

        // Determine the table and "value" field names.
        $table_mapping = $entity_type_manager->getStorage($entity_type_id)
          ->getTableMapping();
        $field_table = $table_mapping->getFieldTableName($field_name);
        $field_value_field = $table_mapping->getFieldColumnName($field_storage, 'value');

        $tables = [];
        $tables[] = $field_table;
        if ($entity_type->isRevisionable() && $field_storage->isRevisionable()) {
          if ($table_mapping->requiresDedicatedTableStorage($field_storage)) {
            $revision_table = $table_mapping->getDedicatedRevisionTableName($field_storage);
            if ($database->schema()->tableExists($revision_table)) {
              $tables[] = $revision_table;
            }
          }
          elseif ($table_mapping->allowsSharedTableStorage($field_storage)) {
            $revision_table = $entity_type->getRevisionDataTable() ?: $entity_type->getRevisionTable();
            if ($database->schema()->tableExists($revision_table)) {
              $tables[] = $revision_table;
            }
          }
        }
        if ($tables) {
          $tables = array_unique($tables);
          foreach ($tables as $table) {
    // Look for the appropriate data in all metatag field tables.
    foreach (_metatag_list_entity_field_tables() as $table => $field_value_field) {
      $query = $database->select($table);
      $query->addField($table, 'entity_id');
      $query->addField($table, 'revision_id');
      $query->addField($table, 'langcode');
      $query->addField($table, $field_value_field);
            $query->condition('bundle', $bundle, '=');
      $db_or = $query->orConditionGroup();
      $db_or->condition($field_value_field, '%noodp%', 'LIKE');
      $db_or->condition($field_value_field, '%noydir%', 'LIKE');
@@ -306,9 +278,6 @@ function metatag_post_update_remove_robots_noydir_noodp(&$sandbox) {
      $field_counter++;
    }
  }
      }
    }
  }

  if ($sandbox['total_records'] == 0) {
    // No partially overridden fields so we can skip the whole batch process.