Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 51 |
Subquery | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
306 | |
0.00% |
0 / 51 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
buildJoin | |
0.00% |
0 / 1 |
272 | |
0.00% |
0 / 48 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\views\Plugin\views\join\Subquery. | |
*/ | |
namespace Drupal\views\Plugin\views\join; | |
/** | |
* Join handler for relationships that join with a subquery as the left field. | |
* | |
* For example: | |
* @code | |
* LEFT JOIN node node_term_data ON ([YOUR SUBQUERY HERE]) = node_term_data.nid | |
* @endcode | |
* | |
* Join definition: same as \Drupal\views\Plugin\views\join\JoinPluginBase, | |
* except: | |
* - left_query: The subquery to use in the left side of the join clause. | |
* | |
* @ingroup views_join_handlers | |
* @ViewsJoin("subquery") | |
*/ | |
class Subquery extends JoinPluginBase { | |
/** | |
* Constructs a Subquery object. | |
*/ | |
public function __construct(array $configuration, $plugin_id, $plugin_definition) { | |
parent::__construct($configuration, $plugin_id, $plugin_definition); | |
$this->left_query = $this->configuration['left_query']; | |
} | |
/** | |
* Builds the SQL for the join this object represents. | |
* | |
* @param \Drupal\Core\Database\Query\SelectInterface $select_query | |
* The select query object. | |
* @param string $table | |
* The base table to join. | |
* @param \Drupal\views\Plugin\views\query\QueryPluginBase $view_query | |
* The source views query. | |
*/ | |
public function buildJoin($select_query, $table, $view_query) { | |
if (empty($this->configuration['table formula'])) { | |
$right_table = "{" . $this->table . "}"; | |
} | |
else { | |
$right_table = $this->configuration['table formula']; | |
} | |
// Add our join condition, using a subquery on the left instead of a field. | |
$condition = "($this->left_query) = $table[alias].$this->field"; | |
$arguments = array(); | |
// Tack on the extra. | |
// This is just copied verbatim from the parent class, which itself has a | |
// bug: https://www.drupal.org/node/1118100. | |
if (isset($this->extra)) { | |
if (is_array($this->extra)) { | |
$extras = array(); | |
foreach ($this->extra as $info) { | |
// Figure out the table name. Remember, only use aliases provided | |
// if at all possible. | |
$join_table = ''; | |
if (!array_key_exists('table', $info)) { | |
$join_table = $table['alias'] . '.'; | |
} | |
elseif (isset($info['table'])) { | |
$join_table = $info['table'] . '.'; | |
} | |
$placeholder = ':views_join_condition_' . $select_query->nextPlaceholder(); | |
if (is_array($info['value'])) { | |
$operator = !empty($info['operator']) ? $info['operator'] : 'IN'; | |
// Transform from IN() notation to = notation if just one value. | |
if (count($info['value']) == 1) { | |
$info['value'] = array_shift($info['value']); | |
$operator = $operator == 'NOT IN' ? '!=' : '='; | |
} | |
} | |
else { | |
$operator = !empty($info['operator']) ? $info['operator'] : '='; | |
} | |
$extras[] = "$join_table$info[field] $operator $placeholder"; | |
$arguments[$placeholder] = $info['value']; | |
} | |
if ($extras) { | |
if (count($extras) == 1) { | |
$condition .= ' AND ' . array_shift($extras); | |
} | |
else { | |
$condition .= ' AND (' . implode(' ' . $this->extraOperator . ' ', $extras) . ')'; | |
} | |
} | |
} | |
elseif ($this->extra && is_string($this->extra)) { | |
$condition .= " AND ($this->extra)"; | |
} | |
} | |
$select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments); | |
} | |
} |