Issue #3156439 by alexpott, catch, bonsaipuppy, mkalkbrenner, longwave, xjm: Add an index on locales_location on type and name
parent
7dcb3acadf
commit
e81e6f869d
|
@ -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']);
|
||||
}
|
||||
|
|
|
@ -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']);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue