PageRenderTime 28ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/perfmon/classes/general/component.php

https://gitlab.com/alexprowars/bitrix
PHP | 296 lines | 281 code | 14 blank | 1 comment | 36 complexity | a9e6c97d8be8f274e5e6792be650b491 MD5 | raw file
  1. <?php
  2. class CPerfomanceComponent
  3. {
  4. public static function GetList($arOrder, $arFilter, $bGroup, $arNavStartParams, $arSelect)
  5. {
  6. global $DB;
  7. if (!is_array($arSelect))
  8. $arSelect = array();
  9. if (count($arSelect) < 1)
  10. $arSelect = array(
  11. "ID",
  12. );
  13. if (!is_array($arOrder))
  14. $arOrder = array();
  15. if (count($arOrder) < 1)
  16. $arOrder = array(
  17. "HIT_ID" => "DESC",
  18. "NN" => "ASC",
  19. );
  20. $arQueryOrder = array();
  21. foreach ($arOrder as $strColumn => $strDirection)
  22. {
  23. $strColumn = mb_strtoupper($strColumn);
  24. if (preg_match("/^(MIN|MAX|AVG|SUM)_(.*)$/", $strColumn, $arMatch))
  25. {
  26. $strGroupFunc = $arMatch[1];
  27. $strColumn = $arMatch[2];
  28. }
  29. else
  30. {
  31. $strGroupFunc = "";
  32. }
  33. $strDirection = mb_strtoupper($strDirection) == "ASC"? "ASC": "DESC";
  34. switch ($strColumn)
  35. {
  36. case "ID":
  37. case "HIT_ID":
  38. case "NN":
  39. case "CACHE_TYPE":
  40. case "COMPONENT_NAME":
  41. if ($strGroupFunc == "")
  42. {
  43. $arSelect[] = $strColumn;
  44. $arQueryOrder[$strColumn] = $strColumn." ".$strDirection;
  45. }
  46. break;
  47. case "CACHE_SIZE":
  48. case "CACHE_COUNT_R":
  49. case "CACHE_COUNT_W":
  50. case "CACHE_COUNT_C":
  51. case "COMPONENT_TIME":
  52. case "QUERIES":
  53. case "QUERIES_TIME":
  54. if ($strGroupFunc == "")
  55. {
  56. if (!$bGroup)
  57. {
  58. $arSelect[] = $strColumn;
  59. $arQueryOrder[$strColumn] = $strColumn." ".$strDirection;
  60. }
  61. }
  62. else
  63. {
  64. if ($bGroup)
  65. {
  66. $arSelect[] = $strColumn;
  67. $arQueryOrder[$strGroupFunc."_".$strColumn] = $strGroupFunc."_".$strColumn." ".$strDirection;
  68. }
  69. }
  70. break;
  71. case "COUNT":
  72. if ($bGroup)
  73. {
  74. $arSelect[] = $strColumn;
  75. $arQueryOrder[$strColumn] = $strColumn." ".$strDirection;
  76. }
  77. break;
  78. }
  79. }
  80. $arQueryGroup = array();
  81. $arQuerySelect = array();
  82. foreach ($arSelect as $strColumn)
  83. {
  84. $strColumn = mb_strtoupper($strColumn);
  85. if (preg_match("/^(MIN|MAX|AVG|SUM)_(.*)$/", $strColumn, $arMatch))
  86. {
  87. $strGroupFunc = $arMatch[1];
  88. $strColumn = $arMatch[2];
  89. }
  90. else
  91. {
  92. $strGroupFunc = "";
  93. }
  94. switch ($strColumn)
  95. {
  96. case "ID":
  97. case "HIT_ID":
  98. case "NN":
  99. case "CACHE_TYPE":
  100. case "COMPONENT_NAME":
  101. if ($strGroupFunc == "")
  102. {
  103. if ($bGroup)
  104. $arQueryGroup[$strColumn] = "c.".$strColumn;
  105. $arQuerySelect[$strColumn] = "c.".$strColumn;
  106. }
  107. break;
  108. case "CACHE_SIZE":
  109. case "CACHE_COUNT_R":
  110. case "CACHE_COUNT_W":
  111. case "CACHE_COUNT_C":
  112. case "COMPONENT_TIME":
  113. case "QUERIES":
  114. case "QUERIES_TIME":
  115. if ($strGroupFunc == "")
  116. {
  117. if (!$bGroup)
  118. $arQuerySelect[$strColumn] = "c.".$strColumn;
  119. }
  120. else
  121. {
  122. if ($bGroup)
  123. $arQuerySelect[$strGroupFunc."_".$strColumn] = $strGroupFunc."(c.".$strColumn.") ".$strGroupFunc."_".$strColumn;
  124. }
  125. break;
  126. case "CACHE_COUNT":
  127. if ($strGroupFunc == "")
  128. {
  129. if (!$bGroup)
  130. $arQuerySelect[$strColumn] = "(c.CACHE_COUNT_R + c.CACHE_COUNT_W + c.CACHE_COUNT_C) CACHE_COUNT";
  131. }
  132. else
  133. {
  134. if ($bGroup)
  135. $arQuerySelect[$strGroupFunc."_".$strColumn] = $strGroupFunc."(c.CACHE_COUNT_R + c.CACHE_COUNT_W + c.CACHE_COUNT_C) ".$strGroupFunc."_".$strColumn;
  136. }
  137. break;
  138. case "COUNT":
  139. if ($strGroupFunc == "" && $bGroup)
  140. {
  141. $arQuerySelect[$strColumn] = "COUNT(c.ID) ".$strColumn;
  142. }
  143. break;
  144. }
  145. }
  146. $obQueryWhere = new CSQLWhere;
  147. static $arWhereFields = array(
  148. "HIT_ID" => array(
  149. "TABLE_ALIAS" => "c",
  150. "FIELD_NAME" => "c.HIT_ID",
  151. "FIELD_TYPE" => "int", //int, double, file, enum, int, string, date, datetime
  152. "JOIN" => false,
  153. //"LEFT_JOIN" => "lt",
  154. ),
  155. "COMPONENT_NAME" => array(
  156. "TABLE_ALIAS" => "c",
  157. "FIELD_NAME" => "c.COMPONENT_NAME",
  158. "FIELD_TYPE" => "string",
  159. "JOIN" => false,
  160. ),
  161. "ID" => array(
  162. "TABLE_ALIAS" => "c",
  163. "FIELD_NAME" => "c.ID",
  164. "FIELD_TYPE" => "int",
  165. "JOIN" => false,
  166. ),
  167. "CACHE_TYPE" => array(
  168. "TABLE_ALIAS" => "c",
  169. "FIELD_NAME" => "c.CACHE_TYPE",
  170. "FIELD_TYPE" => "string",
  171. "JOIN" => false,
  172. ),
  173. "CACHE_SIZE" => array(
  174. "TABLE_ALIAS" => "c",
  175. "FIELD_NAME" => "c.CACHE_SIZE",
  176. "FIELD_TYPE" => "int",
  177. "JOIN" => false,
  178. ),
  179. "QUERIES" => array(
  180. "TABLE_ALIAS" => "c",
  181. "FIELD_NAME" => "c.QUERIES",
  182. "FIELD_TYPE" => "int",
  183. "JOIN" => false,
  184. ),
  185. "HIT_SCRIPT_NAME" => array(
  186. "TABLE_ALIAS" => "h",
  187. "FIELD_NAME" => "h.SCRIPT_NAME",
  188. "FIELD_TYPE" => "string",
  189. "JOIN" => "INNER JOIN b_perf_hit h on h.ID = c.HIT_ID",
  190. ),
  191. "HIT_IS_ADMIN" => array(
  192. "TABLE_ALIAS" => "h",
  193. "FIELD_NAME" => "h.IS_ADMIN",
  194. "FIELD_TYPE" => "string",
  195. "JOIN" => "INNER JOIN b_perf_hit h on h.ID = c.HIT_ID",
  196. ),
  197. "HIT_CACHE_TYPE" => array(
  198. "TABLE_ALIAS" => "h",
  199. "FIELD_NAME" => "h.CACHE_TYPE",
  200. "FIELD_TYPE" => "string",
  201. "JOIN" => "INNER JOIN b_perf_hit h on h.ID = c.HIT_ID",
  202. ),
  203. "HIT_MENU_RECALC" => array(
  204. "TABLE_ALIAS" => "h",
  205. "FIELD_NAME" => "h.MENU_RECALC",
  206. "FIELD_TYPE" => "int",
  207. "JOIN" => "INNER JOIN b_perf_hit h on h.ID = c.HIT_ID",
  208. ),
  209. );
  210. $obQueryWhere->SetFields($arWhereFields);
  211. if (count($arQuerySelect) < 1)
  212. $arQuerySelect = array("ID" => "c.ID");
  213. $strQueryWhere = $obQueryWhere->GetQuery($arFilter);
  214. $strHaving = "";
  215. if (
  216. $bGroup
  217. && count($arQueryGroup) > 0
  218. && array_key_exists(">COUNT", $arFilter)
  219. )
  220. {
  221. $strHaving = "HAVING COUNT(*) > ".intval($arFilter["COUNT"])."";
  222. }
  223. if (is_array($arNavStartParams) && $arNavStartParams["nTopCount"] > 0)
  224. {
  225. $strSql = $DB->TopSQL("
  226. SELECT ".implode(", ", $arQuerySelect)."
  227. FROM b_perf_component c
  228. ".$obQueryWhere->GetJoins()."
  229. ".($strQueryWhere? "WHERE ".$strQueryWhere: "")."
  230. ".($bGroup? "GROUP BY ".implode(", ", $arQueryGroup): "")."
  231. ".$strHaving."
  232. ".(count($arQueryOrder)? "ORDER BY ".implode(", ", $arQueryOrder): "")."
  233. ", $arNavStartParams["nTopCount"]);
  234. $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  235. }
  236. elseif (is_array($arNavStartParams))
  237. {
  238. $strSql = "
  239. SELECT count('x') CNT
  240. FROM (
  241. SELECT 1 FROM b_perf_component c
  242. ".$obQueryWhere->GetJoins()."
  243. ".($strQueryWhere? "WHERE ".$strQueryWhere: "")."
  244. ".($bGroup? "GROUP BY ".implode(", ", $arQueryGroup): "")."
  245. ".$strHaving."
  246. ) t
  247. ";
  248. $res_cnt = $DB->Query($strSql);
  249. $ar_cnt = $res_cnt->Fetch();
  250. $strSql = "
  251. SELECT ".implode(", ", $arQuerySelect)."
  252. FROM b_perf_component c
  253. ".$obQueryWhere->GetJoins()."
  254. ".($strQueryWhere? "WHERE ".$strQueryWhere: "")."
  255. ".($bGroup? "GROUP BY ".implode(", ", $arQueryGroup): "")."
  256. ".$strHaving."
  257. ".(count($arQueryOrder)? "ORDER BY ".implode(", ", $arQueryOrder): "")."
  258. ";
  259. $res = new CDBResult();
  260. $res->NavQuery($strSql, $ar_cnt["CNT"], $arNavStartParams);
  261. }
  262. else
  263. {
  264. $strSql = "
  265. SELECT ".implode(", ", $arQuerySelect)."
  266. FROM b_perf_component c
  267. ".$obQueryWhere->GetJoins()."
  268. ".($strQueryWhere? "WHERE ".$strQueryWhere: "")."
  269. ".($bGroup? "GROUP BY ".implode(", ", $arQueryGroup): "")."
  270. ".$strHaving."
  271. ".(count($arQueryOrder)? "ORDER BY ".implode(", ", $arQueryOrder): "")."
  272. ";
  273. $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  274. }
  275. return $res;
  276. }
  277. public static function Clear()
  278. {
  279. global $DB;
  280. return $DB->Query("TRUNCATE TABLE b_perf_component");
  281. }
  282. }