1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
suggest.php
См. документацию.
1<?php
2
4{
5 var $_filter_md5 = '';
6 var $_phrase = '';
7
8 public function __construct($strFilterMD5 = '', $phrase = '')
9 {
10 $strFilterMD5 = mb_strtolower($strFilterMD5);
11 if (preg_match('/^[0-9a-f]{32}$/', $strFilterMD5))
12 {
13 $this->_filter_md5 = $strFilterMD5;
14 }
15
16 $phrase = mb_strtolower(trim($phrase, " \t\n\r"));
17 if ($l = mb_strlen($phrase))
18 {
19 if ($l > 250)
20 {
21 $p = mb_strrpos($phrase, ' ');
22 if ($p === false)
23 {
24 $phrase = mb_substr($phrase, 0, 250);
25 }
26 else
27 {
28 $phrase = mb_substr($phrase, 0, $p);
29 }
30 }
31 $this->_phrase = $phrase;
32 }
33 }
34
35 function SetResultCount($result_count)
36 {
37 $DB = CDatabase::GetModuleConnection('search');
38 if (mb_strlen($this->_filter_md5) && mb_strlen($this->_phrase))
39 {
40 $result_count = intval($result_count);
41 $filter_md5 = $DB->ForSQL($this->_filter_md5);
42 $phrase = $DB->ForSQL($this->_phrase, 250);
43
44 $rsQueryStat = $DB->Query("
45 SELECT ID, FILTER_MD5, RATE, round((UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(TIMESTAMP_X))/3600/24) DAYS, RESULT_COUNT
46 FROM b_search_suggest
47 WHERE SITE_ID = '" . SITE_ID . "'
48 AND FILTER_MD5 = '" . $filter_md5 . "'
49 AND PHRASE = '" . $phrase . "'
50 ");
51
52 $arQueryStat = $rsQueryStat->Fetch();
53 if (!$arQueryStat)
54 {
55 $DB->Add('b_search_suggest', [
56 'SITE_ID' => SITE_ID,
57 'FILTER_MD5' => $this->_filter_md5,
58 'PHRASE' => $this->_phrase,
59 'RATE' => 1.0,
60 '~TIMESTAMP_X' => $DB->CurrentTimeFunction(),
61 'RESULT_COUNT' => $result_count,
62 ]);
63 }
64 else
65 {
66 $bUpdate = $result_count != $arQueryStat['RESULT_COUNT'];
67
68 $suggest_save_days = COption::GetOptionInt('search', 'suggest_save_days');
69 if ($suggest_save_days <= 0)
70 {
71 $suggest_save_days = 360;
72 }
73
74 if ($arQueryStat['DAYS'] <= 0)
75 {
76 $rate = $arQueryStat['RATE'];
77 $bUpdate = $bUpdate || false;
78 }
79 elseif ($arQueryStat['DAYS'] >= $suggest_save_days)
80 {
81 $rate = 1.0;
82 $bUpdate = $bUpdate || true;
83 }
84 else
85 {
86 $rate = doubleval($arQueryStat['RATE']) + ($suggest_save_days - $arQueryStat['DAYS']) / $suggest_save_days;
87 $bUpdate = $bUpdate || true;
88 }
89
90 if ($bUpdate)
91 {
92 $DB->Query('
93 UPDATE
94 b_search_suggest
95 SET
96 RESULT_COUNT = ' . $result_count . ',
97 RATE = ' . $rate . ',
98 TIMESTAMP_X = ' . $DB->CurrentTimeFunction() . '
99 WHERE
100 ID = ' . $arQueryStat['ID'] . '
101 ');
102 }
103 }
104
105 while ($arQueryStat = $rsQueryStat->Fetch())
106 {
107 $DB->Query('DELETE FROM b_search_suggest WHERE ID = ' . $arQueryStat['ID']);
108 }
109 }
110 }
111
112 function GetList($nTopCount, $site_id = null)
113 {
114 $DB = CDatabase::GetModuleConnection('search');
115 if (!isset($site_id))
116 {
118 }
119
120 if ($this->_phrase <> '')
121 {
122 $nTopCount = intval($nTopCount);
123 if ($nTopCount <= 0)
124 {
125 $nTopCount = 10;
126 }
127
128 $phrase = $DB->ForSQL($this->_phrase);
129 $site_id = $DB->ForSQL($site_id);
130
131 if ($this->_filter_md5 <> '')
132 {
133 $filter_md5 = $DB->ForSQL($this->_filter_md5, 32);
134 return $DB->Query($DB->TopSql("
135 SELECT PHRASE, RESULT_COUNT CNT, RATE
136 FROM b_search_suggest
137 WHERE SITE_ID = '" . $site_id . "'
138 AND FILTER_MD5 = '" . $filter_md5 . "'
139 AND PHRASE LIKE '" . $phrase . "%'
140 ORDER BY RATE DESC, PHRASE ASC
141 ", $nTopCount));
142 }
143 else
144 {
145 return $DB->Query($DB->TopSql("
146 SELECT PHRASE, max(RESULT_COUNT) CNT, max(RATE) RATE
147 FROM b_search_suggest
148 WHERE SITE_ID = '" . $site_id . "'
149 AND PHRASE LIKE '" . $phrase . "%'
150 GROUP BY PHRASE
151 ORDER BY RATE DESC, PHRASE ASC
152 ", $nTopCount));
153 }
154 }
155 else
156 {
157 return false;
158 }
159 }
160
161 public static function CleanUpAgent()
162 {
163 $DB = CDatabase::GetModuleConnection('search');
164 $cleanup_days = COption::GetOptionInt('search', 'suggest_save_days');
165 if ($cleanup_days > 0)
166 {
167 $arDate = localtime(time());
168 $date = mktime(0, 0, 0, $arDate[4] + 1, $arDate[3] - $cleanup_days, 1900 + $arDate[5]);
169 $DB->Query('DELETE FROM b_search_suggest WHERE TIMESTAMP_X <= ' . $DB->CharToDateFunction(ConvertTimeStamp($date, 'FULL')));
170 }
171 return 'CSearchSuggest::CleanUpAgent();';
172 }
173}
Определения suggest.php:4
__construct($strFilterMD5='', $phrase='')
Определения suggest.php:8
GetList($nTopCount, $site_id=null)
Определения suggest.php:112
static CleanUpAgent()
Определения suggest.php:161
$_filter_md5
Определения suggest.php:5
SetResultCount($result_count)
Определения suggest.php:35
$_phrase
Определения suggest.php:6
$p
Определения group_list_element_edit.php:23
global $DB
Определения cron_frame.php:29
$l
Определения options.php:783
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$site_id
Определения sonet_set_content_view.php:9
const SITE_ID
Определения sonet_set_content_view.php:12