Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 52 |
Condition | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
552 | |
0.00% |
0 / 52 |
compile | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 16 |
|||
exists | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
notExists | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
translateCondition | |
0.00% |
0 / 1 |
182 | |
0.00% |
0 / 34 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Entity\Query\Sql\Condition. | |
*/ | |
namespace Drupal\Core\Entity\Query\Sql; | |
use Drupal\Core\Database\Query\SelectInterface; | |
use Drupal\Core\Database\Query\Condition as SqlCondition; | |
use Drupal\Core\Entity\Query\ConditionBase; | |
use Drupal\Core\Entity\Query\ConditionInterface; | |
/** | |
* Implements entity query conditions for SQL databases. | |
*/ | |
class Condition extends ConditionBase { | |
/** | |
* The SQL entity query object this condition belongs to. | |
* | |
* @var \Drupal\Core\Entity\Query\Sql\Query | |
*/ | |
protected $query; | |
/** | |
* {@inheritdoc} | |
*/ | |
public function compile($conditionContainer) { | |
// If this is not the top level condition group then the sql query is | |
// added to the $conditionContainer object by this function itself. The | |
// SQL query object is only necessary to pass to Query::addField() so it | |
// can join tables as necessary. On the other hand, conditions need to be | |
// added to the $conditionContainer object to keep grouping. | |
$sql_query = $conditionContainer instanceof SelectInterface ? $conditionContainer : $conditionContainer->sqlQuery; | |
$tables = $this->query->getTables($sql_query); | |
foreach ($this->conditions as $condition) { | |
if ($condition['field'] instanceof ConditionInterface) { | |
$sql_condition = new SqlCondition($condition['field']->getConjunction()); | |
// Add the SQL query to the object before calling this method again. | |
$sql_condition->sqlQuery = $sql_query; | |
$condition['field']->compile($sql_condition); | |
$conditionContainer->condition($sql_condition); | |
} | |
else { | |
$type = strtoupper($this->conjunction) == 'OR' || $condition['operator'] == 'IS NULL' ? 'LEFT' : 'INNER'; | |
$field = $tables->addField($condition['field'], $type, $condition['langcode']); | |
$condition['real_field'] = $field; | |
static::translateCondition($condition, $sql_query, $tables->isFieldCaseSensitive($condition['field'])); | |
// Add the translated conditions back to the condition container. | |
if (isset($condition['where']) && isset($condition['where_args'])) { | |
$conditionContainer->where($condition['where'], $condition['where_args']); | |
} | |
else { | |
$conditionContainer->condition($field, $condition['value'], $condition['operator']); | |
} | |
} | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function exists($field, $langcode = NULL) { | |
return $this->condition($field, NULL, 'IS NOT NULL', $langcode); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function notExists($field, $langcode = NULL) { | |
return $this->condition($field, NULL, 'IS NULL', $langcode); | |
} | |
/** | |
* Translates the string operators to SQL equivalents. | |
* | |
* @param array $condition | |
* The condition array. | |
* @param \Drupal\Core\Database\Query\SelectInterface $sql_query | |
* Select query instance. | |
* @param bool|null $case_sensitive | |
* If the condition should be case sensitive or not, NULL if the field does | |
* not define it. | |
* | |
* @see \Drupal\Core\Database\Query\ConditionInterface::condition() | |
*/ | |
public static function translateCondition(&$condition, SelectInterface $sql_query, $case_sensitive) { | |
// // There is nothing we can do for IN (). | |
if (is_array($condition['value'])) { | |
return; | |
} | |
// Ensure that the default operator is set to simplify the cases below. | |
if (empty($condition['operator'])) { | |
$condition['operator'] = '='; | |
} | |
switch ($condition['operator']) { | |
case '=': | |
// If a field explicitly requests that queries should not be case | |
// sensitive, use the LIKE operator, otherwise keep =. | |
if ($case_sensitive === FALSE) { | |
$condition['value'] = $sql_query->escapeLike($condition['value']); | |
$condition['operator'] = 'LIKE'; | |
} | |
break; | |
case '<>': | |
// If a field explicitly requests that queries should not be case | |
// sensitive, use the NOT LIKE operator, otherwise keep <>. | |
if ($case_sensitive === FALSE) { | |
$condition['value'] = $sql_query->escapeLike($condition['value']); | |
$condition['operator'] = 'NOT LIKE'; | |
} | |
break; | |
case 'STARTS_WITH': | |
if ($case_sensitive) { | |
$condition['operator'] = 'LIKE BINARY'; | |
} | |
else { | |
$condition['operator'] = 'LIKE'; | |
} | |
$condition['value'] = $sql_query->escapeLike($condition['value']) . '%'; | |
break; | |
case 'CONTAINS': | |
if ($case_sensitive) { | |
$condition['operator'] = 'LIKE BINARY'; | |
} | |
else { | |
$condition['operator'] = 'LIKE'; | |
} | |
$condition['value'] = '%' . $sql_query->escapeLike($condition['value']) . '%'; | |
break; | |
case 'ENDS_WITH': | |
if ($case_sensitive) { | |
$condition['operator'] = 'LIKE BINARY'; | |
} | |
else { | |
$condition['operator'] = 'LIKE'; | |
} | |
$condition['value'] = '%' . $sql_query->escapeLike($condition['value']); | |
break; | |
} | |
} | |
} |