• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/classes/general/timeman_report_full.php
  • Класс: CTimeManReportFull
  • Вызов: CTimeManReportFull::PrepareSql
static function PrepareSql(&$arFields, $arOrder, &$arFilter, $arSelectFields = false, $arNavStartParams = false)
{
	global $DB;

	$strSqlSelect = "";
	$strSqlFrom = "";
	$strSqlWhere = "";
	$strSqlGroupBy = "";
	$strSqlOrderBy = "";
	$strSqlLimit = "";
	$arGroupByFunct = array();
	$arAlreadyJoined = array();
	// SELECT -->
	$arFieldsKeys = array_keys($arFields);

	if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && $arSelectFields <> '' && array_key_exists($arSelectFields, $arFields))
			$arSelectFields = array($arSelectFields);

	if (!isset($arSelectFields)
			|| !is_array($arSelectFields)
			|| count($arSelectFields)<=0
			|| in_array("*", $arSelectFields))
	{
		foreach($arFields as $key => $arField)
			{
				if (isset($arField["WHERE_ONLY"])
						&& $arField["WHERE_ONLY"] == "Y")
				{
						continue;
				}

				if ($strSqlSelect <> '')
						$strSqlSelect .= ", ";

				if (($arField["FIELD_TYPE"] ?? '') == "datetime")
				{
						if (($DB->type == "ORACLE" || $DB->type == "MSSQL") && (array_key_exists($key, $arOrder)))
							$strSqlSelect .= $arField["FIELD_NAME"]." as ".$key."_X1, ";

						$strSqlSelect .= $DB->DateToCharFunction($arField["FIELD_NAME"], "FULL")." as ".$key;
				}
				elseif (($arField["FIELD_TYPE"] ?? '') == "date")
				{
						if (($DB->type == "ORACLE" || $DB->type == "MSSQL") && (array_key_exists($key, $arOrder)))
							$strSqlSelect .= $arField["FIELD_NAME"]." as ".$key."_X1, ";

						$strSqlSelect .= $DB->DateToCharFunction($arField["FIELD_NAME"], "SHORT")." as ".$key;
				}
				else
						$strSqlSelect .= $arField["FIELD_NAME"]." as ".$key;

				if (isset($arField["FROM"])
						&& $arField["FROM"] <> ''
						&& !in_array($arField["FROM"], $arAlreadyJoined))
				{
						if ($strSqlFrom <> '')
							$strSqlFrom .= " ";
						$strSqlFrom .= $arField["FROM"];
						$arAlreadyJoined[] = $arField["FROM"];
				}
			}
	}
	else
	{
			foreach ($arSelectFields as $key => $val)
			{
				$val = mb_strtoupper($val);
				$key = mb_strtoupper($key);
				if (array_key_exists($val, $arFields))
				{
						if ($strSqlSelect <> '')
							$strSqlSelect .= ", ";

						if (in_array($key, $arGroupByFunct))
						{
							$strSqlSelect .= $key."(".$arFields[$val]["FIELD_NAME"].") as ".$val;
						}
						else
						{
							if ($arFields[$val]["FIELD_TYPE"] == "datetime")
							{
									if (($DB->type == "ORACLE" || $DB->type == "MSSQL") && (array_key_exists($val, $arOrder)))
										$strSqlSelect .= $arFields[$val]["FIELD_NAME"]." as ".$val."_X1, ";

									$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "FULL")." as ".$val;
							}
							elseif ($arFields[$val]["FIELD_TYPE"] == "date")
							{
									if (($DB->type == "ORACLE" || $DB->type == "MSSQL") && (array_key_exists($val, $arOrder)))
										$strSqlSelect .= $arFields[$val]["FIELD_NAME"]." as ".$val."_X1, ";

									$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD_NAME"], "SHORT")." as ".$val;
							}
							else
									$strSqlSelect .= $arFields[$val]["FIELD_NAME"]." as ".$val;
						}

						if (isset($arFields[$val]["FROM"])
							&& $arFields[$val]["FROM"] <> ''
							&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
						{
							if ($strSqlFrom <> '')
									$strSqlFrom .= " ";
							$strSqlFrom .= $arFields[$val]["FROM"];
							$arAlreadyJoined[] = $arFields[$val]["FROM"];
						}
				}
			}
	}

	// <-- SELECT

	// WHERE -->
	$obWhere = new CSQLWhere;
	$obWhere->SetFields($arFields);
	$strSqlWhere = $obWhere->GetQuery($arFilter);

	// ORDER BY -->
	$arSqlOrder = Array();
	foreach ($arOrder as $by => $order)
	{
		$by = mb_strtoupper($by);
		$order = mb_strtoupper($order);

			if ($order != "ASC")
				$order = "DESC";
			else
				$order = "ASC";

			if (array_key_exists($by, $arFields))
			{
				$arSqlOrder[] = " ".$arFields[$by]["FIELD_NAME"]." ".$order." ";

				if (isset($arFields[$by]["FROM"])
						&& $arFields[$by]["FROM"] <> ''
						&& !in_array($arFields[$by]["FROM"], $arAlreadyJoined))
				{
						if ($strSqlFrom <> '')
							$strSqlFrom .= " ";
						$strSqlFrom .= $arFields[$by]["FROM"];
						$arAlreadyJoined[] = $arFields[$by]["FROM"];
				}
			}
	}

	$strSqlOrderBy = "";
	DelDuplicateSort($arSqlOrder);
	$cnt = count($arSqlOrder);
	for ($i=0; $i<$cnt; $i++)
	{
			if ($strSqlOrderBy <> '')
				$strSqlOrderBy .= ", ";

			if($DB->type == "ORACLE")
			{
				if(mb_substr($arSqlOrder[$i], -3) == "ASC")
						$strSqlOrderBy .= $arSqlOrder[$i]." NULLS FIRST";
				else
						$strSqlOrderBy .= $arSqlOrder[$i]." NULLS LAST";
			}
			else
				$strSqlOrderBy .= $arSqlOrder[$i];
	}
	// <-- ORDER BY

	if (
		is_array($arNavStartParams)
		&& intval($arNavStartParams["nTopCount"] ?? 0) > 0
	)
	{
		$dbType = $DB->type;
		switch ($dbType)
		{
			case "MSSQL":
				$strSqlSelect = "TOP ".$arNavStartParams["nTopCount"]." ".$strSqlSelect;
				break;
			case "ORACLE":
				if($strSqlWhere <> '')
					$strSqlWhere.=" AND ";
				$strSqlWhere.= "ROWNUM<=".$arNavStartParams["nTopCount"];
				break;
			case "MYSQL":
				$strSqlLimit.= "LIMIT ".$arNavStartParams["nTopCount"];
		}
	}

	return array(
			"SELECT" => $strSqlSelect,
			"FROM" => $strSqlFrom,
			"WHERE" => $strSqlWhere,
			"GROUPBY" => $strSqlGroupBy,
			"ORDERBY" => $strSqlOrderBy,
			"LIMIT"=> $strSqlLimit
	);
}