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

merge-requests/8649/head
Dave Long 2024-07-03 10:48:53 +01:00
parent 7dcb3acadf
commit e81e6f869d
No known key found for this signature in database
GPG Key ID: ED52AE211E142771
2 changed files with 176 additions and 0 deletions

View File

@ -190,6 +190,7 @@ function locale_schema() {
],
'indexes' => [
'string_type' => ['sid', 'type'],
'type_name' => ['type', 'name'],
],
];
@ -321,3 +322,64 @@ function locale_requirements($phase) {
function locale_update_last_removed() {
return 10100;
}
/**
* 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']);
}

View File

@ -0,0 +1,114 @@
<?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']);
}
}