You are here

protected function ContentEntityStorageTrait::buildQuery in Multiversion 8.2

Same name and namespace in other branches
  1. 8 src/Entity/Storage/ContentEntityStorageTrait.php \Drupal\multiversion\Entity\Storage\ContentEntityStorageTrait::buildQuery()

File

src/Entity/Storage/ContentEntityStorageTrait.php, line 55

Class

ContentEntityStorageTrait

Namespace

Drupal\multiversion\Entity\Storage

Code

protected function buildQuery($ids, $revision_ids = FALSE) {
  $query = parent::buildQuery($ids, $revision_ids);

  // Prevent to modify the query before entity type updates.
  if (!is_subclass_of($this->entityType
    ->getStorageClass(), ContentEntityStorageInterface::class)) {
    return $query;
  }
  $revision_data_alias = 'revision';
  if ($this->entityType
    ->isTranslatable()) {

    // Join the field data table in order to set the workspace condition.
    $field_data_table = $this
      ->getDataTable();
    $field_data_alias = 'field_data';
    $query
      ->join($field_data_table, $field_data_alias, "{$field_data_alias}.{$this->idKey} = base.{$this->idKey}");

    // Join the revision data table in order to set the delete condition.
    $revision_data_table = $this
      ->getRevisionDataTable();
    $revision_data_alias = 'revision_data';
    if ($revision_ids) {
      $query
        ->join($revision_data_table, $revision_data_alias, "{$revision_data_alias}.{$this->revisionKey} = revision.{$this->revisionKey} AND {$revision_data_alias}.{$this->revisionKey} IN (:revisionIds[])", [
        ':revisionIds[]' => (array) $revision_ids,
      ]);
    }
    else {
      $query
        ->join($revision_data_table, $revision_data_alias, "{$revision_data_alias}.{$this->revisionKey} = revision.{$this->revisionKey}");
    }
  }
  $workspace = Workspace::load($this
    ->getWorkspaceId());
  if (!$workspace
    ->isDefaultWorkspace()) {
    $query
      ->addMetaData('active_workspace_id', $workspace
      ->id());
    $query
      ->addMetaData('simple_query', FALSE);

    // LEFT JOIN 'workspace_association' to the base table of the query so we
    // can properly include live content along with a possible workspace
    // revision.
    $workspace_association_table = 'workspace_association';
    $query
      ->leftJoin($workspace_association_table, $workspace_association_table, "%alias.target_entity_type_id = '{$this->entityTypeId}' AND %alias.target_entity_id = base.{$this->idKey}");
    $query
      ->condition($query
      ->orConditionGroup()
      ->condition("{$workspace_association_table}.workspace", $workspace
      ->id())
      ->condition("{$workspace_association_table}.workspace", NULL, 'IS'));
  }

  // Loadings a revision is explicit. So when we try to load one we should do
  // so without a condition on the deleted flag.
  if (!$revision_ids) {
    $query
      ->condition("{$revision_data_alias}._deleted", (int) $this->isDeleted);
  }
  return $query;
}