Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
D
drupal
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Custom Issue Tracker
Custom Issue Tracker
Labels
Merge Requests
303
Merge Requests
303
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
project
drupal
Commits
c63692f7
Commit
c63692f7
authored
Jun 08, 2014
by
alexpott
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue
#2209049
by tstoeckler, lokapujya: Allow field schemas to contain unique keys.
parent
f43fb591
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
142 additions
and
58 deletions
+142
-58
core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
+8
-0
core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php
.../Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php
+23
-7
core/lib/Drupal/Core/Field/FieldDefinition.php
core/lib/Drupal/Core/Field/FieldDefinition.php
+1
-0
core/lib/Drupal/Core/Field/FieldItemInterface.php
core/lib/Drupal/Core/Field/FieldItemInterface.php
+2
-0
core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
...lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
+12
-0
core/modules/field/src/Entity/FieldConfig.php
core/modules/field/src/Entity/FieldConfig.php
+5
-1
core/modules/field/src/Tests/TestItemTest.php
core/modules/field/src/Tests/TestItemTest.php
+1
-0
core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
...al/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
+2
-0
core/tests/Drupal/Tests/Core/Entity/Schema/ContentEntitySchemaHandlerTest.php
...sts/Core/Entity/Schema/ContentEntitySchemaHandlerTest.php
+88
-50
No files found.
core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php
View file @
c63692f7
...
...
@@ -1454,6 +1454,14 @@ public static function _fieldSqlSchema(FieldConfigInterface $field, array $schem
$current
[
'fields'
][
$real_name
]
=
$attributes
;
}
// Add unique keys.
foreach
(
$schema
[
'unique keys'
]
as
$unique_key_name
=>
$columns
)
{
$real_name
=
static
::
_fieldIndexName
(
$field
,
$unique_key_name
);
foreach
(
$columns
as
$column_name
)
{
$current
[
'unique keys'
][
$real_name
][]
=
static
::
_fieldColumnName
(
$field
,
$column_name
);
}
}
// Add indexes.
foreach
(
$schema
[
'indexes'
]
as
$index_name
=>
$columns
)
{
$real_name
=
static
::
_fieldIndexName
(
$field
,
$index_name
);
...
...
core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php
View file @
c63692f7
...
...
@@ -325,13 +325,6 @@ protected function initializeBaseTable() {
'foreign keys'
=>
array
(),
);
if
(
$this
->
entityType
->
hasKey
(
'uuid'
))
{
$uuid_key
=
$this
->
entityType
->
getKey
(
'uuid'
);
$schema
[
'unique keys'
]
=
array
(
$this
->
getEntityIndexName
(
$uuid_key
)
=>
array
(
$uuid_key
),
);
}
if
(
$this
->
entityType
->
hasKey
(
'revision'
))
{
$revision_key
=
$this
->
entityType
->
getKey
(
'revision'
);
$key_name
=
$this
->
getEntityIndexName
(
$revision_key
);
...
...
@@ -342,6 +335,8 @@ protected function initializeBaseTable() {
);
}
$this
->
addTableDefaults
(
$schema
);
return
$schema
;
}
...
...
@@ -370,6 +365,8 @@ protected function initializeRevisionTable() {
$schema
[
'indexes'
][
$this
->
getEntityIndexName
(
$id_key
)]
=
array
(
$id_key
);
$this
->
addTableDefaults
(
$schema
);
return
$schema
;
}
...
...
@@ -402,6 +399,8 @@ protected function initializeDataTable() {
$schema
[
'indexes'
][
$this
->
getEntityIndexName
(
$key
)]
=
array
(
$key
);
}
$this
->
addTableDefaults
(
$schema
);
return
$schema
;
}
...
...
@@ -434,9 +433,26 @@ protected function initializeRevisionDataTable() {
),
);
$this
->
addTableDefaults
(
$schema
);
return
$schema
;
}
/**
* Adds defaults to a table schema definition.
*
* @param $schema
* The schema definition array for a single table, passed by reference.
*/
protected
function
addTableDefaults
(
&
$schema
)
{
$schema
+=
array
(
'fields'
=>
array
(),
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(),
);
}
/**
* Processes the gathered schema for a base table.
*
...
...
core/lib/Drupal/Core/Field/FieldDefinition.php
View file @
c63692f7
...
...
@@ -480,6 +480,7 @@ public function getSchema() {
// Fill in default values.
$schema
+=
array
(
'columns'
=>
array
(),
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(),
);
...
...
core/lib/Drupal/Core/Field/FieldItemInterface.php
View file @
c63692f7
...
...
@@ -69,6 +69,8 @@ public static function mainPropertyName();
* definitions depend on field settings when possible. No assumptions
* should be made on how storage engines internally use the original
* column name to structure their storage.
* - unique keys: (optional) An array of Schema API unique key definitions.
* Only columns that appear in the 'columns' array are allowed.
* - indexes: (optional) An array of Schema API index definitions. Only
* columns that appear in the 'columns' array are allowed. Those indexes
* will be used as default indexes. Callers of field_create_field() can
...
...
core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
View file @
c63692f7
...
...
@@ -7,6 +7,8 @@
namespace
Drupal\Core\Field\Plugin\Field\FieldType
;
use
Drupal\Core\Field\FieldStorageDefinitionInterface
;
/**
* Defines the 'uuid' entity field type.
*
...
...
@@ -39,4 +41,14 @@ public function applyDefaultValue($notify = TRUE) {
$this
->
setValue
(
array
(
'value'
=>
$uuid
->
generate
()),
$notify
);
return
$this
;
}
/**
* {@inheritdoc}
*/
public
static
function
schema
(
FieldStorageDefinitionInterface
$field_definition
)
{
$schema
=
parent
::
schema
(
$field_definition
);
$schema
[
'unique keys'
][
'value'
]
=
array
(
'value'
);
return
$schema
;
}
}
core/modules/field/src/Entity/FieldConfig.php
View file @
c63692f7
...
...
@@ -456,7 +456,11 @@ public function getSchema() {
$class
=
$this
->
getFieldItemClass
();
$schema
=
$class
::
schema
(
$this
);
// Fill in default values for optional entries.
$schema
+=
array
(
'indexes'
=>
array
(),
'foreign keys'
=>
array
());
$schema
+=
array
(
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(),
);
// Check that the schema does not include forbidden column names.
if
(
array_intersect
(
array_keys
(
$schema
[
'columns'
]),
static
::
getReservedColumns
()))
{
...
...
core/modules/field/src/Tests/TestItemTest.php
View file @
c63692f7
...
...
@@ -94,6 +94,7 @@ public function testTestItem() {
'not null'
=>
FALSE
,
),
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(
'value'
=>
array
(
'value'
),
),
...
...
core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php
View file @
c63692f7
...
...
@@ -291,6 +291,7 @@ public function testGetSchema() {
),
),
'primary key'
=>
array
(
'id'
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(),
),
...
...
@@ -973,6 +974,7 @@ public function testFieldSqlSchemaForEntityWithStringIdentifier() {
'not null'
=>
FALSE
,
),
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(),
);
...
...
core/tests/Drupal/Tests/Core/Entity/Schema/ContentEntitySchemaHandlerTest.php
View file @
c63692f7
...
...
@@ -95,13 +95,11 @@ public function setUp() {
/**
* Tests the schema for non-revisionable, non-translatable entities.
*
* @param bool $uuid_key
* Whether or not the tested entity type should have a UUID key.
*
* @covers ::__construct()
* @covers ::getSchema()
* @covers ::getTables()
* @covers ::initializeBaseTable()
* @covers ::addTableDefaults()
* @covers ::getEntityIndexName()
* @covers ::addFieldSchema()
* @covers ::getFieldIndexes()
...
...
@@ -111,16 +109,11 @@ public function setUp() {
* @covers ::addDefaultLangcodeSchema()
* @covers ::processBaseTable()
* @covers ::processIdentifierSchema()
*
* @dataProvider providerTestGetSchemaLayoutBase
*/
public
function
testGetSchemaBase
(
$uuid_key
)
{
public
function
testGetSchemaBase
()
{
$this
->
entityType
=
new
ContentEntityType
(
array
(
'id'
=>
'entity_test'
,
'entity_keys'
=>
array
(
'id'
=>
'id'
,
'uuid'
=>
$uuid_key
?
'uuid'
:
NULL
,
),
'entity_keys'
=>
array
(
'id'
=>
'id'
),
));
// Add a field with a 'length' constraint.
...
...
@@ -132,16 +125,6 @@ public function testGetSchemaBase($uuid_key) {
),
),
));
if
(
$uuid_key
)
{
$this
->
setUpStorageDefinition
(
'uuid'
,
array
(
'columns'
=>
array
(
'value'
=>
array
(
'type'
=>
'varchar'
,
'length'
=>
128
,
),
),
));
}
// Add a multi-column field.
$this
->
setUpStorageDefinition
(
'description'
,
array
(
'columns'
=>
array
(
...
...
@@ -155,11 +138,51 @@ public function testGetSchemaBase($uuid_key) {
),
),
));
// Add a field with a unique key.
$this
->
setUpStorageDefinition
(
'uuid'
,
array
(
'columns'
=>
array
(
'value'
=>
array
(
'type'
=>
'varchar'
,
'length'
=>
128
,
),
),
'unique keys'
=>
array
(
'value'
=>
array
(
'value'
),
),
));
// Add a field with a unique key, specified as column name and length.
$this
->
setUpStorageDefinition
(
'hash'
,
array
(
'columns'
=>
array
(
'value'
=>
array
(
'type'
=>
'varchar'
,
'length'
=>
20
,
),
),
'unique keys'
=>
array
(
'value'
=>
array
(
array
(
'value'
,
10
)),
),
));
// Add a field with a multi-column unique key.
$this
->
setUpStorageDefinition
(
'email'
,
array
(
'columns'
=>
array
(
'username'
=>
array
(
'type'
=>
'varchar'
,
),
'hostname'
=>
array
(
'type'
=>
'varchar'
,
),
'domain'
=>
array
(
'type'
=>
'varchar'
,
)
),
'unique keys'
=>
array
(
'email'
=>
array
(
'username'
,
'hostname'
,
array
(
'domain'
,
3
)),
),
));
// Add a field with an index.
$this
->
setUpStorageDefinition
(
'owner'
,
array
(
'columns'
=>
array
(
'target_id'
=>
array
(
'description'
=>
'The ID of the target entity.'
,
'type'
=>
'int'
,
),
),
...
...
@@ -171,7 +194,6 @@ public function testGetSchemaBase($uuid_key) {
$this
->
setUpStorageDefinition
(
'translator'
,
array
(
'columns'
=>
array
(
'target_id'
=>
array
(
'description'
=>
'The ID of the target entity.'
,
'type'
=>
'int'
,
),
),
...
...
@@ -260,6 +282,28 @@ public function testGetSchemaBase($uuid_key) {
'description'
=>
'The description field.'
,
'type'
=>
'varchar'
,
),
'uuid'
=>
array
(
'description'
=>
'The uuid field.'
,
'type'
=>
'varchar'
,
'length'
=>
128
,
),
'hash'
=>
array
(
'description'
=>
'The hash field.'
,
'type'
=>
'varchar'
,
'length'
=>
20
,
),
'email__username'
=>
array
(
'description'
=>
'The email field.'
,
'type'
=>
'varchar'
,
),
'email__hostname'
=>
array
(
'description'
=>
'The email field.'
,
'type'
=>
'varchar'
,
),
'email__domain'
=>
array
(
'description'
=>
'The email field.'
,
'type'
=>
'varchar'
,
),
'owner'
=>
array
(
'description'
=>
'The owner field.'
,
'type'
=>
'int'
,
...
...
@@ -301,6 +345,15 @@ public function testGetSchemaBase($uuid_key) {
),
),
'primary key'
=>
array
(
'id'
),
'unique keys'
=>
array
(
'entity_test_field__uuid__value'
=>
array
(
'uuid'
),
'entity_test_field__hash__value'
=>
array
(
array
(
'hash'
,
10
)),
'entity_test_field__email__email'
=>
array
(
'email__username'
,
'email__hostname'
,
array
(
'email__domain'
,
3
),
),
),
'indexes'
=>
array
(
'entity_test_field__owner__target_id'
=>
array
(
'owner'
),
'entity_test_field__translator__target_id'
=>
array
(
...
...
@@ -324,35 +377,11 @@ public function testGetSchemaBase($uuid_key) {
),
),
);
if
(
$uuid_key
)
{
$expected
[
'entity_test'
][
'fields'
][
'uuid'
]
=
array
(
'type'
=>
'varchar'
,
'length'
=>
128
,
'description'
=>
'The uuid field.'
,
'not null'
=>
TRUE
,
);
$expected
[
'entity_test'
][
'unique keys'
][
'entity_test__uuid'
]
=
array
(
'uuid'
);
}
$actual
=
$this
->
schemaHandler
->
getSchema
();
$this
->
assertEquals
(
$expected
,
$actual
);
}
/**
* Provides data for testGetSchemaLayoutBase().
*
* @return array
* Returns a nested array where each inner array returns a boolean,
* indicating whether or not the tested entity type should include a UUID
* key.
*/
public
function
providerTestGetSchemaLayoutBase
()
{
return
array
(
array
(
FALSE
),
array
(
TRUE
),
);
}
/**
* Tests the schema for revisionable, non-translatable entities.
*
...
...
@@ -361,6 +390,7 @@ public function providerTestGetSchemaLayoutBase() {
* @covers ::getTables()
* @covers ::initializeBaseTable()
* @covers ::initializeRevisionTable()
* @covers ::addTableDefaults()
* @covers ::getEntityIndexName()
* @covers ::processRevisionTable()
* @covers ::processIdentifierSchema()
...
...
@@ -411,6 +441,9 @@ public function testGetSchemaRevisionable() {
)
),
'primary key'
=>
array
(
'id'
),
'unique keys'
=>
array
(
'entity_test__revision_id'
=>
array
(
'revision_id'
),
),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(
'entity_test__revision'
=>
array
(
...
...
@@ -418,9 +451,6 @@ public function testGetSchemaRevisionable() {
'columns'
=>
array
(
'revision_id'
=>
'revision_id'
),
)
),
'unique keys'
=>
array
(
'entity_test__revision_id'
=>
array
(
'revision_id'
),
),
),
'entity_test_revision'
=>
array
(
'description'
=>
'The revision table for entity_test entities.'
,
...
...
@@ -436,6 +466,7 @@ public function testGetSchemaRevisionable() {
),
),
'primary key'
=>
array
(
'revision_id'
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(
'entity_test__id'
=>
array
(
'id'
),
),
...
...
@@ -460,6 +491,7 @@ public function testGetSchemaRevisionable() {
* @covers ::getSchema()
* @covers ::getTables()
* @covers ::initializeDataTable()
* @covers ::addTableDefaults()
* @covers ::getEntityIndexName()
* @covers ::processDataTable()
*/
...
...
@@ -509,6 +541,7 @@ public function testGetSchemaTranslatable() {
)
),
'primary key'
=>
array
(
'id'
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(),
),
...
...
@@ -527,6 +560,7 @@ public function testGetSchemaTranslatable() {
),
),
'primary key'
=>
array
(
'id'
,
'langcode'
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(
'entity_test'
=>
array
(
...
...
@@ -549,6 +583,7 @@ public function testGetSchemaTranslatable() {
* @covers ::getSchema()
* @covers ::getTables()
* @covers ::initializeDataTable()
* @covers ::addTableDefaults()
* @covers ::getEntityIndexName()
* @covers ::initializeRevisionDataTable()
* @covers ::processRevisionDataTable()
...
...
@@ -619,10 +654,10 @@ public function testGetSchemaRevisionableTranslatable() {
)
),
'primary key'
=>
array
(
'id'
),
'indexes'
=>
array
(),
'unique keys'
=>
array
(
'entity_test__revision_id'
=>
array
(
'revision_id'
),
),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(
'entity_test__revision'
=>
array
(
'table'
=>
'entity_test_revision'
,
...
...
@@ -649,6 +684,7 @@ public function testGetSchemaRevisionableTranslatable() {
),
),
'primary key'
=>
array
(
'revision_id'
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(
'entity_test__id'
=>
array
(
'id'
),
),
...
...
@@ -678,6 +714,7 @@ public function testGetSchemaRevisionableTranslatable() {
),
),
'primary key'
=>
array
(
'id'
,
'langcode'
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(
'entity_test__revision_id'
=>
array
(
'revision_id'
),
),
...
...
@@ -707,6 +744,7 @@ public function testGetSchemaRevisionableTranslatable() {
),
),
'primary key'
=>
array
(
'revision_id'
,
'langcode'
),
'unique keys'
=>
array
(),
'indexes'
=>
array
(),
'foreign keys'
=>
array
(
'entity_test'
=>
array
(
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment