9namespace Bitrix\Main\ORM\Query\Filter;
11use Bitrix\Main\ORM\Fields\ArrayField;
12use Bitrix\Main\ORM\Fields\BooleanField;
13use Bitrix\Main\ORM\Fields\ExpressionField;
14use Bitrix\Main\ORM\Query\Filter\Expressions\ColumnExpression;
15use Bitrix\Main\ORM\Query\Query;
16use Bitrix\Main\ORM\Query\Chain;
17use Bitrix\Main\ORM\Fields\IReadable;
18use Bitrix\Main\DB\SqlExpression;
19use Bitrix\Main\ArgumentException;
20use Bitrix\Main\SystemException;
21use Bitrix\Main\Type\RandomSequence;
60 $this->
logic = static::LOGIC_AND;
78 if (!in_array(strtolower(
$logic), [static::LOGIC_AND, static::LOGIC_OR],
true))
97 $this->isNegative = (bool) $negative;
131 $this->conditions[] =
$filter[0];
138 $this->conditions[] =
$filter[0];
145 foreach (
$filter[0] as $condition)
148 call_user_func_array(
array($this,
'where'), $condition);
157 list($column, $operator, $value) =
$filter;
162 list($column, $value) =
$filter;
179 if (!isset($operators[$operator]))
185 $this->conditions[] =
new Condition($column, $operator, $value);
200 $subFilter =
new static();
201 call_user_func_array(
array($subFilter,
'where'),
$filter);
203 $this->conditions[] = $subFilter->negative();
220 list($column, $operator, $value) =
$filter;
224 list($column, $value) =
$filter;
236 $this->
where($column, $operator, $value);
250 $this->conditions[] =
new Condition($column,
'=',
null);
264 $this->conditions[] =
new Condition($column,
'<>',
null);
281 $this->conditions[] =
new Condition($column,
'in', $values);
298 $subFilter =
new static();
299 $this->conditions[] = $subFilter->whereIn($column, $values)->negative();
315 $this->conditions[] =
new Condition($column,
'between',
array($valueMin, $valueMax));
332 $subFilter =
new static();
333 $this->conditions[] = $subFilter->whereBetween($column, $valueMin, $valueMax)->negative();
348 $this->conditions[] =
new Condition($column,
'like', $value);
364 $subFilter =
new static();
365 $this->conditions[] = $subFilter->whereLike($column, $value)->negative();
397 $subFilter =
new static();
398 $this->conditions[] = $subFilter->whereExists(
$query)->negative();
417 $this->conditions[] =
new Condition($column,
'match', $value);
433 $subFilter =
new static();
434 $this->conditions[] = $subFilter->whereMatch($column, $value)->negative();
454 $tmpName =
'TMP_'.$randomSequence->randString(10);
458 ->configureValueType(BooleanField::class);
461 $this->
where($tmpField,
'expr',
true);
475 public function getSql(
$chains)
483 foreach ($this->conditions as $condition)
488 $subFilter = $condition;
489 $sql = $subFilter->getSql(
$chains);
491 if (
count($subFilter->getConditions()) > 1)
499 $columnSqlDefinition =
null;
503 if ($condition->getColumn() !==
null)
505 $chain =
$chains[$condition->getDefinition()];
506 $columnSqlDefinition = $chain->getSqlDefinition();
509 $columnField = $chain->getLastElement()->getValue();
513 if (in_array($condition->getOperator(),
array(
'in',
'between'),
true) && is_array($condition->getValue()))
516 $finalValue = $this->
convertValues($condition->getValue(), $columnField);
520 $finalValue = $this->convertValue($condition->getValue(), $columnField);
525 $operator = $operators[$condition->getOperator()];
528 $sql = call_user_func(
529 array(
'Bitrix\Main\ORM\Query\Filter\Operator', $operator),
530 $columnSqlDefinition, $finalValue
542 if (!empty($finalSql))
545 $sql = join(
" ".strtoupper($this->
logic).
" ", $finalSql);
548 if ($this->isNegative)
550 $sql =
count($finalSql) > 1 ?
"NOT ({$sql})" :
"NOT {$sql}";
579 $this->conditions[] = $condition;
593 return !empty($this->conditions);
606 foreach ($this->conditions as
$k => $condition)
608 if ($condition === $currentCondition)
610 $this->conditions[
$k] = $newCondition;
627 foreach ($this->conditions as
$k => $_condition)
629 if ($condition == $_condition)
631 unset($this->conditions[
$k]);
644 $this->conditions = [];
657 protected function convertValue($value,
IReadable $field =
null)
662 return $value->compile();
666 if ($value instanceof
Query)
668 return $value->getQuery();
674 return $value->getSql($this->chains);
683 return $field->convertValueToDb(
'N;');
686 return new Expressions\NullExpression;
689 if ($value instanceof Expressions\ColumnExpression)
692 $valueChain = $this->chains[$value->getDefinition()];
693 return $valueChain->getSqlDefinition();
696 return $field->convertValueToDb($value);
712 foreach ($values as
$k => $value)
714 $values[
$k] = $this->convertValue($value, $field);
722 $newConditions =
array();
724 foreach ($this->conditions as $condition)
726 $newConditions[] = clone $condition;
729 $this->conditions = $newConditions;
737 if (!isset(static::$randomSequence))
742 return static::$randomSequence;
759 $conditionTree->logic(
$filter[
'logic']);
763 if (isset(
$filter[
'negative']))
765 $conditionTree->negative(
$filter[
'negative']);
769 foreach (
$filter as $condition)
771 if (isset($condition[0]) && is_array($condition[0]))
773 $conditionTree->where(static::createFromArray($condition));
778 $valueKey = key(array_reverse($condition,
true));
779 $valueElement = $condition[$valueKey];
781 if (is_array($valueElement))
783 if (isset($valueElement[
'value']))
785 $value = $valueElement[
'value'];
787 elseif (isset($valueElement[
'column']))
794 foreach ($valueElement as
$k => $singleValue)
796 if (is_array($singleValue))
798 if (isset($singleValue[
'value']))
800 $valueElement[
$k] = $singleValue[
'value'];
802 elseif (isset($singleValue[
'column']))
809 $value = $valueElement;
812 $condition[$valueKey] = $value;
815 $conditionTree->where(...$condition);
819 return $conditionTree;
whereNotIn($column, $values)
whereNotMatch($column, $value)
whereExpr($expr, $arguments)
whereNotBetween($column, $valueMin, $valueMax)
whereLike($column, $value)
static createFromArray($filter)
static RandomSequence $randomSequence
whereNotLike($column, $value)
whereBetween($column, $valueMin, $valueMax)
whereIn($column, $values)
whereMatch($column, $value)
replaceCondition($currentCondition, $newCondition)
removeCondition($condition)
static getRandomSequence()
convertValues($values, IReadable $field=null)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"