202 $strSqlFromWhere =
'';
205 $arGroupByFunct =
array(
"COUNT",
"AVG",
"MIN",
"MAX",
"SUM");
207 $arAlreadyJoined =
array();
210 if (is_array($arGroupBy) && !empty($arGroupBy))
212 $arSelectFields = $arGroupBy;
213 foreach ($arGroupBy as
$key =>
$val)
219 if ($strSqlGroupBy <>
'')
220 $strSqlGroupBy .=
", ";
227 if ($strSqlFrom <>
'')
240 if (is_array($arGroupBy) && empty($arGroupBy))
242 $strSqlSelect =
"COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]][
"FIELD"].
") as CNT ";
246 if (isset($arSelectFields) && is_string($arSelectFields) && $arSelectFields <>
'' && array_key_exists($arSelectFields,
$arFields))
247 $arSelectFields =
array($arSelectFields);
249 if (empty($arSelectFields) || !is_array($arSelectFields))
251 self::PrepareDefaultFields(
$arFields, $arAlreadyJoined, $strSqlSelect, $strSqlFrom);
255 foreach ($arSelectFields as
$key =>
$val)
259 self::PrepareDefaultFields(
$arFields, $arAlreadyJoined, $strSqlSelect, $strSqlFrom);
270 if (in_array(
$key, $arGroupByFunct))
272 if ($strSqlSelect <>
'')
273 $strSqlSelect .=
", ";
281 self::AddToFrom(
$arFields[
$val], $arAlreadyJoined, $strSqlFrom);
285 if($strSqlGroupBy ===
'')
287 $strSqlSelect =
"%%_DISTINCT_%% ".$strSqlSelect;
291 if ($strSqlSelect <>
'')
292 $strSqlSelect .=
", ";
293 $strSqlSelect .=
"COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]][
"FIELD"].
") as CNT";
302 foreach($arJoins as $join)
309 if ($strSqlFromWhere !==
'')
311 $strSqlFromWhere .=
' ';
313 $strSqlFromWhere .= $join;
315 if(!in_array($join, $arAlreadyJoined))
317 if ($strSqlFrom !==
'')
322 $strSqlFrom .= $join;
323 $arAlreadyJoined[] = $join;
329 $arSqlOrder =
array();
332 foreach ($arOrder as $by =>
$order)
334 $by = mb_strtoupper($by);
362 $arSqlOrder[] =
"-".$arFields[$by][
"FIELD"].
" DESC";
370 && !in_array(
$arFields[$by][
"FROM"], $arAlreadyJoined))
372 if ($strSqlFrom <>
'')
375 $arAlreadyJoined[] =
$arFields[$by][
"FROM"];
382 $sqlOrderQty =
count($arSqlOrder);
383 for (
$i = 0;
$i < $sqlOrderQty;
$i++)
385 if ($strSqlOrderBy <>
'')
386 $strSqlOrderBy .=
", ";
388 $strSqlOrderBy .= $arSqlOrder[
$i];
393 "SELECT" => $strSqlSelect,
394 "FROM" => $strSqlFrom,
395 "WHERE" => $strSqlWhere,
396 "FROM_WHERE" => $strSqlFromWhere,
397 "GROUPBY" => $strSqlGroupBy,
398 "ORDERBY" => $strSqlOrderBy
405 $arSqlSearch = Array();
410 foreach (
$arFilter as $filterKey => $vals)
412 if (!is_array($vals))
413 $vals =
array($vals);
415 if(str_starts_with($filterKey,
'__INNER_FILTER'))
418 if(is_string($innerFilterSql) && $innerFilterSql !==
'')
420 $arSqlSearch[] =
'('.$innerFilterSql.
')';
426 $key = $key_res[
"FIELD"];
427 $strNegative = $key_res[
"NEGATIVE"];
428 $strOperation = $key_res[
"OPERATION"];
429 $strOrNull = $key_res[
"OR_NULL"];
433 $arSqlSearch_tmp =
array();
437 if ($strOperation ==
"IN")
441 $arSqlSearch_tmp1 = call_user_func_array(
445 if ($arSqlSearch_tmp1 !==
false)
446 $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
458 $vals = array_unique($vals);
459 $val = implode(
",", $vals);
462 $arSqlSearch_tmp[] =
"(1 = 2)";
464 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" IN (".
$val.
"))";
471 $item = (float)$item;
474 $vals = array_unique($vals);
475 $val = implode(
",", $vals);
478 $arSqlSearch_tmp[] =
"(1 = 2)";
480 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
487 $item =
"'".$GLOBALS[
"DB"]->ForSql($item).
"'";
490 $vals = array_unique($vals);
491 $val = implode(
",", $vals);
494 $arSqlSearch_tmp[] =
"(1 = 2)";
496 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
503 $item =
$GLOBALS[
"DB"]->CharToDateFunction($item,
"FULL");
506 $vals = array_unique($vals);
507 $val = implode(
",", $vals);
510 $arSqlSearch_tmp[] =
"1 = 2";
512 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
519 $item =
$GLOBALS[
"DB"]->CharToDateFunction($item,
"SHORT");
522 $vals = array_unique($vals);
523 $val = implode(
",", $vals);
526 $arSqlSearch_tmp[] =
"1 = 2";
528 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
534 foreach ($vals as
$val)
538 $arSqlSearch_tmp1 = call_user_func_array(
542 if ($arSqlSearch_tmp1 !==
false)
543 $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
549 if ($strOperation ===
"QUERY" && $fieldType !==
"string" && $fieldType !==
"char")
555 if (($strOperation ===
"LIKE" || $strOperation ===
"RLIKE" || $strOperation ===
"LLIKE")
556 && ($fieldType ===
"int" || $fieldType ===
"double"))
562 if ($fieldType ===
"int")
564 if ((intval(
$val) === 0) && (str_contains($strOperation,
"=")))
565 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND" :
"OR").
" ".(($strNegative ==
"Y") ?
"NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" 0)";
568 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".intval(
$val).
" )";
571 elseif ($fieldType ===
"double")
575 if ((doubleval(
$val) == 0) && (str_contains($strOperation,
"=")))
576 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND" :
"OR").
" ".(($strNegative ==
"Y") ?
"NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" 0)";
578 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".DoubleVal(
$val).
" )";
580 elseif ($fieldType ===
"string" || $fieldType ===
"char")
582 if ($strOperation ===
"QUERY")
588 if ((
$val ==
'') && (str_contains($strOperation,
"=")))
590 $arSqlSearch_tmp[] =
"(".$fieldName.
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND NOT" :
"OR").
" (".
$DB->Length($fieldName).
" <= 0) ".(($strNegative ==
"Y") ?
"AND NOT" :
"OR").
" (".$fieldName.
" ".$strOperation.
" '".
$DB->ForSql(
$val).
"' )";
594 if($strOperation ===
"LIKE")
597 $arSqlSearch_tmp[] =
"({$fieldName} IS NULL OR {$fieldName} = '')";
599 $arSqlSearch_tmp[] = $fieldName.
" LIKE '%".self::ForLike(
$val).
"%' ESCAPE '!'";
602 elseif($strOperation ===
"RLIKE" || $strOperation ===
"LLIKE")
605 $arSqlSearch_tmp[] =
"({$fieldName} IS NULL OR {$fieldName} = '')";
607 $arSqlSearch_tmp[] = $fieldName.
" LIKE '".
$DB->ForSql(
$val).
"'";
609 elseif($strOperation ===
"FT" || $strOperation ===
"FTI" || $strOperation ===
"FTL")
612 $queryWhere->SetFields(
615 'FIELD_NAME' => $fieldName,
616 'FIELD_TYPE' =>
'string',
625 $arSqlSearch_tmp[] =
$query;
629 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$fieldName.
" IS NULL OR NOT " :
"").
"(".$fieldName.
" ".$strOperation.
" '".
$DB->ForSql(
$val).
"' )";
633 elseif ($fieldType ===
"datetime")
635 if(!in_array($strOperation,
array(
'=',
'<',
'>',
'<=',
'>='),
true))
641 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
"NOT":
"").
"(".
$arFields[
$key][
"FIELD"].
" IS NULL)";
643 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".
$DB->GetNowFunction().
")";
645 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"FULL").
")";
647 elseif ($fieldType ===
"date")
649 if(!in_array($strOperation,
array(
'=',
'<',
'>',
'<=',
'>='),
true))
655 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
"NOT":
"").
"(".
$arFields[
$key][
"FIELD"].
" IS NULL)";
657 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"SHORT").
")";
671 $strSqlSearch_tmp =
"";
672 $sqlSearchQty =
count($arSqlSearch_tmp);
673 for ($j = 0; $j < $sqlSearchQty; $j++)
676 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
677 $strSqlSearch_tmp .= self::AddBrackets($arSqlSearch_tmp[$j]);
679 if ($strOrNull ==
"Y")
681 if ($strSqlSearch_tmp <>
'')
682 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
683 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" IS ".($strNegative==
"Y" ?
"NOT " :
"").
"NULL)";
687 if ($strSqlSearch_tmp <>
'')
688 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
689 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" ".($strNegative==
"Y" ?
"<>" :
"=").
" 0)";
693 if ($strSqlSearch_tmp <>
'')
694 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
695 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" ".($strNegative==
"Y" ?
"<>" :
"=").
" '')";
699 if ($strSqlSearch_tmp !=
"")
701 $arSqlSearch[] = $strSqlSearch_tmp;
710 if($logic !==
'AND' && $logic !==
'OR')
718 foreach ($arSqlSearch as $searchItem)
720 if($searchItem ===
'')
725 if ($strSqlWhere !==
'')
726 $strSqlWhere .= $logic;
728 $strSqlWhere .=
"($searchItem)";