Skip to content
Snippets Groups Projects
Commit 963f01fb authored by catch's avatar catch
Browse files

Issue #2744069 by kristiaanvandeneynde, achton, dawehner, ohthehugemanatee:...

Issue #2744069 by kristiaanvandeneynde, achton, dawehner, ohthehugemanatee: views_query_views_alter() does not handle IN queries
parent 453d552d
No related branches found
No related tags found
2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
<?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];
}
}
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment