r449: Need to cache customfield_bit.tpl
[bugdar.git] / search.php
1 <?php
2 /*=====================================================================*\
3 || ################################################################### ||
4 || # BugStrike [#]version[#]
5 || # --------------------------------------------------------------- # ||
6 || # Copyright ©2002-[#]year[#] by Iris Studios, Inc. All Rights Reserved. # ||
7 || # This file may not be reproduced in any way without permission. # ||
8 || # --------------------------------------------------------------- # ||
9 || # User License Agreement at http://www.iris-studios.com/license/ # ||
10 || ################################################################### ||
11 \*=====================================================================*/
12
13 $fetchtemplates = array(
14 'search',
15 'pcv_select_row',
16 'search_results',
17 'trackerhome_bits',
18 'customfield_bit'
19 );
20
21 define('SVN', '$Id$');
22
23 $focus['search'] = 'focus';
24
25 require_once('./global.php');
26
27 if (!can_perform('cansearch'))
28 {
29 $message->error_permission();
30 }
31
32 define('MODE', intval($bugsys->in['mode']));
33 define('MODE_ANY', ((MODE == 1) ? 1 : 0));
34 define('MODE_ALL', ((MODE == 2) ? 1 : 0));
35 define('MODE_RAW', ((MODE == 3) ? 1 : 0));
36
37 define('SEARCH_WORD_MIN', 3);
38
39 $show['search'] = true;
40
41 // ###################################################################
42
43 if (empty($_REQUEST['do']))
44 {
45 $_REQUEST['do'] = 'search';
46 }
47
48 // ###################################################################
49
50 if ($_REQUEST['do'] == 'process')
51 {
52 // -------------------------------------------------------------------
53 // parse out our product/component/version
54 $pcv = parse_pcv_select($bugsys->in['pcv_select']);
55
56 // -------------------------------------------------------------------
57 // handle keywords
58 if ($bugsys->in['summary'])
59 {
60 $keywords = preg_split('#\s+#', $bugsys->in['summary']);
61
62 // #*# need to have some str to bool conversions
63
64 foreach ($keywords AS $word)
65 {
66 if (strlen($word) < SEARCH_WORD_MIN)
67 {
68 continue;
69 }
70
71 if (MODE_ALL)
72 {
73 $querybuild['text'] .= " +$word";
74 }
75 else
76 {
77 $querybuild['text'] .= " $word";
78 }
79
80 if (!preg_match('#-(.+?)#', trim($word)))
81 {
82 $hilight .= " $word";
83 }
84 }
85
86 $hilight = preg_replace('#[^0-9a-zA-Z_ ]#', '', $hilight);
87 $hilight = trim($hilight);
88 $hilight = preg_replace('#\s#', '+', $hilight);
89
90 $temp = trim($querybuild['text']);
91
92 if (MODE_ALL OR MODE_RAW)
93 {
94 $bool_flag = ' IN BOOLEAN MODE';
95 }
96
97 $querybuild['text'] = "AND\n\t\t\t(\n\t\t\t\tMATCH (bug.summary) AGAINST ('$temp'$bool_flag)\n\t\t\t\tOR MATCH (comment.comment) AGAINST ('$temp'$bool_flag)\n\t\t\t)";
98 }
99
100 // -------------------------------------------------------------------
101 // reporter
102 if ($bugsys->in['reporter'])
103 {
104 // force email or name?? make a distinction?
105 // more elegant way to do this? probably
106 $user = $db->query_first("SELECT * FROM user WHERE email LIKE '%" . str_replace('%', '\%', $bugsys->in['reporter']) . "' OR displayname LIKE '%" . str_replace('%', '\%', $bugsys->in['reporter']) . "%'");
107 if ($user['userid'])
108 {
109 $querybuild['reporter'] = "AND bug.userid = $user[userid] OR comment.userid = $user[userid]";
110 }
111 }
112
113 // -------------------------------------------------------------------
114 // product/component/version stuff
115 if (is_array($bugsys->in['pcv']))
116 {
117 $querybuild['pcv'] = "AND bug.productid = $pcv[product] AND bug.componentid = $pcv[component] AND bug.versionid = $pcv[version]";
118 }
119
120 // -------------------------------------------------------------------
121 // severity, priority, status, resolution, assignedto
122
123 // severity
124 if ($bugsys->in['severity'])
125 {
126 $querybuild['severity'] = "AND bug.severity = " . intval($bugsys->in['severity']);
127 }
128
129 // priority
130 if ($bugsys->in['priority'])
131 {
132 $querybuild['priority'] = "AND bug.priority = " . intval($bugsys->in['priority']);
133 }
134
135 // status
136 if ($bugsys->in['status'])
137 {
138 $querybuild['status'] = "AND bug.status = " . intval($bugsys->in['status']);
139 }
140
141 // resolution
142 if ($bugsys->in['resolution'])
143 {
144 $querybuild['resolution'] = "AND bug.resolution = " . intval($bugsys->in['resolution']);
145 }
146
147 // assignment
148 if ($bugsys->in['assignedto'])
149 {
150 $querybuild['assignedto'] = "AND bug.assignedto = " . intval($bugsys->in['assignedto']);
151 }
152
153 // -------------------------------------------------------------------
154 // date
155 if ($bugsys->in['date'])
156 {
157 // now - (seconds/day * number of days)
158 $dateline = time() - (intval($bugsys->in['date']) * 3600);
159 $querybuild['date'] = "AND bug.dateline >= $dateline";
160 }
161
162 // -------------------------------------------------------------------
163 // favourites
164 if ($bugsys->in['favourite'] AND $bugsys->userinfo['userid'])
165 {
166 $favourites = $db->query("SELECT * FROM " . TABLE_PREFIX . "favourite WHERE userid = " . $bugsys->userinfo['userid']);
167 while ($favourite = $db->fetch_array($favourites))
168 {
169 $ids[] = $favourite['bugid'];
170 }
171 $querybuild['favourites'] = "AND bug.bugid IN (" . implode(', ', $ids) . ")";
172 }
173
174 // -------------------------------------------------------------------
175 // sort by
176 $sortby = array('bugid', 'severity', 'priority', 'status', 'resolution', 'dateline');
177 $orderby = array('ASC', 'DESC');
178 $bugsys->in['orderby'] = strtoupper($bugsys->in['orderby']);
179 if (in_array($bugsys->in['sortby'], $sortby) AND in_array($bugsys->in['orderby'], $orderby))
180 {
181 $sortclause = "ORDER BY " . $bugsys->in['sortby'] . ' ' . $bugsys->in['orderby'];
182 }
183 else if ($bugsys->in['sortby'] == 'relevance')
184 {
185 $sortclause = '';
186 }
187 else
188 {
189 $sortclause = '';
190 }
191
192 // -------------------------------------------------------------------
193 // custom fields
194 $fields_fetch = $bugsys->db->query("
195 SELECT bugfield.*
196 FROM " . TABLE_PREFIX . "bugfield AS bugfield
197 LEFT JOIN " . TABLE_PREFIX . "bugfieldpermission AS permission
198 ON (bugfield.fieldid = permission.fieldid)
199 WHERE permission.mask <> 0
200 AND permission.usergroupid = {$bugsys->userinfo['usergroupid']}
201 AND bugfield.cansearch = 1"
202 );
203 while ($field = $bugsys->db->fetch_array($fields_fetch))
204 {
205 if (!empty($bugsys->in['custom']["$field[fieldid]"]) OR ($field['type'] == 'select_single' AND isset($bugsys->in['custom']["$field[fieldid]"])))
206 {
207 if ($field['type'] == 'input_checkbox')
208 {
209 $querybuild[] = "AND bugfieldvalue.field$field[fieldid] = " . (($bugsys->in['custom']["$field[fieldid]"] == 1) ? 0 : 1);
210 }
211 else if ($field['type'] == 'input_text')
212 {
213 $querybuild[] = "AND bugfieldvalue.field$field[fieldid] LIKE '%" . $bugsys->in['custom']["$field[fieldid]"] . "%'";
214 }
215 else if ($field['type'] == 'select_single' AND $bugsys->in['custom']["$field[fieldid]"] != -1)
216 {
217 $temp = unserialize($field['selects']);
218 $querybuild[] = "AND bugfieldvalue.field$field[fieldid] = '" . trim($temp[ intval($bugsys->in['custom']["$field[fieldid]"]) ]) . "'";
219 }
220 }
221 }
222
223 // -------------------------------------------------------------------
224 // have to search something
225 if (count($querybuild) < 1)
226 {
227 $message->error($lang->string('You have to enter some criteria to search for'));
228 }
229
230 // -------------------------------------------------------------------
231 // do the search
232 $query = "
233 SELECT bug.*, comment.commentid,
234 user1.displayname AS firstreport,
235 user2.displayname AS lastpost
236 FROM " . TABLE_PREFIX . "bug AS bug
237 LEFT JOIN " . TABLE_PREFIX . "comment AS comment
238 ON (bug.bugid = comment.bugid)
239 LEFT JOIN " . TABLE_PREFIX . "user AS user1
240 ON (bug.userid = user1.userid)
241 LEFT JOIN " . TABLE_PREFIX . "user AS user2
242 ON (bug.lastpostby = user2.userid)
243 LEFT JOIN " . TABLE_PREFIX . "bugvaluefill AS bugfieldvalue
244 ON (bug.bugid = bugfieldvalue.bugid)
245 WHERE bug.bugid <> 0
246 " . implode("\n\t\t", $querybuild) . ((!can_perform('canviewhidden')) ? "
247 AND !bug.hidden
248 AND !comment.hidden" : "") . "
249 GROUP BY bug.bugid
250 $sortclause";
251
252 $search = $db->query($query);
253
254 $numrows = $db->num_rows($search);
255
256 if ($numrows < 1)
257 {
258 $message->error($lang->string('No search results were returned that matched your criteria.'));
259 }
260
261 while ($result = $db->fetch_array($search))
262 {
263 $ids[] = $result['bugid'];
264 $results[] = $result;
265 }
266
267 if ($bugsys->userinfo['userid'])
268 {
269 $db->query("
270 REPLACE INTO " . TABLE_PREFIX . "search
271 (userid, dateline, query, ids, orderby, hilight)
272 VALUES
273 (" . $bugsys->userinfo['userid'] . ",
274 " . TIMENOW . ", '" . $bugsys->escape($query) . "',
275 '" . implode(',', $ids) . "', '" . $bugsys->escape($sortclause) . "',
276 '" . $bugsys->escape($hilight) . "'
277 )"
278 );
279 }
280
281 $justprocess = true;
282
283 $_REQUEST['do'] = 'results';
284 }
285
286 // ###################################################################
287
288 if ($_REQUEST['do'] == 'search')
289 {
290 if ($bugsys->userinfo['userid'] AND !$bugsys->in['new'])
291 {
292 if ($cachedsearch = $db->query_first("SELECT * FROM " . TABLE_PREFIX . "search WHERE userid = " . $bugsys->userinfo['userid']))
293 {
294 $_REQUEST['do'] = 'results';
295 }
296 else
297 {
298 $newsearch = true;
299 }
300 }
301 else
302 {
303 $newsearch = true;
304 }
305
306 if ($newsearch)
307 {
308 $pcv_select = construct_pcv_select('radio', '--');
309
310 // -------------------------------------------------------------------
311 // custom fields
312 $fields = construct_custom_fields($bug, true, true);
313
314 $bugsys->debug(count($fields) % 2);
315 $i = 1;
316 foreach ($fields AS $field)
317 {
318 $bugsys->debug("i = $i");
319 if ($i == 1)
320 {
321 $left = $field;
322 }
323 else if ($i == 2)
324 {
325 $right = $field;
326 eval('$customfields .= "' . $template->fetch('customfield_bit') . '";');
327 $i = 0;
328 }
329 $i++;
330 }
331
332 if ((count($fields) % 2) != 0)
333 {
334 $bugsys->debug('no modulo for you');
335 $right = '';
336 eval('$customfields .= "' . $template->fetch('customfield_bit') . '";');
337 }
338
339 // -------------------------------------------------------------------
340 // built-in fields
341 $select['severity'] = construct_datastore_select('severity', 'severity', 'severityid', 0, true);
342 $select['priority'] = construct_datastore_select('priority', 'priority', 'priorityid', 0, true);
343 $select['status'] = construct_datastore_select('status', 'status', 'statusid', 0, true);
344 $select['resolution'] = construct_datastore_select('resolution', 'resolution', 'resolutionid', 0, true);
345
346 $select['dev'] = '<option value="0" selected="selected"></option>';
347 foreach ($bugsys->datastore['assignto'] AS $dev)
348 {
349 $value = $dev['userid'];
350 $label = construct_user_display($dev, false);
351 eval('$select[dev] .= "' . $template->fetch('selectoption') . '";');
352 }
353
354 eval('$template->flush("' . $template->fetch('search') . '");');
355 }
356 }
357
358 // ###################################################################
359
360 if ($_REQUEST['do'] == 'results')
361 {
362 $show['cached'] = false;
363 if ($bugsys->userinfo['userid'] AND !$justprocess)
364 {
365 $search = $cachedsearch;
366 if ($search['dateline'] < TIMENOW - 900 OR $bugsys->in['rerun'])
367 {
368 $search = $db->query($search['query']);
369 while ($bug = $db->fetch_array($search))
370 {
371 $ids[] = $bug['bugid'];
372 $results[] = $bug;
373 }
374 $db->query("UPDATE " . TABLE_PREFIX . "search SET ids = '" . implode(',', $ids) . "', dateline = " . TIMENOW . " WHERE userid = " . $bugsys->userinfo['userid']);
375 }
376 else
377 {
378 $search = $db->query("
379 SELECT bug.*, user1.displayname AS firstreport,
380 user2.displayname AS lastpost
381 FROM " . TABLE_PREFIX . "bug AS bug
382 LEFT JOIN " . TABLE_PREFIX . "user AS user1
383 ON (bug.userid = user1.userid)
384 LEFT JOIN " . TABLE_PREFIX . "user AS user2
385 ON (bug.lastpostby = user2.userid)
386 WHERE bug.bugid IN ($search[ids])
387 $search[orderby]"
388 );
389 while ($bug = $db->fetch_array($search))
390 {
391 $results[] = $bug;
392 }
393 }
394 $show['cached'] = true;
395 $hilight = $search['hilight'];
396 }
397
398 foreach ($results AS $bug)
399 {
400 $bug['bgcolour'] = $bugsys->datastore['status']["$bug[status]"]['color'];
401 $bug['product'] = $bugsys->datastore['product']["$bug[productid]"]['title'];
402 $bug['version'] = $bugsys->datastore['version']["$bug[versionid]"]['version'];
403 $bug['status'] = $bugsys->datastore['status']["$bug[status]"]['status'];
404 $bug['resolution'] = $bugsys->datastore['resolution']["$bug[resolution]"]['resolution'];
405 $bug['lastposttime'] = (($bug['hiddendisplay']) ? $bug['hiddenlastposttime'] : $bug['lastposttime']);
406 $bug['lastpost'] = (($bug['hiddendisplay']) ? $bug['hiddenlastpost'] : $bug['lastpost']);
407 $bug['lastposttime'] = $datef->format($bugsys->options['dateformat'], $bug['lastposttime']);
408 $bug['urladd'] = "&amp;hilight=$hilight";
409 eval('$bugs .= "' . $template->fetch('trackerhome_bits') . '";');
410 }
411
412 eval('$template->flush("' . $template->fetch('search_results') . '");');
413 }
414
415 /*=====================================================================*\
416 || ###################################################################
417 || # $HeadURL$
418 || # $Id$
419 || ###################################################################
420 \*=====================================================================*/
421 ?>