Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\field\Kernel;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
|
Chris@0
|
6 use Drupal\entity_test\Entity\EntityTest;
|
Chris@0
|
7 use Drupal\field\Entity\FieldConfig;
|
Chris@0
|
8 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@0
|
9
|
Chris@0
|
10 /**
|
Chris@0
|
11 * Tests counting field data records and the hasData() method on
|
Chris@0
|
12 * FieldStorageConfig entity.
|
Chris@0
|
13 *
|
Chris@0
|
14 * @group field
|
Chris@0
|
15 * @see \Drupal\Core\Entity\FieldableEntityStorageInterface::countFieldData()
|
Chris@0
|
16 * @see \Drupal\field\Entity\FieldStorageConfig::hasData()
|
Chris@0
|
17 */
|
Chris@0
|
18 class FieldDataCountTest extends FieldKernelTestBase {
|
Chris@0
|
19
|
Chris@0
|
20 /**
|
Chris@0
|
21 * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
|
Chris@0
|
22 */
|
Chris@0
|
23 protected $storage;
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
|
Chris@0
|
27 */
|
Chris@0
|
28 protected $storageRev;
|
Chris@0
|
29
|
Chris@0
|
30 /**
|
Chris@0
|
31 * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
|
Chris@0
|
32 */
|
Chris@0
|
33 protected $storageUser;
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@0
|
36 * {@inheritdoc}
|
Chris@0
|
37 */
|
Chris@0
|
38 protected function setUp() {
|
Chris@0
|
39 parent::setUp();
|
Chris@0
|
40 $this->installEntitySchema('entity_test_rev');
|
Chris@0
|
41 $this->storage = \Drupal::entityManager()->getStorage('entity_test');
|
Chris@0
|
42 $this->storageRev = \Drupal::entityManager()->getStorage('entity_test_rev');
|
Chris@0
|
43 $this->storageUser = \Drupal::entityManager()->getStorage('user');
|
Chris@0
|
44 }
|
Chris@0
|
45
|
Chris@0
|
46 /**
|
Chris@0
|
47 * Tests entityCount() and hadData() methods.
|
Chris@0
|
48 */
|
Chris@0
|
49 public function testEntityCountAndHasData() {
|
Chris@0
|
50 // Create a field with a cardinality of 2 to show that we are counting
|
Chris@0
|
51 // entities and not rows in a table.
|
Chris@0
|
52 /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
|
Chris@0
|
53 $field_storage = FieldStorageConfig::create([
|
Chris@0
|
54 'field_name' => 'field_int',
|
Chris@0
|
55 'entity_type' => 'entity_test',
|
Chris@0
|
56 'type' => 'integer',
|
Chris@0
|
57 'cardinality' => 2,
|
Chris@0
|
58 ]);
|
Chris@0
|
59 $field_storage->save();
|
Chris@0
|
60 FieldConfig::create([
|
Chris@0
|
61 'field_storage' => $field_storage,
|
Chris@0
|
62 'bundle' => 'entity_test',
|
Chris@0
|
63 ])->save();
|
Chris@0
|
64
|
Chris@0
|
65 $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
|
Chris@0
|
66 $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
|
Chris@0
|
67
|
Chris@0
|
68 // Create 1 entity without the field.
|
Chris@0
|
69 $entity = EntityTest::create();
|
Chris@0
|
70 $entity->name->value = $this->randomMachineName();
|
Chris@0
|
71 $entity->save();
|
Chris@0
|
72
|
Chris@0
|
73 $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
|
Chris@0
|
74 $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
|
Chris@0
|
75
|
Chris@0
|
76 // Create 12 entities to ensure that the purging works as expected.
|
Chris@0
|
77 for ($i = 0; $i < 12; $i++) {
|
Chris@0
|
78 $entity = EntityTest::create();
|
Chris@0
|
79 $entity->field_int[] = mt_rand(1, 99);
|
Chris@0
|
80 $entity->field_int[] = mt_rand(1, 99);
|
Chris@0
|
81 $entity->name[] = $this->randomMachineName();
|
Chris@0
|
82 $entity->save();
|
Chris@0
|
83 }
|
Chris@0
|
84
|
Chris@0
|
85 $storage = \Drupal::entityManager()->getStorage('entity_test');
|
Chris@0
|
86 if ($storage instanceof SqlContentEntityStorage) {
|
Chris@0
|
87 // Count the actual number of rows in the field table.
|
Chris@0
|
88 $table_mapping = $storage->getTableMapping();
|
Chris@0
|
89 $field_table_name = $table_mapping->getDedicatedDataTableName($field_storage);
|
Chris@0
|
90 $result = db_select($field_table_name, 't')
|
Chris@0
|
91 ->fields('t')
|
Chris@0
|
92 ->countQuery()
|
Chris@0
|
93 ->execute()
|
Chris@0
|
94 ->fetchField();
|
Chris@0
|
95 $this->assertEqual($result, 24, 'The field table has 24 rows.');
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with field data.');
|
Chris@0
|
99 $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with field data.');
|
Chris@0
|
100
|
Chris@0
|
101 // Ensure the methods work on deleted fields.
|
Chris@0
|
102 $field_storage->delete();
|
Chris@0
|
103 $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
|
Chris@0
|
104 $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with deleted field data.');
|
Chris@0
|
105
|
Chris@0
|
106 field_purge_batch(6);
|
Chris@0
|
107 $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
|
Chris@0
|
108 $this->assertEqual($this->storage->countFieldData($field_storage), 6, 'There are 6 entities with deleted field data.');
|
Chris@0
|
109
|
Chris@0
|
110 $entity_type = 'entity_test_rev';
|
Chris@0
|
111 $this->createFieldWithStorage('_2', $entity_type);
|
Chris@0
|
112
|
Chris@0
|
113 $entity_init = $this->container->get('entity_type.manager')
|
Chris@0
|
114 ->getStorage($entity_type)
|
Chris@0
|
115 ->create(['type' => $entity_type]);
|
Chris@0
|
116 $cardinality = $this->fieldTestData->field_storage_2->getCardinality();
|
Chris@0
|
117
|
Chris@0
|
118 $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), FALSE, 'There are no entities with field data.');
|
Chris@0
|
119 $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 0, 'There are 0 entities with field data.');
|
Chris@0
|
120
|
Chris@0
|
121 // Create 1 entity with the field.
|
Chris@0
|
122 $entity = clone($entity_init);
|
Chris@0
|
123 $values = $this->_generateTestFieldValues($this->fieldTestData->field_storage_2->getCardinality());
|
Chris@0
|
124 $entity->{$this->fieldTestData->field_name_2} = $values;
|
Chris@0
|
125 $entity->setNewRevision();
|
Chris@0
|
126 $entity->save();
|
Chris@0
|
127 $first_revision = $entity->getRevisionId();
|
Chris@0
|
128
|
Chris@0
|
129 $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
|
Chris@0
|
130 $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 1, 'There is 1 entity with field data.');
|
Chris@0
|
131
|
Chris@0
|
132 $entity->{$this->fieldTestData->field_name_2} = [];
|
Chris@0
|
133 $entity->setNewRevision();
|
Chris@0
|
134 $entity->save();
|
Chris@0
|
135
|
Chris@0
|
136 $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
|
Chris@0
|
137
|
Chris@0
|
138 $storage = $this->container->get('entity.manager')->getStorage($entity_type);
|
Chris@0
|
139 $entity = $storage->loadRevision($first_revision);
|
Chris@0
|
140 $this->assertEqual(count($entity->{$this->fieldTestData->field_name_2}), $cardinality, format_string('Revision %revision_id: expected number of values.', ['%revision_id' => $first_revision]));
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 /**
|
Chris@0
|
144 * Verify that we can count a table that contains an entry with index 0.
|
Chris@0
|
145 */
|
Chris@0
|
146 public function testCountWithIndex0() {
|
Chris@0
|
147 // Create a field that will require dedicated storage.
|
Chris@0
|
148 /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
|
Chris@0
|
149 $field_storage = FieldStorageConfig::create([
|
Chris@0
|
150 'field_name' => 'field_int',
|
Chris@0
|
151 'entity_type' => 'user',
|
Chris@0
|
152 'type' => 'integer',
|
Chris@0
|
153 'cardinality' => 2,
|
Chris@0
|
154 ]);
|
Chris@0
|
155 $field_storage->save();
|
Chris@0
|
156 FieldConfig::create([
|
Chris@0
|
157 'field_storage' => $field_storage,
|
Chris@0
|
158 'bundle' => 'user',
|
Chris@0
|
159 ])->save();
|
Chris@0
|
160
|
Chris@0
|
161 // Create an entry for the anonymous user, who has user ID 0.
|
Chris@0
|
162 $user = $this->storageUser
|
Chris@0
|
163 ->create([
|
Chris@0
|
164 'uid' => 0,
|
Chris@0
|
165 'name' => 'anonymous',
|
Chris@0
|
166 'mail' => NULL,
|
Chris@0
|
167 'status' => FALSE,
|
Chris@0
|
168 'field_int' => 42,
|
Chris@0
|
169 ]);
|
Chris@0
|
170 $user->save();
|
Chris@0
|
171
|
Chris@0
|
172 // Test shared table storage.
|
Chris@0
|
173 $storage = $user->getFieldDefinition('name')->getFieldStorageDefinition();
|
Chris@0
|
174 $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
|
Chris@0
|
175
|
Chris@0
|
176 // Test dedicated table storage.
|
Chris@0
|
177 $storage = $user->getFieldDefinition('field_int')->getFieldStorageDefinition();
|
Chris@0
|
178 $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
|
Chris@0
|
179 }
|
Chris@0
|
180
|
Chris@0
|
181 }
|