• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/sqlwhere.php
  • Класс: CAllSQLWhere
  • Вызов: CAllSQLWhere::GetQueryEx
public function GetQueryEx($arFilter, &$arJoins, $level=0)
{
	if(!is_array($arFilter))
		return "";

	$logic = false;
	if(isset($arFilter['LOGIC']))
	{
		$logic = $arFilter["LOGIC"];
		unset($arFilter["LOGIC"]);
	}

	$inverted = false;
	if($logic == 'NOT')
	{
		$inverted = true;
		$logic = 'AND';
	}

	if($logic !== "OR")
		$logic = "AND";

	$result = array();
	foreach($arFilter as $key=>$value)
	{
		if(is_numeric($key))
		{
			$arRecursiveJoins = $arJoins;
			$value = $this->GetQueryEx($value, $arRecursiveJoins, $level+1);
			if($value <> '')
				$result[] = "(".$value."n".str_repeat("t", $level).")";

			foreach($arRecursiveJoins as $TABLE_ALIAS=>$bLeftJoin)
			{
				if($bLeftJoin)
				{
					if($logic == "OR")
						$arJoins[$TABLE_ALIAS] |= true;
					else
						$arJoins[$TABLE_ALIAS] &= true;
				}
				else
				{
					if($logic == "OR")
						$arJoins[$TABLE_ALIAS] |= false;
					else
						$arJoins[$TABLE_ALIAS] &= false;
				}
			}
		}
		else
		{
			$operation = $this->MakeOperation($key);
			$key = mb_strtoupper($operation["FIELD"]);
			$operation = $operation["OPERATION"];

			if(isset($this->fields[$key]))
			{
				$FIELD_NAME = $this->fields[$key]["FIELD_NAME"];
				$FIELD_TYPE = $this->fields[$key]["FIELD_TYPE"];
				//Handle joins logic
				$this->c_joins[$key]++;
				if(
					(
						($operation=="I" || $operation=="E" || $operation=="S" || $operation=="M")
						&& (
							is_scalar($value)
							&& (
								($FIELD_TYPE=="int" && intval($value)==0)
								|| ($FIELD_TYPE=="double" && doubleval($value)==0)
								|| $value == ''
							)
						)
					)
					||
					(
						($operation=="NI" || $operation=="N" || $operation=="NS" || $operation=="NB" || $operation=="NM")
						&& !is_object($value)
						&& (
							is_array($value)
							|| (
								($FIELD_TYPE=="int" && intval($value)!=0)
								|| ($FIELD_TYPE=="double" && doubleval($value)!=0)
								|| ($FIELD_TYPE!="int" && $FIELD_TYPE!="double" && is_scalar($value) && $value <> '')
							)
						)
					)
				)
				{
					if($logic == "OR")
						$arJoins[$this->fields[$key]["TABLE_ALIAS"]] |= true;
					else
						$arJoins[$this->fields[$key]["TABLE_ALIAS"]] &= true;
				}
				else
				{
					if($logic == "OR")
						$arJoins[$this->fields[$key]["TABLE_ALIAS"]] |= false;
					else
						$arJoins[$this->fields[$key]["TABLE_ALIAS"]] &= false;
				}

				switch($FIELD_TYPE)
				{
					case "file":
					case "enum":
					case "int":
						$this->addIntFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value);
						break;
					case "double":
						$this->addFloatFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value);
						break;
					case "string":
						$this->addStringFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value);
						break;
					case "date":
					case "datetime":
						if($FIELD_TYPE == "date" || $this->fields[$key]["USER_TYPE_ID"] == "date")
						{
							$this->addDateFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value, "SHORT");
						}
						else
						{
							$this->addDateFilter($result, $this->fields[$key]["MULTIPLE"] === "Y", $FIELD_NAME, $operation, $value, "FULL");
						}
						break;
					case "callback":
						$res = call_user_func_array($this->fields[$key]["CALLBACK"], array(
							$FIELD_NAME,
							$operation,
							$value,
						));
						if($res <> '')
						{
							$result[] = $res;
						}
						break;
				}
			}
		}
	}

	if(!empty($result))
		return "n".str_repeat("t", $level).($inverted ? 'NOT (' : '').implode("n".str_repeat("t", $level).$logic." ", $result).($inverted ? ')' : '');
	else
		return "";
}