• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/classes/general/mail.php
  • Класс: CAllMailUtil
  • Вызов: CAllMailUtil::FilterCreateEx
static function FilterCreateEx($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty = true)
{
	global $DB;
	if(!is_array($vals))
		$vals=Array($vals);

	if(count($vals)<1)
		return "";

	if(is_bool($cOperationType))
	{
		if($cOperationType===true)
			$cOperationType = "N";
		else
			$cOperationType = "E";
	}

	if($cOperationType=="G")
		$strOperation = ">";
	elseif($cOperationType=="GE")
		$strOperation = ">=";
	elseif($cOperationType=="LE")
		$strOperation = "<=";
	elseif($cOperationType=="L")
		$strOperation = "<";
	else
		$strOperation = "=";

	$bFullJoin = false;
	$bWasLeftJoin = false;

	$res = Array();
	for($i = 0, $n = count($vals); $i < $n; $i++)
	{
		$val = $vals[$i];
		if(!$bSkipEmpty || $val <> '' || (is_bool($val) && $val===false))
		{
			switch ($type)
			{
			case "string_equal":
				if($val == '')
					$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
				else
					$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname).$strOperation.CIBlock::_Upper("'".$DB->ForSql($val)."'").")";
				break;
			case "string":
				if($val == '')
					$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
				else
					if($strOperation=="=")
						$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".($DB->type == "ORACLE"?CIBlock::_Upper($fname)." LIKE ".CIBlock::_Upper("'".$DB->ForSqlLike($val)."'")." ESCAPE '\'" : $fname." ".($strOperation=="="?"LIKE":$strOperation)." '".$DB->ForSqlLike($val)."'").")";
					else
						$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".($DB->type == "ORACLE"?CIBlock::_Upper($fname)." ".$strOperation." ".CIBlock::_Upper("'".$DB->ForSql($val)."'")." " : $fname." ".$strOperation." '".$DB->ForSql($val)."'").")";
				break;
			case "date":
				if($val == '')
					$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
				else
					$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
				break;
			case "number":
				if($val == '')
					$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
				else
					$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".DoubleVal($val)."')";
				break;
			case "number_above":
				if($val == '')
					$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
				else
					$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".$DB->ForSql($val)."')";
				break;
			}

			// INNER JOIN on such conditions
			if($val <> '' && $cOperationType!="N")
				$bFullJoin = true;
			else
				$bWasLeftJoin = true;
		}
	}

	$strResult = "";
	for($i = 0, $n = count($res); $i < $n; $i++)
	{
		if($i>0)
			$strResult .= ($cOperationType=="N"?" AND ":" OR ");
		$strResult .= "(".$res[$i].")";
	}
	if($strResult!="")
		$strResult = "(".$strResult.")";

	if($bFullJoin && $bWasLeftJoin && $cOperationType!="N")
		$bFullJoin = false;

	return $strResult;
}