Chris@0: installEntitySchema('entity_test_rev'); Chris@0: $this->storage = \Drupal::entityManager()->getStorage('entity_test'); Chris@0: $this->storageRev = \Drupal::entityManager()->getStorage('entity_test_rev'); Chris@0: $this->storageUser = \Drupal::entityManager()->getStorage('user'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests entityCount() and hadData() methods. Chris@0: */ Chris@0: public function testEntityCountAndHasData() { Chris@0: // Create a field with a cardinality of 2 to show that we are counting Chris@0: // entities and not rows in a table. Chris@0: /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */ Chris@0: $field_storage = FieldStorageConfig::create([ Chris@0: 'field_name' => 'field_int', Chris@0: 'entity_type' => 'entity_test', Chris@0: 'type' => 'integer', Chris@0: 'cardinality' => 2, Chris@0: ]); Chris@0: $field_storage->save(); Chris@0: FieldConfig::create([ Chris@0: 'field_storage' => $field_storage, Chris@0: 'bundle' => 'entity_test', Chris@0: ])->save(); Chris@0: Chris@0: $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.'); Chris@0: $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.'); Chris@0: Chris@0: // Create 1 entity without the field. Chris@0: $entity = EntityTest::create(); Chris@0: $entity->name->value = $this->randomMachineName(); Chris@0: $entity->save(); Chris@0: Chris@0: $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.'); Chris@0: $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.'); Chris@0: Chris@0: // Create 12 entities to ensure that the purging works as expected. Chris@0: for ($i = 0; $i < 12; $i++) { Chris@0: $entity = EntityTest::create(); Chris@0: $entity->field_int[] = mt_rand(1, 99); Chris@0: $entity->field_int[] = mt_rand(1, 99); Chris@0: $entity->name[] = $this->randomMachineName(); Chris@0: $entity->save(); Chris@0: } Chris@0: Chris@0: $storage = \Drupal::entityManager()->getStorage('entity_test'); Chris@0: if ($storage instanceof SqlContentEntityStorage) { Chris@0: // Count the actual number of rows in the field table. Chris@0: $table_mapping = $storage->getTableMapping(); Chris@0: $field_table_name = $table_mapping->getDedicatedDataTableName($field_storage); Chris@18: $result = Database::getConnection()->select($field_table_name, 't') Chris@0: ->fields('t') Chris@0: ->countQuery() Chris@0: ->execute() Chris@0: ->fetchField(); Chris@0: $this->assertEqual($result, 24, 'The field table has 24 rows.'); Chris@0: } Chris@0: Chris@0: $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with field data.'); Chris@0: $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with field data.'); Chris@0: Chris@0: // Ensure the methods work on deleted fields. Chris@0: $field_storage->delete(); Chris@0: $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.'); Chris@0: $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with deleted field data.'); Chris@0: Chris@0: field_purge_batch(6); Chris@0: $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.'); Chris@0: $this->assertEqual($this->storage->countFieldData($field_storage), 6, 'There are 6 entities with deleted field data.'); Chris@0: Chris@0: $entity_type = 'entity_test_rev'; Chris@0: $this->createFieldWithStorage('_2', $entity_type); Chris@0: Chris@0: $entity_init = $this->container->get('entity_type.manager') Chris@0: ->getStorage($entity_type) Chris@0: ->create(['type' => $entity_type]); Chris@0: $cardinality = $this->fieldTestData->field_storage_2->getCardinality(); Chris@0: Chris@0: $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), FALSE, 'There are no entities with field data.'); Chris@0: $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 0, 'There are 0 entities with field data.'); Chris@0: Chris@0: // Create 1 entity with the field. Chris@0: $entity = clone($entity_init); Chris@0: $values = $this->_generateTestFieldValues($this->fieldTestData->field_storage_2->getCardinality()); Chris@0: $entity->{$this->fieldTestData->field_name_2} = $values; Chris@0: $entity->setNewRevision(); Chris@0: $entity->save(); Chris@0: $first_revision = $entity->getRevisionId(); Chris@0: Chris@0: $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.'); Chris@0: $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 1, 'There is 1 entity with field data.'); Chris@0: Chris@0: $entity->{$this->fieldTestData->field_name_2} = []; Chris@0: $entity->setNewRevision(); Chris@0: $entity->save(); Chris@0: Chris@0: $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.'); Chris@0: Chris@0: $storage = $this->container->get('entity.manager')->getStorage($entity_type); Chris@0: $entity = $storage->loadRevision($first_revision); Chris@0: $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: } Chris@0: Chris@0: /** Chris@0: * Verify that we can count a table that contains an entry with index 0. Chris@0: */ Chris@0: public function testCountWithIndex0() { Chris@0: // Create a field that will require dedicated storage. Chris@0: /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */ Chris@0: $field_storage = FieldStorageConfig::create([ Chris@0: 'field_name' => 'field_int', Chris@0: 'entity_type' => 'user', Chris@0: 'type' => 'integer', Chris@0: 'cardinality' => 2, Chris@0: ]); Chris@0: $field_storage->save(); Chris@0: FieldConfig::create([ Chris@0: 'field_storage' => $field_storage, Chris@0: 'bundle' => 'user', Chris@0: ])->save(); Chris@0: Chris@0: // Create an entry for the anonymous user, who has user ID 0. Chris@0: $user = $this->storageUser Chris@0: ->create([ Chris@0: 'uid' => 0, Chris@0: 'name' => 'anonymous', Chris@0: 'mail' => NULL, Chris@0: 'status' => FALSE, Chris@0: 'field_int' => 42, Chris@0: ]); Chris@0: $user->save(); Chris@0: Chris@0: // Test shared table storage. Chris@0: $storage = $user->getFieldDefinition('name')->getFieldStorageDefinition(); Chris@0: $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE)); Chris@0: Chris@0: // Test dedicated table storage. Chris@0: $storage = $user->getFieldDefinition('field_int')->getFieldStorageDefinition(); Chris@0: $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE)); Chris@0: } Chris@0: Chris@0: }