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