private function buildInCondition($operator, $operands)
{
if (!isset($operands[0], $operands[1])) {
throw new InvalidParamException("Operator '{$operator}' requires two operands.");
}
list($column, $values) = $operands;
$values = (array) $values;
if (empty($values) || $column === []) {
return $operator === 'in' ? ['terms' => ['_uid' => []]] : [];
// this condition is equal to WHERE false
}
if (count($column) > 1) {
return $this->buildCompositeInCondition($operator, $column, $values);
} elseif (is_array($column)) {
$column = reset($column);
}
$canBeNull = false;
foreach ($values as $i => $value) {
if (is_array($value)) {
$values[$i] = $value = isset($value[$column]) ? $value[$column] : null;
}
if ($value === null) {
$canBeNull = true;
unset($values[$i]);
}
}
if ($column == '_id') {
if (empty($values) && $canBeNull) {
// there is no null pk
$filter = ['terms' => ['_uid' => []]];
// this condition is equal to WHERE false
} else {
$filter = ['ids' => ['values' => array_values($values)]];
if ($canBeNull) {
$filter = ['or' => [$filter, ['missing' => ['field' => $column, 'existence' => true, 'null_value' => true]]]];
}
}
} else {
if (empty($values) && $canBeNull) {
$filter = ['missing' => ['field' => $column, 'existence' => true, 'null_value' => true]];
} else {
$filter = ['in' => [$column => array_values($values)]];
if ($canBeNull) {
$filter = ['or' => [$filter, ['missing' => ['field' => $column, 'existence' => true, 'null_value' => true]]]];
}
}
}
if ($operator == 'not in') {
$filter = ['not' => $filter];
}
return $filter;
}