3 namespace Drupal\Tests\field\Kernel;
5 use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
6 use Drupal\entity_test\Entity\EntityTest;
7 use Drupal\field\Entity\FieldConfig;
8 use Drupal\field\Entity\FieldStorageConfig;
11 * Tests counting field data records and the hasData() method on
12 * FieldStorageConfig entity.
15 * @see \Drupal\Core\Entity\FieldableEntityStorageInterface::countFieldData()
16 * @see \Drupal\field\Entity\FieldStorageConfig::hasData()
18 class FieldDataCountTest extends FieldKernelTestBase {
21 * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
26 * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
28 protected $storageRev;
31 * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
33 protected $storageUser;
38 protected function setUp() {
40 $this->installEntitySchema('entity_test_rev');
41 $this->storage = \Drupal::entityManager()->getStorage('entity_test');
42 $this->storageRev = \Drupal::entityManager()->getStorage('entity_test_rev');
43 $this->storageUser = \Drupal::entityManager()->getStorage('user');
47 * Tests entityCount() and hadData() methods.
49 public function testEntityCountAndHasData() {
50 // Create a field with a cardinality of 2 to show that we are counting
51 // entities and not rows in a table.
52 /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
53 $field_storage = FieldStorageConfig::create([
54 'field_name' => 'field_int',
55 'entity_type' => 'entity_test',
59 $field_storage->save();
61 'field_storage' => $field_storage,
62 'bundle' => 'entity_test',
65 $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
66 $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
68 // Create 1 entity without the field.
69 $entity = EntityTest::create();
70 $entity->name->value = $this->randomMachineName();
73 $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
74 $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
76 // Create 12 entities to ensure that the purging works as expected.
77 for ($i = 0; $i < 12; $i++) {
78 $entity = EntityTest::create();
79 $entity->field_int[] = mt_rand(1, 99);
80 $entity->field_int[] = mt_rand(1, 99);
81 $entity->name[] = $this->randomMachineName();
85 $storage = \Drupal::entityManager()->getStorage('entity_test');
86 if ($storage instanceof SqlContentEntityStorage) {
87 // Count the actual number of rows in the field table.
88 $table_mapping = $storage->getTableMapping();
89 $field_table_name = $table_mapping->getDedicatedDataTableName($field_storage);
90 $result = db_select($field_table_name, 't')
95 $this->assertEqual($result, 24, 'The field table has 24 rows.');
98 $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with field data.');
99 $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with field data.');
101 // Ensure the methods work on deleted fields.
102 $field_storage->delete();
103 $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
104 $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with deleted field data.');
106 field_purge_batch(6);
107 $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
108 $this->assertEqual($this->storage->countFieldData($field_storage), 6, 'There are 6 entities with deleted field data.');
110 $entity_type = 'entity_test_rev';
111 $this->createFieldWithStorage('_2', $entity_type);
113 $entity_init = $this->container->get('entity_type.manager')
114 ->getStorage($entity_type)
115 ->create(['type' => $entity_type]);
116 $cardinality = $this->fieldTestData->field_storage_2->getCardinality();
118 $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), FALSE, 'There are no entities with field data.');
119 $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 0, 'There are 0 entities with field data.');
121 // Create 1 entity with the field.
122 $entity = clone($entity_init);
123 $values = $this->_generateTestFieldValues($this->fieldTestData->field_storage_2->getCardinality());
124 $entity->{$this->fieldTestData->field_name_2} = $values;
125 $entity->setNewRevision();
127 $first_revision = $entity->getRevisionId();
129 $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
130 $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 1, 'There is 1 entity with field data.');
132 $entity->{$this->fieldTestData->field_name_2} = [];
133 $entity->setNewRevision();
136 $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
138 $storage = $this->container->get('entity.manager')->getStorage($entity_type);
139 $entity = $storage->loadRevision($first_revision);
140 $this->assertEqual(count($entity->{$this->fieldTestData->field_name_2}), $cardinality, format_string('Revision %revision_id: expected number of values.', ['%revision_id' => $first_revision]));
144 * Verify that we can count a table that contains an entry with index 0.
146 public function testCountWithIndex0() {
147 // Create a field that will require dedicated storage.
148 /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
149 $field_storage = FieldStorageConfig::create([
150 'field_name' => 'field_int',
151 'entity_type' => 'user',
155 $field_storage->save();
156 FieldConfig::create([
157 'field_storage' => $field_storage,
161 // Create an entry for the anonymous user, who has user ID 0.
162 $user = $this->storageUser
165 'name' => 'anonymous',
172 // Test shared table storage.
173 $storage = $user->getFieldDefinition('name')->getFieldStorageDefinition();
174 $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
176 // Test dedicated table storage.
177 $storage = $user->getFieldDefinition('field_int')->getFieldStorageDefinition();
178 $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));