Verified Commit dd402f2f authored by Dave Long's avatar Dave Long
Browse files

Issue #3156439 by alexpott, catch, bonsaipuppy, mkalkbrenner, longwave, xjm:...

Issue #3156439 by alexpott, catch, bonsaipuppy, mkalkbrenner, longwave, xjm: Add an index on locales_location on type and name

(cherry picked from commit 5f2858c5)
parent b876e3e8
Loading
Loading
Loading
Loading
Loading
+62 −0
Original line number Diff line number Diff line
@@ -190,6 +190,7 @@ function locale_schema() {
    ],
    'indexes' => [
      'string_type' => ['sid', 'type'],
      'type_name' => ['type', 'name'],
    ],
  ];

@@ -347,3 +348,64 @@ function locale_update_10100(&$sandbox = NULL) {
    $connection->schema()->changeField('locale_file', 'last_checked', 'last_checked', $new);
  }
}

/**
 * Add an index on locales_location on type and name.
 */
function locale_update_10300() {
  $spec = [];
  $spec['locales_location'] = [
    'description' => 'Location information for source strings.',
    'fields' => [
      'lid' => [
        'type' => 'serial',
        'not null' => TRUE,
        'description' => 'Unique identifier of this location.',
      ],
      'sid' => [
        'type' => 'int',
        'not null' => TRUE,
        'description' => 'Unique identifier of this string.',
      ],
      'type' => [
        'type' => 'varchar_ascii',
        'length' => 50,
        'not null' => TRUE,
        'default' => '',
        'description' => 'The location type (file, config, path, etc).',
      ],
      'name' => [
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '',
        'description' => 'Type dependent location information (file name, path, etc).',
      ],
      'version' => [
        'type' => 'varchar_ascii',
        'length' => 20,
        'not null' => TRUE,
        'default' => 'none',
        'description' => 'Version of Drupal where the location was found.',
      ],
    ],
    'primary key' => ['lid'],
    'foreign keys' => [
      'locales_source' => [
        'table' => 'locales_source',
        'columns' => ['sid' => 'lid'],
      ],
    ],
    'indexes' => [
      'string_type' => ['sid', 'type'],
      'type_name' => ['type', 'name'],
    ],
  ];
  $schema = \Drupal::database()->schema();
  // If the update has been manually applied, recreate the index using the
  // current schema.
  if ($schema->indexExists('locales_location', 'type_name')) {
    $schema->dropIndex('locales_location', 'type_name');
  }
  $schema->addIndex('locales_location', 'type_name', ['type', 'name'], $spec['locales_location']);
}
+114 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\locale\Functional;

use Drupal\FunctionalTests\Update\UpdatePathTestBase;

/**
 * Tests Locale update functions.
 *
 * @group locale
 */
class LocalesLocationAddIndexUpdateTest extends UpdatePathTestBase {

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * {@inheritdoc}
   */
  protected function setDatabaseDumpFiles() {
    $this->databaseDumpFiles[] = $this->root . '/core/modules/system/tests/fixtures/update/drupal-10.3.0.filled.standard.php.gz';
  }

  /**
   * Tests locale_update_10300().
   *
   * @see locale_update_10300
   */
  public function testIndex(): void {
    $this->assertFalse(\Drupal::database()
      ->schema()
      ->indexExists('locales_location', 'type_name'));

    // Run updates and test them.
    $this->runUpdates();

    $this->assertTrue(\Drupal::database()
      ->schema()
      ->indexExists('locales_location', 'type_name'));
  }

  /**
   * Tests locale_update_10300().
   *
   * @see locale_update_10300
   */
  public function testExistingIndex(): void {
    $spec = [];
    $spec['locales_location'] = [
      'description' => 'Location information for source strings.',
      'fields' => [
        'lid' => [
          'type' => 'serial',
          'not null' => TRUE,
          'description' => 'Unique identifier of this location.',
        ],
        'sid' => [
          'type' => 'int',
          'not null' => TRUE,
          'description' => 'Unique identifier of this string.',
        ],
        'type' => [
          'type' => 'varchar_ascii',
          'length' => 50,
          'not null' => TRUE,
          'default' => '',
          'description' => 'The location type (file, config, path, etc).',
        ],
        'name' => [
          'type' => 'varchar',
          'length' => 255,
          'not null' => TRUE,
          'default' => '',
          'description' => 'Type dependent location information (file name, path, etc).',
        ],
        'version' => [
          'type' => 'varchar_ascii',
          'length' => 20,
          'not null' => TRUE,
          'default' => 'none',
          'description' => 'Version of Drupal where the location was found.',
        ],
      ],
      'primary key' => ['lid'],
      'foreign keys' => [
        'locales_source' => [
          'table' => 'locales_source',
          'columns' => ['sid' => 'lid'],
        ],
      ],
      'indexes' => [
        'string_type' => ['sid', 'type'],
        'type_name' => ['type', 'name'],
      ],
    ];
    \Drupal::database()->schema()->addIndex('locales_location', 'type_name', ['type', 'name', 'sid'], $spec['locales_location']);

    // Run updates and test them.
    $this->runUpdates();

    $schema = \Drupal::database()->schema();
    $this->assertTrue($schema->indexExists('locales_location', 'type_name'));

    // Ensure that index specification matches our expectations.
    $introspect_index_schema = new \ReflectionMethod(get_class($schema), 'introspectIndexSchema');
    $index_schema = $introspect_index_schema->invoke($schema, 'locales_location');
    $this->assertSame(['type', 'name'], $index_schema['indexes']['type_name']);
  }

}