SqlContentEntityStorage::readFieldItemsToPurge

protected SqlContentEntityStorage::readFieldItemsToPurge(FieldDefinitionInterface $field_definition, $batch_size)

Reads values to be purged for a single field.

This method is called during field data purge, on fields for which onFieldDefinitionDelete() has previously run.

Parameters

\Drupal\Core\Field\FieldDefinitionInterface $field_definition: The field definition.

$batch_size: The maximum number of field data records to purge before returning.

Return value

\Drupal\Core\Field\FieldItemListInterface[] An array of field item lists, keyed by entity revision id.

Overrides ContentEntityStorageBase::readFieldItemsToPurge

File

core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php, line 1514

Class

SqlContentEntityStorage
A content entity database storage implementation.

Namespace

Drupal\Core\Entity\Sql

Code

protected function readFieldItemsToPurge(FieldDefinitionInterface $field_definition, $batch_size) {
  // Check whether the whole field storage definition is gone, or just some
  // bundle fields.
  $storage_definition = $field_definition->getFieldStorageDefinition();
  $is_deleted = $this->storageDefinitionIsDeleted($storage_definition);
  $table_mapping = $this->getTableMapping();
  $table_name = $table_mapping->getDedicatedDataTableName($storage_definition, $is_deleted);

  // Get the entities which we want to purge first.
  $entity_query = $this->database->select($table_name, 't', array('fetch' => \PDO::FETCH_ASSOC));
  $or = $entity_query->orConditionGroup();
  foreach ($storage_definition->getColumns() as $column_name => $data) {
    $or->isNotNull($table_mapping->getFieldColumnName($storage_definition, $column_name));
  }
  $entity_query
  ->distinct(TRUE)
    ->fields('t', array('entity_id'))
    ->condition('bundle', $field_definition->getTargetBundle())
    ->range(0, $batch_size);

  // Create a map of field data table column names to field column names.
  $column_map = array();
  foreach ($storage_definition->getColumns() as $column_name => $data) {
    $column_map[$table_mapping->getFieldColumnName($storage_definition, $column_name)] = $column_name;
  }

  $entities = array();
  $items_by_entity = array();
  foreach ($entity_query->execute() as $row) {
    $item_query = $this->database->select($table_name, 't', array('fetch' => \PDO::FETCH_ASSOC))
      ->fields('t')
      ->condition('entity_id', $row['entity_id'])
      ->condition('deleted', 1)
      ->orderBy('delta');

    foreach ($item_query->execute() as $item_row) {
      if (!isset($entities[$item_row['revision_id']])) {
        // Create entity with the right revision id and entity id combination.
        $item_row['entity_type'] = $this->entityTypeId;
        // @todo: Replace this by an entity object created via an entity
        // factory, see https://www.drupal.org/node/1867228.
        $entities[$item_row['revision_id']] = _field_create_entity_from_ids((object) $item_row);
      }
      $item = array();
      foreach ($column_map as $db_column => $field_column) {
        $item[$field_column] = $item_row[$db_column];
      }
      $items_by_entity[$item_row['revision_id']][] = $item;
    }
  }

  // Create field item objects and return.
  foreach ($items_by_entity as $revision_id => $values) {
    $entity_adapter = $entities[$revision_id]->getTypedData();
    $items_by_entity[$revision_id] = \Drupal::typedDataManager()->create($field_definition, $values, $field_definition->getName(), $entity_adapter);
  }
  return $items_by_entity;
}
doc_Drupal
2016-10-29 09:43:28
Comments
Leave a Comment

Please login to continue.