Unverified Commit d9bd98f6 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2652652 by dawehner, Sam152, Charlie ChX Negyesi, Manuel Garcia,...

Issue #2652652 by dawehner, Sam152, Charlie ChX Negyesi, Manuel Garcia, mikemiles86, minorOffense, Lendude, jibran, alexpott, xjm, effulgentsia, webchick: Provide a relationship from the revision table to the main table

(cherry picked from commit 45347fa5)
parent b6e7d698
Loading
Loading
Loading
Loading
+0 −21
Original line number Diff line number Diff line
@@ -36,27 +36,6 @@ public function getViewsData() {
    $data['block_content_field_revision']['table']['base']['help'] = $this->t('Block Content revision is a history of changes to block content.');
    $data['block_content_field_revision']['table']['base']['defaults']['title'] = 'info';

    // @todo EntityViewsData should add these relationships by default.
    //   https://www.drupal.org/node/2410275
    $data['block_content_field_revision']['id']['relationship']['id'] = 'standard';
    $data['block_content_field_revision']['id']['relationship']['base'] = 'block_content_field_data';
    $data['block_content_field_revision']['id']['relationship']['base field'] = 'id';
    $data['block_content_field_revision']['id']['relationship']['title'] = $this->t('Block Content');
    $data['block_content_field_revision']['id']['relationship']['label'] = $this->t('Get the actual block content from a block content revision.');

    $data['block_content_field_revision']['revision_id']['relationship']['id'] = 'standard';
    $data['block_content_field_revision']['revision_id']['relationship']['base'] = 'block_content_field_data';
    $data['block_content_field_revision']['revision_id']['relationship']['base field'] = 'revision_id';
    $data['block_content_field_revision']['revision_id']['relationship']['title'] = $this->t('Block Content');
    $data['block_content_field_revision']['revision_id']['relationship']['label'] = $this->t('Get the actual block content from a block content revision.');

    $data['block_content_revision']['revision_user']['help'] = $this->t('The user who created the revision.');
    $data['block_content_revision']['revision_user']['relationship']['label'] = $this->t('revision user');
    $data['block_content_revision']['revision_user']['filter']['id'] = 'user_name';

    $data['block_content_revision']['table']['join']['block_content_field_data']['left_field'] = 'revision_id';
    $data['block_content_revision']['table']['join']['block_content_field_data']['field'] = 'revision_id';

    return $data;
  }

