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