- Модуль: 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 "";
}