14 public static function GetList($arSelect,
$arFilter, $arOrder, $bGroup, $arNavStartParams =
false)
18 if (!is_array($arSelect))
22 if (
count($arSelect) < 1)
29 if (!is_array($arOrder))
33 if (
count($arOrder) < 1)
42 foreach ($arOrder as $strColumn => $strDirection)
44 $strColumn = mb_strtoupper($strColumn);
45 $strDirection = mb_strtoupper($strDirection) ===
'ASC' ?
'ASC' :
'DESC';
52 case 'COMPONENT_NAME':
54 $arSelect[] = $strColumn;
55 $arQueryOrder[$strColumn] = $strColumn .
' ' . $strDirection;
61 $arSelect[] = $strColumn;
62 $arQueryOrder[$strColumn] = $strColumn .
' ' . $strDirection;
65 case 'MAX_QUERY_TIME':
66 case 'MIN_QUERY_TIME':
67 case 'AVG_QUERY_TIME':
68 case 'SUM_QUERY_TIME':
72 $arSelect[] = $strColumn;
73 $arQueryOrder[$strColumn] = $strColumn .
' ' . $strDirection;
81 foreach ($arSelect as $strColumn)
83 $strColumn = mb_strtoupper($strColumn);
90 case 'COMPONENT_NAME':
93 case 'SELECTED_FIELDS':
95 case 'FETCHED_LENGTH':
96 case 'HAS_BIG_FIELDS':
99 $arQueryGroup[$strColumn] =
's.' . $strColumn;
101 $arQuerySelect[$strColumn] =
's.' . $strColumn;
107 $arQuerySelect[$strColumn] =
's.' . $strColumn;
110 case 'MAX_QUERY_TIME':
111 case 'MIN_QUERY_TIME':
112 case 'AVG_QUERY_TIME':
113 case 'SUM_QUERY_TIME':
116 $arQuerySelect[$strColumn] = mb_substr($strColumn, 0, 3) .
'(s.' . mb_substr($strColumn, 4) .
') ' . $strColumn;
122 $arQuerySelect[$strColumn] =
'COUNT(s.ID) ' . $strColumn;
131 'TABLE_ALIAS' =>
's',
132 'FIELD_NAME' =>
's.HIT_ID',
133 'FIELD_TYPE' =>
'int',
137 'TABLE_ALIAS' =>
's',
138 'FIELD_NAME' =>
's.COMPONENT_ID',
139 'FIELD_TYPE' =>
'int',
143 'TABLE_ALIAS' =>
's',
144 'FIELD_NAME' =>
's.ID',
145 'FIELD_TYPE' =>
'int',
149 'TABLE_ALIAS' =>
's',
150 'FIELD_NAME' =>
's.QUERY_TIME',
151 'FIELD_TYPE' =>
'double',
155 'TABLE_ALIAS' =>
'iss',
156 'FIELD_NAME' =>
'iss.SUGGEST_ID',
157 'FIELD_TYPE' =>
'int',
158 'JOIN' =>
'INNER JOIN b_perf_index_suggest_sql iss on iss.SQL_ID = s.ID',
159 'LEFT_JOIN' =>
'LEFT JOIN b_perf_index_suggest_sql is on is.SQL_ID = s.ID',
162 'TABLE_ALIAS' =>
's',
163 'FIELD_NAME' =>
's.NODE_ID',
164 'FIELD_TYPE' =>
'int',
168 'TABLE_ALIAS' =>
's',
169 'FIELD_NAME' =>
's.SELECTED_ROWS',
170 'FIELD_TYPE' =>
'int',
173 'SELECTED_FIELDS' => [
174 'TABLE_ALIAS' =>
's',
175 'FIELD_NAME' =>
's.SELECTED_FIELDS',
176 'FIELD_TYPE' =>
'int',
180 'TABLE_ALIAS' =>
's',
181 'FIELD_NAME' =>
's.FETCHED_ROWS',
182 'FIELD_TYPE' =>
'int',
185 'FETCHED_LENGTH' => [
186 'TABLE_ALIAS' =>
's',
187 'FIELD_NAME' =>
's.FETCHED_LENGTH',
188 'FIELD_TYPE' =>
'int',
191 'HAS_BIG_FIELDS' => [
192 'TABLE_ALIAS' =>
's',
193 'FIELD_NAME' =>
's.HAS_BIG_FIELDS',
194 'FIELD_TYPE' =>
'string',
199 if (empty($arQuerySelect))
201 $arQuerySelect = [
'ID' =>
's.ID'];
208 $strQueryWhere = $obQueryWhere->GetQuery(
$arFilter);
210 if (is_array($arNavStartParams) && isset($arNavStartParams[
'nOffset']) && isset($arNavStartParams[
'nTopCount']))
215 SELECT ' . implode(
', ', $arQuerySelect) .
'
217 ' . $obQueryWhere->GetJoins() .
'
218 ' . ($strQueryWhere ?
'WHERE ' . $strQueryWhere :
'') .
'
219 ' . ($bGroup ?
'GROUP BY ' . implode(
', ', $arQueryGroup) :
'') .
'
220 ' . (
count($arQueryOrder) ?
'ORDER BY ' . implode(
', ', $arQueryOrder) :
'') .
'
222 $strSql = $sqlHelper->getTopSql($strSql, $arNavStartParams[
'nTopCount'], $arNavStartParams[
'nOffset']);
226 elseif (is_array($arNavStartParams) && ($arNavStartParams[
'nTopCount'] ?? 0) > 0)
228 $strSql =
$DB->TopSQL(
'
229 SELECT ' . implode(
', ', $arQuerySelect) .
'
231 ' . $obQueryWhere->GetJoins() .
'
232 ' . ($strQueryWhere ?
'WHERE ' . $strQueryWhere :
'') .
'
233 ' . ($bGroup ?
'GROUP BY ' . implode(
', ', $arQueryGroup) :
'') .
'
234 ' . (
count($arQueryOrder) ?
'ORDER BY ' . implode(
', ', $arQueryOrder) :
'') .
'
235 ', $arNavStartParams[
'nTopCount']);
238 elseif (is_array($arNavStartParams))
241 SELECT count('x') CNT
243 " . $obQueryWhere->GetJoins() .
'
244 ' . ($strQueryWhere ?
'WHERE ' . $strQueryWhere :
'') .
'
245 ' . ($bGroup ?
'GROUP BY ' . implode(
', ', $arQueryGroup) :
'') .
'
247 $res_cnt =
$DB->Query($strSql);
248 $ar_cnt = $res_cnt->Fetch();
251 SELECT ' . implode(
', ', $arQuerySelect) .
'
253 ' . $obQueryWhere->GetJoins() .
'
254 ' . ($strQueryWhere ?
'WHERE ' . $strQueryWhere :
'') .
'
255 ' . ($bGroup ?
'GROUP BY ' . implode(
', ', $arQueryGroup) :
'') .
'
256 ' . (
count($arQueryOrder) ?
'ORDER BY ' . implode(
', ', $arQueryOrder) :
'') .
'
258 $res =
new CDBResult();
259 $res->NavQuery($strSql, $ar_cnt[
'CNT'], $arNavStartParams);
264 SELECT ' . implode(
', ', $arQuerySelect) .
'
266 ' . $obQueryWhere->GetJoins() .
'
267 ' . ($strQueryWhere ?
'WHERE ' . $strQueryWhere :
'') .
'
268 ' . ($bGroup ?
'GROUP BY ' . implode(
', ', $arQueryGroup) :
'') .
'
269 ' . (
count($arQueryOrder) ?
'ORDER BY ' . implode(
', ', $arQueryOrder) :
'') .
'
291 $strSql = preg_replace(
"/[\\n\\r\\t ]+/",
' ', $strSql);
292 $strSql = preg_replace(
'/^ +/',
'', $strSql);
293 $strSql = preg_replace(
'/ (INNER JOIN|OUTER JOIN|LEFT JOIN|SET|LIMIT) /i',
"\n\\1 ", $strSql);
294 $strSql = preg_replace(
'/(INSERT INTO [A-Z_0-9]+?)\\s/i',
"\\1\n", $strSql);
295 $strSql = preg_replace(
'/(INSERT INTO [A-Z_0-9]+?)([(])/i',
"\\1\n\\2", $strSql);
296 $strSql = preg_replace(
'/([\\s)])(VALUES)([\\s(])/i',
"\\1\n\\2\n\\3", $strSql);
297 $strSql = preg_replace(
'/ (FROM|WHERE|ORDER BY|GROUP BY|HAVING) /i',
"\n\\1\n", $strSql);
300 if (preg_match(
'/.*WHERE(.+)\\s(ORDER BY|GROUP BY|HAVING|$)/is', $strSql .
' ', $arMatch))
302 $strWhere = $arMatch[1];
303 $len = mb_strlen($strWhere);
306 for (
$i = 0;
$i < $len;
$i++)
308 $char = mb_substr($strWhere,
$i, 1);
320 if (preg_match(
'/^(\\s)(AND|OR|NOT)([\\s(])/is', mb_substr($strWhere,
$i), $match))
322 $char =
"\n " . $match[2];
323 $i += mb_strlen($match[1] . $match[2]) - 1;
328 $strSql = str_replace($arMatch[1],
$res, $strSql);
331 if (preg_match(
'/.*?SELECT(.+)\\s(FROM)/is', $strSql .
' ', $arMatch))
333 $strWhere = $arMatch[1];
334 $len = mb_strlen($strWhere);
337 for (
$i = 0;
$i < $len;
$i++)
339 $char = mb_substr($strWhere,
$i, 1);
348 elseif ($group === 0 && $char ===
',')
350 $char =
"\n " . $char;
354 $strSql = str_replace($arMatch[1],
$res, $strSql);
357 if (preg_match(
'/.*?UPDATE\\s.+?\\sSET\\s(.+?)WHERE/is', $strSql .
' ', $arMatch))
359 $strWhere = $arMatch[1];
360 $len = mb_strlen($strWhere);
363 for (
$i = 0;
$i < $len;
$i++)
365 $char = mb_substr($strWhere,
$i, 1);
374 elseif ($group === 0 && $char ===
',')
376 $char =
"\n " . $char;
380 $strSql = str_replace($arMatch[1],
$res, $strSql);