+0 −7
Original line number Diff line number Diff line
@@ -18,13 +18,6 @@ public function getViewsData() {
    $data['media_field_data']['table']['wizard_id'] = 'media';
    $data['media_field_revision']['table']['wizard_id'] = 'media_revision';

    $data['media_revision']['revision_user']['help'] = $this->t('The user who created the revision.');
    $data['media_revision']['revision_user']['relationship']['label'] = $this->t('revision user');
    $data['media_revision']['revision_user']['filter']['id'] = 'user_name';

    $data['media_revision']['table']['join']['media_field_data']['left_field'] = 'vid';
    $data['media_revision']['table']['join']['media_field_data']['field'] = 'vid';

    $data['media_field_data']['status_extra'] = [
      'title' => $this->t('Published status or admin user'),
      'help' => $this->t('Filters out unpublished media if the current user cannot view it.'),
+0 −36
Original line number Diff line number Diff line
@@ -178,12 +178,6 @@ public function getViewsData() {
      ],
    ];

    $data['node_field_data']['uid']['help'] = $this->t('The user authoring the content. If you need more fields than the uid add the content: author relationship');
    $data['node_field_data']['uid']['filter']['id'] = 'user_name';
    $data['node_field_data']['uid']['relationship']['title'] = $this->t('Content author');
    $data['node_field_data']['uid']['relationship']['help'] = $this->t('Relate content to the user who created it.');
    $data['node_field_data']['uid']['relationship']['label'] = $this->t('author');

    $data['node']['node_listing_empty'] = [
      'title' => $this->t('Empty Node Frontpage behavior'),
      'help' => $this->t('Provides a link to the node add overview page.'),
@@ -211,45 +205,15 @@ public function getViewsData() {
    // @todo the NID field needs different behavior on revision/non-revision
    //   tables. It would be neat if this could be encoded in the base field
    //   definition.
    $data['node_field_revision']['nid']['relationship']['id'] = 'standard';
    $data['node_field_revision']['nid']['relationship']['base'] = 'node_field_data';
    $data['node_field_revision']['nid']['relationship']['base field'] = 'nid';
    $data['node_field_revision']['nid']['relationship']['title'] = $this->t('Content');
    $data['node_field_revision']['nid']['relationship']['label'] = $this->t('Get the actual content from a content revision.');
    $data['node_field_revision']['nid']['relationship']['extra'][] = [
      'field' => 'langcode',
      'left_field' => 'langcode',
    ];

    $data['node_field_revision']['vid'] = [
      'argument' => [
        'id' => 'node_vid',
        'numeric' => TRUE,
      ],
      'relationship' => [
        'id' => 'standard',
        'base' => 'node_field_data',
        'base field' => 'vid',
        'title' => $this->t('Content'),
        'label' => $this->t('Get the actual content from a content revision.'),
        'extra' => [
          [
            'field' => 'langcode',
            'left_field' => 'langcode',
          ],
        ],
      ],
    ] + $data['node_field_revision']['vid'];

    $data['node_field_revision']['langcode']['help'] = $this->t('The language the original content is in.');

    $data['node_revision']['revision_uid']['help'] = $this->t('The user who created the revision.');
    $data['node_revision']['revision_uid']['relationship']['label'] = $this->t('revision user');
    $data['node_revision']['revision_uid']['filter']['id'] = 'user_name';

    $data['node_revision']['table']['join']['node_field_data']['left_field'] = 'vid';
    $data['node_revision']['table']['join']['node_field_data']['field'] = 'vid';

    $data['node_field_revision']['table']['wizard_id'] = 'node_field_revision';

    $data['node_field_revision']['status']['filter']['label'] = $this->t('Published');
+46 −8
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace Drupal\views;

use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Entity\ContentEntityType;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityHandlerInterface;
@@ -132,7 +133,8 @@ public function getViewsData() {
    $base_table = $this->entityType->getBaseTable() ?: $this->entityType->id();
    $views_revision_base_table = NULL;
    $revisionable = $this->entityType->isRevisionable();
    $base_field = $this->entityType->getKey('id');
    $entity_id_key = $this->entityType->getKey('id');
    $entity_keys = $this->entityType->getKeys();

    $revision_table = '';
    if ($revisionable) {
@@ -153,7 +155,8 @@ public function getViewsData() {
    if ($revisionable && $translatable) {
      $revision_data_table = $this->entityType->getRevisionDataTable() ?: $this->entityType->id() . '_field_revision';
    }
    $revision_field = $this->entityType->getKey('revision');
    $entity_revision_key = $this->entityType->getKey('revision');
    $revision_field = $entity_revision_key;

    // Setup base information of the views data.
    $data[$base_table]['table']['group'] = $this->entityType->getLabel();
@@ -164,7 +167,7 @@ public function getViewsData() {
      $views_base_table = $data_table;
    }
    $data[$views_base_table]['table']['base'] = [
      'field' => $base_field,
      'field' => $entity_id_key,
      'title' => $this->entityType->getLabel(),
      'cache_contexts' => $this->entityType->getListCacheContexts(),
      'access query tag' => $this->entityType->id() . '_access',
@@ -219,8 +222,8 @@ public function getViewsData() {
    // Setup relations to the revisions/property data.
    if ($data_table) {
      $data[$base_table]['table']['join'][$data_table] = [
        'left_field' => $base_field,
        'field' => $base_field,
        'left_field' => $entity_id_key,
        'field' => $entity_id_key,
        'type' => 'INNER',
      ];
      $data[$data_table]['table']['group'] = $this->entityType->getLabel();
@@ -271,6 +274,33 @@ public function getViewsData() {
          'filter' => ['id' => 'latest_translation_affected_revision'],
        ];
      }
      // Add a relationship from the revision table back to the main table.
      $entity_type_label = $this->entityType->getLabel();
      $data[$views_revision_base_table][$entity_id_key]['relationship'] = [
        'id' => 'standard',
        'base' => $views_base_table,
        'base field' => $entity_id_key,
        'title' => $entity_type_label,
        'help' => $this->t('Get the actual @label from a @label revision', ['@label' => $entity_type_label]),
      ];
      $data[$views_revision_base_table][$entity_revision_key]['relationship'] = [
        'id' => 'standard',
        'base' => $views_base_table,
        'base field' => $entity_revision_key,
        'title' => $this->t('@label revision', ['@label' => $entity_type_label]),
        'help' => $this->t('Get the actual @label from a @label revision', ['@label' => $entity_type_label]),
      ];
      if ($translatable) {
        $extra = [
          'field' => $entity_keys['langcode'],
          'left_field' => $entity_keys['langcode'],
        ];
        $data[$views_revision_base_table][$entity_id_key]['relationship']['extra'][] = $extra;
        $data[$views_revision_base_table][$entity_revision_key]['relationship']['extra'][] = $extra;
        $data[$revision_table]['table']['join'][$views_base_table]['left_field'] = $entity_revision_key;
        $data[$revision_table]['table']['join'][$views_base_table]['field'] = $entity_revision_key;
      }

    }

    $this->addEntityLinks($data[$base_table]);
@@ -285,7 +315,6 @@ public function getViewsData() {
    if ($table_mapping = $this->storage->getTableMapping($field_definitions)) {
      // Fetch all fields that can appear in both the base table and the data
      // table.
      $entity_keys = $this->entityType->getKeys();
      $duplicate_fields = array_intersect_key($entity_keys, array_flip(['id', 'revision', 'bundle']));
      // Iterate over each table we have so far and collect field data for each.
      // Based on whether the field is in the field_definitions provided by the
@@ -312,7 +341,7 @@ public function getViewsData() {
          $data[$table]['table']['group'] = $this->entityType->getLabel();
          $data[$table]['table']['provider'] = $this->entityType->getProvider();
          $data[$table]['table']['join'][$views_base_table] = [
            'left_field' => $base_field,
            'left_field' => $entity_id_key,
            'field' => 'entity_id',
            'extra' => [
              ['field' => 'deleted', 'value' => 0, 'numeric' => TRUE],
@@ -334,6 +363,12 @@ public function getViewsData() {
          }
        }
      }
      if (($uid_key = $entity_keys['uid'] ?? '')) {
        $data[$data_table][$uid_key]['filter']['id'] = 'user_name';
      }
      if ($revision_table && ($revision_uid_key = $this->entityType->getRevisionMetadataKeys()['revision_user'] ?? '')) {
        $data[$revision_table][$revision_uid_key]['filter']['id'] = 'user_name';
      }
    }

    // Add the entity type key to each table generated.
@@ -411,7 +446,10 @@ protected function mapFieldDefinition($table, $field_name, FieldDefinitionInterf
    //   mapSingleFieldViewsData() method does with $first.
    $first = TRUE;
    foreach ($field_column_mapping as $field_column_name => $schema_field_name) {
      $table_data[$schema_field_name] = $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition);
      // The fields might be defined before the actual table.
      $table_data = $table_data ?: [];
      $table_data += [$schema_field_name => []];
      $table_data[$schema_field_name] = NestedArray::mergeDeep($table_data[$schema_field_name], $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition));
      $table_data[$schema_field_name]['entity field'] = $field_name;
      $first = FALSE;
    }
+30 −2
Original line number Diff line number Diff line
@@ -256,6 +256,11 @@ public function testRevisionTableWithoutDataTable() {
    $this->assertCount(1, $revision_data['table']['join']);
    $this->assertEquals(['entity_test' => ['left_field' => 'revision_id', 'field' => 'revision_id', 'type' => 'INNER']], $revision_data['table']['join']);
    $this->assertFalse(isset($data['data_table']));

    $this->assertEquals('entity_test', $revision_data['id']['relationship']['base']);
    $this->assertEquals('id', $revision_data['id']['relationship']['base field']);
    $this->assertEquals('entity_test', $revision_data['revision_id']['relationship']['base']);
    $this->assertEquals('revision_id', $revision_data['revision_id']['relationship']['base field']);
  }

  /**
@@ -294,16 +299,25 @@ public function testRevisionTableWithRevisionDataTableAndDataTable() {
    ], $revision_field_data['table']['join']);

    $revision_base_data = $data['entity_test_mulrev_revision'];
    $this->assertCount(1, $revision_base_data['table']['join']);
    $this->assertCount(2, $revision_base_data['table']['join']);
    $this->assertEquals([
      'entity_test_mulrev_property_revision' => [
        'left_field' => 'revision_id',
        'field' => 'revision_id',
        'type' => 'INNER',
      ],
      'entity_test_mul_property_data' => [
        'left_field' => 'revision_id',
        'field' => 'revision_id',
      ],
    ], $revision_base_data['table']['join']);

    $this->assertFalse(isset($data['data_table']));

    $this->assertEquals('entity_test_mul_property_data', $revision_field_data['id']['relationship']['base']);
    $this->assertEquals('id', $revision_field_data['id']['relationship']['base field']);
    $this->assertEquals('entity_test_mul_property_data', $revision_field_data['revision_id']['relationship']['base']);
    $this->assertEquals('revision_id', $revision_field_data['revision_id']['relationship']['base field']);
  }

  /**
@@ -341,15 +355,24 @@ public function testRevisionTableWithRevisionDataTable() {
    ], $revision_field_data['table']['join']);

    $revision_base_data = $data['entity_test_mulrev_revision'];
    $this->assertCount(1, $revision_base_data['table']['join']);
    $this->assertCount(2, $revision_base_data['table']['join']);
    $this->assertEquals([
      'entity_test_mulrev_property_revision' => [
        'left_field' => 'revision_id',
        'field' => 'revision_id',
        'type' => 'INNER',
      ],
      'entity_test_mulrev_field_data' => [
        'left_field' => 'revision_id',
        'field' => 'revision_id',
      ],
    ], $revision_base_data['table']['join']);
    $this->assertFalse(isset($data['data_table']));

    $this->assertEquals('entity_test_mulrev_field_data', $revision_field_data['id']['relationship']['base']);
    $this->assertEquals('id', $revision_field_data['id']['relationship']['base field']);
    $this->assertEquals('entity_test_mulrev_field_data', $revision_field_data['revision_id']['relationship']['base']);
    $this->assertEquals('revision_id', $revision_field_data['revision_id']['relationship']['base field']);
  }

  /**
@@ -583,6 +606,11 @@ public function testRevisionTableFields() {
    $this->assertNumericField($data['entity_test_mulrev_property_revision']['id']);
    $this->assertViewsDataField($data['entity_test_mulrev_property_revision']['id'], 'id');

    $this->assertEquals('entity_test_mulrev_property_data', $data['entity_test_mulrev_property_revision']['id']['relationship']['base']);
    $this->assertEquals('id', $data['entity_test_mulrev_property_revision']['id']['relationship']['base field']);
    $this->assertEquals('entity_test_mulrev_property_data', $data['entity_test_mulrev_property_revision']['revision_id']['relationship']['base']);
    $this->assertEquals('revision_id', $data['entity_test_mulrev_property_revision']['revision_id']['relationship']['base field']);

    $this->assertLanguageField($data['entity_test_mulrev_property_revision']['langcode']);
    $this->assertViewsDataField($data['entity_test_mulrev_property_revision']['langcode'], 'langcode');
    $this->assertEquals('Translation language', $data['entity_test_mulrev_property_revision']['langcode']['title']);
Loading