Issue #2744069 by kristiaanvandeneynde, achton, dawehner, ohthehugemanatee: views_query_views_alter() does not handle IN queries
							parent
							
								
									453d552da9
								
							
						
					
					
						commit
						963f01fbe9
					
				| 
						 | 
				
			
			@ -0,0 +1,130 @@
 | 
			
		|||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Drupal\Tests\views\Kernel\Plugin;
 | 
			
		||||
 | 
			
		||||
use Drupal\simpletest\UserCreationTrait;
 | 
			
		||||
use Drupal\views\Views;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests the base relationship handler.
 | 
			
		||||
 *
 | 
			
		||||
 * @group views
 | 
			
		||||
 * @see \Drupal\views\Plugin\views\relationship\RelationshipPluginBase
 | 
			
		||||
 */
 | 
			
		||||
class RelationshipJoinInTest extends RelationshipJoinTestBase {
 | 
			
		||||
 | 
			
		||||
  use UserCreationTrait;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Views used by this test.
 | 
			
		||||
   *
 | 
			
		||||
   * @var array
 | 
			
		||||
   */
 | 
			
		||||
  public static $testViews = ['test_view'];
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Maps between the key in the expected result and the query result.
 | 
			
		||||
   *
 | 
			
		||||
   * @var array
 | 
			
		||||
   */
 | 
			
		||||
  protected $columnMap = [
 | 
			
		||||
    'views_test_data_name' => 'name',
 | 
			
		||||
    'users_field_data_views_test_data_uid' => 'uid',
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests the query result of a view with a relationship with an IN condition.
 | 
			
		||||
   */
 | 
			
		||||
  public function testRelationshipInQuery() {
 | 
			
		||||
    // Update the first two Beatles to be authored by Kristiaan.
 | 
			
		||||
    $account_k = $this->createUser([], 'Kristiaan');
 | 
			
		||||
    db_query("UPDATE {views_test_data} SET uid = :uid WHERE id IN (1,2)", [':uid' => $account_k->id()]);
 | 
			
		||||
 | 
			
		||||
    // Update the other two Beatles to be authored by Django.
 | 
			
		||||
    $account_d = $this->createUser([], 'Django');
 | 
			
		||||
    db_query("UPDATE {views_test_data} SET uid = :uid WHERE id IN (3,4)", [':uid' => $account_d->id()]);
 | 
			
		||||
 | 
			
		||||
    // Update Meredith to be authored by Silvie.
 | 
			
		||||
    $account_s = $this->createUser([], 'Silvie');
 | 
			
		||||
    db_query("UPDATE {views_test_data} SET uid = :uid WHERE id = 5", [':uid' => $account_s->id()]);
 | 
			
		||||
 | 
			
		||||
    $view = Views::getView('test_view');
 | 
			
		||||
    $view->setDisplay();
 | 
			
		||||
 | 
			
		||||
    $view->displayHandlers->get('default')->overrideOption('relationships', [
 | 
			
		||||
      'uid' => [
 | 
			
		||||
        'id' => 'uid',
 | 
			
		||||
        'table' => 'views_test_data',
 | 
			
		||||
        'field' => 'uid',
 | 
			
		||||
        'required' => TRUE,
 | 
			
		||||
      ],
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    $view->displayHandlers->get('default')->overrideOption('filters', [
 | 
			
		||||
      'uid' => [
 | 
			
		||||
        'id' => 'uid',
 | 
			
		||||
        'table' => 'users_field_data',
 | 
			
		||||
        'field' => 'uid',
 | 
			
		||||
        'relationship' => 'uid',
 | 
			
		||||
      ],
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    $fields = $view->displayHandlers->get('default')->getOption('fields');
 | 
			
		||||
    $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
 | 
			
		||||
      'uid' => [
 | 
			
		||||
        'id' => 'uid',
 | 
			
		||||
        'table' => 'users_field_data',
 | 
			
		||||
        'field' => 'uid',
 | 
			
		||||
        'relationship' => 'uid',
 | 
			
		||||
      ],
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    // Check for all beatles created by Kristiaan.
 | 
			
		||||
    $view->initHandlers();
 | 
			
		||||
    $view->filter['uid']->value = [$account_k->id()];
 | 
			
		||||
    $this->executeView($view);
 | 
			
		||||
 | 
			
		||||
    $expected_result = [
 | 
			
		||||
      ['name' => 'John', 'uid' => $account_k->id()],
 | 
			
		||||
      ['name' => 'George', 'uid' => $account_k->id()],
 | 
			
		||||
    ];
 | 
			
		||||
    $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
 | 
			
		||||
    $view->destroy();
 | 
			
		||||
 | 
			
		||||
    // Check for all beatles created by Django. This should not return anything
 | 
			
		||||
    // as the 'extra' option on the join prohibits relating to any authors but
 | 
			
		||||
    // Kristiaan or Silvie.
 | 
			
		||||
    $view->initHandlers();
 | 
			
		||||
    $view->filter['uid']->value = [$account_d->id()];
 | 
			
		||||
    $this->executeView($view);
 | 
			
		||||
 | 
			
		||||
    $expected_result = [];
 | 
			
		||||
    $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
 | 
			
		||||
    $view->destroy();
 | 
			
		||||
 | 
			
		||||
    // Check for all people created by anyone.
 | 
			
		||||
    $view->initHandlers();
 | 
			
		||||
    $this->executeView($view);
 | 
			
		||||
    $expected_result = [
 | 
			
		||||
      ['name' => 'John', 'uid' => $account_k->id()],
 | 
			
		||||
      ['name' => 'George', 'uid' => $account_k->id()],
 | 
			
		||||
      ['name' => 'Meredith', 'uid' => $account_s->id()],
 | 
			
		||||
    ];
 | 
			
		||||
    $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
 | 
			
		||||
    $view->destroy();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Adds an IN condition for the user name.
 | 
			
		||||
   */
 | 
			
		||||
  protected function viewsData() {
 | 
			
		||||
    $data = parent::viewsData();
 | 
			
		||||
    // Only relate if the author's name is Kristiaan or Silvie.
 | 
			
		||||
    $data['views_test_data']['uid']['relationship']['extra'][] = [
 | 
			
		||||
      'field' => 'name',
 | 
			
		||||
      'value' => ['Kristiaan', 'Silvie'],
 | 
			
		||||
    ];
 | 
			
		||||
    return $data;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -660,8 +660,17 @@ function views_query_views_alter(AlterableInterface $query) {
 | 
			
		|||
  // Replaces substitutions in tables.
 | 
			
		||||
  foreach ($tables as $table_name => $table_metadata) {
 | 
			
		||||
    foreach ($table_metadata['arguments'] as $replacement_key => $value) {
 | 
			
		||||
      if (isset($substitutions[$value])) {
 | 
			
		||||
        $tables[$table_name]['arguments'][$replacement_key] = $substitutions[$value];
 | 
			
		||||
      if (!is_array($value)) {
 | 
			
		||||
        if (isset($substitutions[$value])) {
 | 
			
		||||
          $tables[$table_name]['arguments'][$replacement_key] = $substitutions[$value];
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        foreach ($value as $sub_key => $sub_value) {
 | 
			
		||||
          if (isset($substitutions[$sub_value])) {
 | 
			
		||||
            $tables[$table_name]['arguments'][$replacement_key][$sub_key] = $substitutions[$sub_value];
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue