• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/sqlwhere.php
  • Класс: CAllSQLWhere
  • Вызов: CAllSQLWhere::addStringFilter
public function addStringFilter(&$result, $isMultiple, $FIELD_NAME, $operation, $value)
{
	global $DB;

	if (is_array($value))
	{
		$FIELD_VALUE = array();
		if ($operation=="S" || $operation=="NS")
		{
			foreach ($value as $val)
				$FIELD_VALUE[] = $this->ForLIKE(mb_strtoupper((string)$val));
		}
		else
		{
			foreach ($value as $val)
				$FIELD_VALUE[] = $DB->ForSQL((string)$val);
		}
	}
	elseif (is_object($value))
	{
		$FIELD_VALUE = $value;
	}
	else
	{
		if ($operation=="S" || $operation=="NS")
			$FIELD_VALUE = $this->ForLIKE(mb_strtoupper((string)$value));
		else
			$FIELD_VALUE = $DB->ForSQL((string)$value);
	}

	switch ($operation)
	{
	case "I":
		if (is_array($FIELD_VALUE))
		{
			$result[] = $this->_StringIN($FIELD_NAME, $FIELD_VALUE);
			if ($isMultiple)
				$this->bDistinctReqired = true;
		}
		elseif (is_object($FIELD_VALUE))
		{
			$result[] = $this->_ExprEQ($FIELD_NAME, $FIELD_VALUE);
		}
		elseif ($FIELD_VALUE == '')
			$result[] = $this->_Empty($FIELD_NAME);
		else
			$result[] = $this->_StringEQ($FIELD_NAME, $FIELD_VALUE);
		break;
	case "E":
		if (is_array($FIELD_VALUE))
			$result[] = "(".$this->_Upper($FIELD_NAME)." like upper('".implode("') OR ".$this->_Upper($FIELD_NAME)." like upper('", $FIELD_VALUE)."'))";
		elseif (is_object($FIELD_VALUE))
			$result[] = $this->_ExprEQ($FIELD_NAME, $FIELD_VALUE);
		elseif($FIELD_VALUE == '')
			$result[] = $this->_Empty($FIELD_NAME);
		else
		{
			//kinda optimization for digits only
			if (preg_match("/[^0-9]/", $FIELD_VALUE))
				$result[] = $this->_Upper($FIELD_NAME)." like upper('".$FIELD_VALUE."')";
			else
				$result[] = $this->_StringEQ($FIELD_NAME, $FIELD_VALUE);
		}

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "S":
		if (is_array($FIELD_VALUE))
			$result[] = "(".$this->_Upper($FIELD_NAME)." like '%".implode("%' ESCAPE '!' OR ".$this->_Upper($FIELD_NAME)." like '%", $FIELD_VALUE)."%' ESCAPE '!')";
		elseif (is_object($FIELD_VALUE))
			$result[] = $this->_Upper($FIELD_NAME)." like ".$FIELD_VALUE->compile()." ESCAPE '!'";
		elseif ($FIELD_VALUE == '')
			$result[] = $this->_Empty($FIELD_NAME);
		else
			$result[] = $this->_Upper($FIELD_NAME)." like '%".$FIELD_VALUE."%' ESCAPE '!'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "M":
		if (is_array($FIELD_VALUE))
			$result[] = "(".$FIELD_NAME." like '".implode("' OR ".$FIELD_NAME." like '", $FIELD_VALUE)."')";
		elseif (is_object($FIELD_VALUE))
			$result[] = $this->_ExprEQ($FIELD_NAME, $FIELD_VALUE);
		elseif ($FIELD_VALUE == '')
			$result[] = $this->_Empty($FIELD_NAME);
		else
		{
			//kinda optimization for digits only
			if (preg_match("/[^0-9]/", $FIELD_VALUE))
				$result[] = $FIELD_NAME." like '".$FIELD_VALUE."'";
			else
				$result[] = $this->_StringEQ($FIELD_NAME, $FIELD_VALUE);
		}

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "NI":
		if (is_array($FIELD_VALUE))
			$result[] = $this->_StringNotIN($FIELD_NAME, $FIELD_VALUE);
		elseif (is_object($FIELD_VALUE))
			$result[] = $this->_ExprNotEQ($FIELD_NAME, $FIELD_VALUE);
		elseif ($FIELD_VALUE == '')
			$result[] = $this->_NotEmpty($FIELD_NAME);
		else
			$result[] = $this->_StringNotEQ($FIELD_NAME, $FIELD_VALUE);

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "N":
		if (is_array($FIELD_VALUE))
			$result[] = "(".$this->_Upper($FIELD_NAME)." not like upper('".implode("') AND ".$this->_Upper($FIELD_NAME)." not like upper('", $FIELD_VALUE)."'))";
		elseif (is_object($FIELD_VALUE))
			$result[] = $this->_Upper($FIELD_NAME)." not like ".$FIELD_VALUE->compile();
		elseif ($FIELD_VALUE == '')
			$result[] = $this->_NotEmpty($FIELD_NAME);
		else
			$result[] = $this->_Upper($FIELD_NAME)." not like upper('".$FIELD_VALUE."')";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "NS":
		if (is_array($FIELD_VALUE))
			$result[] = "(".$this->_Upper($FIELD_NAME)." not like '%".implode("%' ESCAPE '!' AND ".$this->_Upper($FIELD_NAME)." not like '%", $FIELD_VALUE)."%' ESCAPE '!')";
		elseif (is_object($FIELD_VALUE))
			$result[] = $this->_Upper($FIELD_NAME)." not like ".$FIELD_VALUE->compile();
		elseif ($FIELD_VALUE == '')
			$result[] = $this->_NotEmpty($FIELD_NAME);
		else
			$result[] = $this->_Upper($FIELD_NAME)." not like '%".$FIELD_VALUE."%' ESCAPE '!'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "NM":
		if(is_array($FIELD_VALUE))
			$result[] = "(".$FIELD_NAME." not like '".implode("' AND ".$FIELD_NAME." not like '", $FIELD_VALUE)."')";
		elseif (is_object($FIELD_VALUE))
			$result[] = $FIELD_NAME." not like ".$FIELD_VALUE->compile();
		elseif ($FIELD_VALUE == '')
			$result[] = $this->_NotEmpty($FIELD_NAME);
		else
			$result[] = $FIELD_NAME." not like '".$FIELD_VALUE."'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "G":
		if (is_array($FIELD_VALUE))
			$result[] = $FIELD_NAME." > '".$FIELD_VALUE[0]."'";
		elseif (is_object($FIELD_VALUE))
			$result[] = $FIELD_NAME." > ".$FIELD_VALUE->compile();
		else
			$result[] = $FIELD_NAME." > '".$FIELD_VALUE."'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "L":
		if (is_array($FIELD_VALUE))
			$result[] = $FIELD_NAME." < '".$FIELD_VALUE[0]."'";
		elseif (is_object($FIELD_VALUE))
			$result[] = $FIELD_NAME." < ".$FIELD_VALUE->compile();
		else
			$result[] = $FIELD_NAME." < '".$FIELD_VALUE."'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "GE":
		if (is_array($FIELD_VALUE))
			$result[] = $FIELD_NAME." >= '".$FIELD_VALUE[0]."'";
		elseif (is_object($FIELD_VALUE))
			$result[] = $FIELD_NAME." >= ".$FIELD_VALUE->compile();
		else
			$result[] = $FIELD_NAME." >= '".$FIELD_VALUE."'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "LE":
		if (is_array($FIELD_VALUE))
			$result[] = $FIELD_NAME." <= '".$FIELD_VALUE[0]."'";
		elseif (is_object($FIELD_VALUE))
			$result[] = $FIELD_NAME." <= ".$FIELD_VALUE->compile();
		else
			$result[] = $FIELD_NAME." <= '".$FIELD_VALUE."'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "B":
		if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
			$result[] = $FIELD_NAME." between '".$FIELD_VALUE[0]."' AND '".$FIELD_VALUE[1]."'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "NB":
		if (is_array($FIELD_VALUE) && count($FIELD_VALUE) > 1)
			$result[] = $FIELD_NAME." not between '".$FIELD_VALUE[0]."' AND '".$FIELD_VALUE[1]."'";

		if ($isMultiple)
			$this->bDistinctReqired = true;
		break;
	case "?":
		if (is_scalar($FIELD_VALUE) && mb_strlen($FIELD_VALUE))
		{
			$q = GetFilterQuery($FIELD_NAME, $FIELD_VALUE);
			// Check if error ("0" was returned)
			if ($q !== '0')
				$result[] = $q;
		}
		break;
	case "IN":
		if(is_object($FIELD_VALUE))
			$result[] = $FIELD_NAME." IN (".$FIELD_VALUE->compile().")";
		elseif(is_array($FIELD_VALUE))
			$result[] = $FIELD_NAME." IN ('".implode("', '", $FIELD_VALUE)."')";
		else
			$result[] = $FIELD_NAME." IN ('".$FIELD_VALUE."')";
		break;
	case "NIN":
		if(is_object($FIELD_VALUE))
			$result[] = $FIELD_NAME." NOT IN (".$FIELD_VALUE->compile().")";
		elseif(is_array($FIELD_VALUE))
			$result[] = $FIELD_NAME." NOT IN ('".implode("', '", $FIELD_VALUE)."')";
		else
			$result[] = $FIELD_NAME." NOT IN ('".$FIELD_VALUE."')";
		break;
	case "FT":
	case "FTI":
		$part = $this->match($FIELD_NAME, $value, ($operation == "FT"));
		if($part <> '')
		{
			$result[] = $part;

			if ($isMultiple)
				$this->bDistinctReqired = true;
		}
		break;
	case "FTL":
		$part = $this->matchLike($FIELD_NAME, $value);
		if($part <> '')
		{
			$result[] = $part;

			if ($isMultiple)
				$this->bDistinctReqired = true;
		}
		break;
	}
}