222 $arGroupByFunct =
array(
"COUNT",
"AVG",
"MIN",
"MAX",
"SUM");
224 $arAlreadyJoined =
array();
227 if (is_array($arGroupBy) &&
count($arGroupBy)>0)
229 $arSelectFields = $arGroupBy;
230 foreach ($arGroupBy as
$key =>
$val)
236 if ($strSqlGroupBy <>
'')
237 $strSqlGroupBy .=
", ";
244 if ($strSqlFrom <>
'')
257 if (is_array($arGroupBy) &&
count($arGroupBy)==0)
259 $strSqlSelect =
"COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]][
"FIELD"].
") as CNT ";
263 if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && $arSelectFields <>
'' && array_key_exists($arSelectFields,
$arFields))
264 $arSelectFields =
array($arSelectFields);
266 if (!isset($arSelectFields)
267 || !is_array($arSelectFields)
268 ||
count($arSelectFields)<=0
269 || in_array(
"*", $arSelectFields))
271 foreach ($arFieldsKeys as
$i => $value)
273 if (isset(
$arFields[$arFieldsKeys[
$i]][
"WHERE_ONLY"])
274 &&
$arFields[$arFieldsKeys[
$i]][
"WHERE_ONLY"] ==
"Y")
279 if ($strSqlSelect <>
'')
280 $strSqlSelect .=
", ";
282 if (
$arFields[$arFieldsKeys[
$i]][
"TYPE"] ==
"datetime")
284 if ((
$DB->type ==
"ORACLE" ||
$DB->type ==
"MSSQL") && (array_key_exists($arFieldsKeys[
$i], $arOrder)))
285 $strSqlSelect .=
$arFields[$arFieldsKeys[
$i]][
"FIELD"].
" as ".$arFieldsKeys[
$i].
"_X1, ";
287 $strSqlSelect .=
$DB->DateToCharFunction(
$arFields[$arFieldsKeys[
$i]][
"FIELD"],
"FULL").
" as ".$arFieldsKeys[
$i];
291 if ((
$DB->type ==
"ORACLE" ||
$DB->type ==
"MSSQL") && (array_key_exists($arFieldsKeys[
$i], $arOrder)))
292 $strSqlSelect .=
$arFields[$arFieldsKeys[
$i]][
"FIELD"].
" as ".$arFieldsKeys[
$i].
"_X1, ";
294 $strSqlSelect .=
$DB->DateToCharFunction(
$arFields[$arFieldsKeys[
$i]][
"FIELD"],
"SHORT").
" as ".$arFieldsKeys[
$i];
297 $strSqlSelect .=
$arFields[$arFieldsKeys[
$i]][
"FIELD"].
" as ".$arFieldsKeys[
$i];
301 && !in_array(
$arFields[$arFieldsKeys[
$i]][
"FROM"], $arAlreadyJoined))
303 if ($strSqlFrom <>
'')
305 $strSqlFrom .=
$arFields[$arFieldsKeys[
$i]][
"FROM"];
306 $arAlreadyJoined[] =
$arFields[$arFieldsKeys[
$i]][
"FROM"];
312 foreach ($arSelectFields as
$key =>
$val)
318 if ($strSqlSelect <>
'')
319 $strSqlSelect .=
", ";
321 if (in_array(
$key, $arGroupByFunct))
329 if ((
$DB->type ==
"ORACLE" ||
$DB->type ==
"MSSQL") && (array_key_exists(
$val, $arOrder)))
336 if ((
$DB->type ==
"ORACLE" ||
$DB->type ==
"MSSQL") && (array_key_exists(
$val, $arOrder)))
349 if ($strSqlFrom <>
'')
358 if ($strSqlGroupBy <>
'')
360 if ($strSqlSelect <>
'')
361 $strSqlSelect .=
", ";
362 $strSqlSelect .=
"COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]][
"FIELD"].
") as CNT";
365 $strSqlSelect =
"%%_DISTINCT_%% ".$strSqlSelect;
370 $arSqlSearch = Array();
373 $filter_keys = Array();
380 if (!is_array($vals))
381 $vals =
array($vals);
385 $key = $key_res[
"FIELD"];
386 $strNegative = $key_res[
"NEGATIVE"];
387 $strOperation = $key_res[
"OPERATION"];
388 $strOrNull = $key_res[
"OR_NULL"];
392 $arSqlSearch_tmp =
array();
393 for ($j = 0; $j <
count($vals); $j++)
399 $arSqlSearch_tmp1 = call_user_func_array(
403 if ($arSqlSearch_tmp1 !==
false)
404 $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
410 if ((intval(
$val) == 0) && (mb_strpos($strOperation,
"=") !== False))
411 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND" :
"OR").
" ".(($strNegative ==
"Y") ?
"NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" 0)";
413 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".intval(
$val).
" )";
419 if ((DoubleVal(
$val) == 0) && (mb_strpos($strOperation,
"=") !== False))
420 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND" :
"OR").
" ".(($strNegative ==
"Y") ?
"NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" 0)";
422 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".DoubleVal(
$val).
" )";
426 if ($strOperation ==
"QUERY")
432 if (((
string)
$val ==
'') && (mb_strpos($strOperation,
"=") !== False))
433 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND NOT" :
"OR").
" (".
$DB->Length(
$arFields[
$key][
"FIELD"]).
" <= 0) ".(($strNegative ==
"Y") ?
"AND NOT" :
"OR").
" (".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" '".
$DB->ForSql(
$val).
"' )";
435 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" '".
$DB->ForSql(
$val).
"' )";
440 if ((
string)
$val ==
'')
441 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
"NOT":
"").
"(".
$arFields[
$key][
"FIELD"].
" IS NULL)";
443 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"FULL").
")";
447 if ((
string)
$val ==
'')
448 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
"NOT":
"").
"(".
$arFields[
$key][
"FIELD"].
" IS NULL)";
450 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"SHORT").
")";
459 if ($strSqlFrom <>
'')
465 $strSqlSearch_tmp =
"";
466 for ($j = 0; $j <
count($arSqlSearch_tmp); $j++)
469 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
470 $strSqlSearch_tmp .=
"(".$arSqlSearch_tmp[$j].
")";
472 if ($strOrNull ==
"Y")
474 if ($strSqlSearch_tmp <>
'')
475 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
476 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" IS ".($strNegative==
"Y" ?
"NOT " :
"").
"NULL)";
478 if ($strSqlSearch_tmp <>
'')
479 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
481 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" ".($strNegative==
"Y" ?
"<>" :
"=").
" 0)";
483 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" ".($strNegative==
"Y" ?
"<>" :
"=").
" '')";
486 if ($strSqlSearch_tmp !=
"")
487 $arSqlSearch[] =
"(".$strSqlSearch_tmp.
")";
493 if ($strSqlWhere <>
'')
494 $strSqlWhere .=
" AND ";
495 $strSqlWhere .=
"(".$arSqlSearch[
$i].
")";
500 $arSqlOrder = Array();
501 foreach ($arOrder as $by =>
$order)
503 $by = mb_strtoupper($by);
513 $arSqlOrder[] =
" ".$arFields[$by][
"FIELD"].
" ".
$order.
" ";
517 && !in_array(
$arFields[$by][
"FROM"], $arAlreadyJoined))
519 if ($strSqlFrom <>
'')
522 $arAlreadyJoined[] =
$arFields[$by][
"FROM"];
527 $arSqlOrder[] =
" ".$obUserFieldsSql->GetOrder($by).
" ".
$order.
" ";
535 if ($strSqlOrderBy <>
'')
536 $strSqlOrderBy .=
", ";
538 if(
$DB->type ==
"ORACLE")
540 if(mb_substr($arSqlOrder[
$i], -3) ==
"ASC")
541 $strSqlOrderBy .= $arSqlOrder[
$i].
" NULLS FIRST";
543 $strSqlOrderBy .= $arSqlOrder[
$i].
" NULLS LAST";
546 $strSqlOrderBy .= $arSqlOrder[
$i];
551 "SELECT" => $strSqlSelect,
552 "FROM" => $strSqlFrom,
553 "WHERE" => $strSqlWhere,
554 "GROUPBY" => $strSqlGroupBy,
555 "ORDERBY" => $strSqlOrderBy