ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilUserSearchCache.php
Go to the documentation of this file.
1 <?php
2 /*
3  +-----------------------------------------------------------------------------+
4  | ILIAS open source |
5  +-----------------------------------------------------------------------------+
6  | Copyright (c) 1998-2006 ILIAS open source, University of Cologne |
7  | |
8  | This program is free software; you can redistribute it and/or |
9  | modify it under the terms of the GNU General Public License |
10  | as published by the Free Software Foundation; either version 2 |
11  | of the License, or (at your option) any later version. |
12  | |
13  | This program is distributed in the hope that it will be useful, |
14  | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16  | GNU General Public License for more details. |
17  | |
18  | You should have received a copy of the GNU General Public License |
19  | along with this program; if not, write to the Free Software |
20  | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21  +-----------------------------------------------------------------------------+
22 */
23 
36 {
37  const DEFAULT_SEARCH = 0;
38  const ADVANCED_SEARCH = 1;
39  const ADVANCED_MD_SEARCH = 4;
40  const LUCENE_DEFAULT = 5;
41  const LUCENE_ADVANCED = 6;
42 
43  const LAST_QUERY = 7;
44 
45  const LUCENE_USER_SEARCH = 8;
46 
47  private static $instance = null;
48  private $db;
49 
50  private $usr_id;
52 
53  private $search_result = array();
54  private $checked = array();
55  private $failed = array();
56  private $page_number = 1;
57  private $query;
58  private $root = ROOT_FOLDER_ID;
59 
60  private $item_filter = array();
61 
62  private $isAnonymous = false;
63 
64  // begin-patch mime_filter
65  private $mime_filter = array();
66  // end-patch mime_filter
67 
68  // begin-patch create_date
69  private $creation_filter = array();
70  // end-patch create_date
71 
72 
73 
80  private function __construct($a_usr_id)
81  {
82  global $ilDB;
83 
84  if($a_usr_id == ANONYMOUS_USER_ID)
85  {
86  $this->isAnonymous = true;
87  }
88 
89  $this->db = $ilDB;
90  $this->usr_id = $a_usr_id;
91  $this->search_type = self::DEFAULT_SEARCH;
92  $this->read();
93  }
94 
103  public static function _getInstance($a_usr_id)
104  {
105  if(is_object(self::$instance) and self::$instance)
106  {
107  return self::$instance;
108  }
109  return self::$instance = new ilUserSearchCache($a_usr_id);
110  }
111 
116  public function isAnonymous()
117  {
118  return $this->isAnonymous;
119  }
120 
129  public function switchSearchType($a_type)
130  {
131  $this->search_type = $a_type;
132  $this->read();
133  return true;
134  }
135 
142  public function getResults()
143  {
144  return $this->search_result ? $this->search_result : array();
145  }
146 
154  public function setResults($a_results)
155  {
156  $this->search_result = $a_results;
157  }
158 
166  public function addResult($a_result_item)
167  {
168  $this->search_result[$a_result_item['ref_id']]['ref_id'] = $a_result_item['ref_id'];
169  $this->search_result[$a_result_item['ref_id']]['obj_id'] = $a_result_item['obj_id'];
170  $this->search_result[$a_result_item['ref_id']]['type'] = $a_result_item['type'];
171  return true;
172  }
173 
181  public function appendToFailed($a_ref_id)
182  {
183  $this->failed[$a_ref_id] = $a_ref_id;
184  }
185 
193  public function isFailed($a_ref_id)
194  {
195  return in_array($a_ref_id,$this->failed) ? true : false;
196  }
197 
206  public function appendToChecked($a_ref_id,$a_obj_id)
207  {
208  $this->checked[$a_ref_id] = $a_obj_id;
209  }
210 
218  public function isChecked($a_ref_id)
219  {
220  return array_key_exists($a_ref_id,$this->checked) and $this->checked[$a_ref_id];
221  }
222 
230  public function getCheckedItems()
231  {
232  return $this->checked ? $this->checked : array();
233  }
234 
241  public function setResultPageNumber($a_number)
242  {
243  if($a_number)
244  {
245  $this->page_number = $a_number;
246  }
247  }
248 
255  public function getResultPageNumber()
256  {
257  return $this->page_number ? $this->page_number : 1;
258  }
259 
265  public function setQuery($a_query)
266  {
267  $this->query = $a_query;
268  }
269 
275  public function getQuery()
276  {
277  return $this->query;
278  }
279 
284  public function getUrlEncodedQuery()
285  {
286  if(is_array($this->getQuery()))
287  {
288  $query = $this->getQuery();
289 
290  return urlencode(str_replace('"', '.', $query['lom_content']));
291  }
292  return urlencode(str_replace('"', '.', $this->getQuery()));
293  }
294 
300  public function setRoot($a_root)
301  {
302  $this->root = $a_root;
303  }
304 
310  public function getRoot()
311  {
312  return $this->root ? $this->root : ROOT_FOLDER_ID;
313  }
314 
315  public function setItemFilter($a_filter)
316  {
317  $this->item_filter = $a_filter;
318  }
319 
320  public function getItemFilter()
321  {
322  return (array) $this->item_filter;
323  }
324 
325  public function setMimeFilter($a_filter)
326  {
327  $this->mime_filter = $a_filter;
328  }
329 
330  public function getMimeFilter()
331  {
332  return (array) $this->mime_filter;
333  }
334 
335  // begin-patch create_date
336  public function setCreationFilter($a_filter)
337  {
338  $this->creation_filter = $a_filter;
339  }
340 
341  public function getCreationFilter()
342  {
343  return $this->creation_filter;
344  }
345  // end-patch create_date
346 
347 
353  public function deleteCachedEntries()
354  {
355  global $ilDB;
356 
357  if($this->isAnonymous())
358  {
359  return $this->deleteCachedEntriesAnonymous();
360  }
361 
362 
363  $query = "SELECT COUNT(*) num FROM usr_search ".
364  "WHERE usr_id = ".$ilDB->quote($this->usr_id,'integer')." ".
365  "AND search_type = ".$ilDB->quote($this->search_type,'integer');
366  $res = $ilDB->query($query);
368 
369  if($row->num > 0)
370  {
371  $ilDB->update('usr_search',
372  array(
373  'search_result' => array('clob',serialize(array(0))),
374  'checked' => array('clob',serialize(array(0))),
375  'failed' => array('clob',serialize(array(0))),
376  'page' => array('integer',0)),
377  array(
378  'usr_id' => array('integer',(int) $this->usr_id),
379  'search_type' => array('integer',(int) $this->search_type)
380  ));
381  }
382  else
383  {
384  $ilDB->insert('usr_search',
385  array(
386  'search_result' => array('clob',serialize(array(0))),
387  'checked' => array('clob',serialize(array(0))),
388  'failed' => array('clob',serialize(array(0))),
389  'page' => array('integer',0),
390  'usr_id' => array('integer',(int) $this->usr_id),
391  'search_type' => array('integer',(int) $this->search_type)
392  ));
393  }
394 
395  $this->setResultPageNumber(1);
396  $this->search_result = array();
397  $this->checked = array();
398  $this->failed = array();
399  }
400 
406  {
407  $this->setResultPageNumber(1);
408  $this->search_result = array();
409  $this->checked = array();
410  $this->failed = array();
411 
412  return true;
413  }
414 
415 
416 
423  public function delete()
424  {
425  global $ilDB;
426 
427  $query = "DELETE FROM usr_search ".
428  "WHERE usr_id = ".$this->db->quote($this->usr_id ,'integer')." ".
429  "AND search_type = ".$this->db->quote($this->search_type ,'integer');
430  $res = $ilDB->manipulate($query);
431 
432  $this->read();
433  return true;
434  }
435 
442  public function save()
443  {
444  global $ilDB;
445 
446  if($this->isAnonymous())
447  {
448  return $this->saveForAnonymous();
449  }
450 
451  $query = "DELETE FROM usr_search ".
452  "WHERE usr_id = ".$ilDB->quote($this->usr_id ,'integer')." ".
453  "AND ( search_type = ".$ilDB->quote($this->search_type ,'integer').' '.
454  "OR search_type = ".$ilDB->quote(self::LAST_QUERY,'integer'). ')';
455  $res = $ilDB->manipulate($query);
456 
457  $ilDB->insert('usr_search',array(
458  'usr_id' => array('integer',(int) $this->usr_id),
459  'search_result' => array('clob',serialize($this->search_result)),
460  'checked' => array('clob',serialize($this->checked)),
461  'failed' => array('clob',serialize($this->failed)),
462  'page' => array('integer',(int) $this->page_number),
463  'search_type' => array('integer',(int) $this->search_type),
464  'query' => array('clob',serialize($this->getQuery())),
465  'root' => array('integer',$this->getRoot()),
466  'item_filter' => array('text',serialize($this->getItemFilter())),
467  'mime_filter' => array('text', serialize($this->getMimeFilter())),
468  'creation_filter' => array('text', serialize($this->getCreationFilter()))
469  ));
470 
471 
472  // Write last query information
473  $ilDB->insert('usr_search',
474  array(
475  'usr_id' => array('integer',$this->usr_id),
476  'search_type' => array('integer',self::LAST_QUERY),
477  'query' => array('text',serialize($this->getQuery()))
478  )
479  );
480  }
481 
482  public function saveForAnonymous()
483  {
484  unset($_SESSION['usr_search_cache']);
485 
486  $_SESSION['usr_search_cache'][$this->search_type]['search_result'] = $this->search_result;
487  $_SESSION['usr_search_cache'][$this->search_type]['checked'] = $this->checked;
488  $_SESSION['usr_search_cache'][$this->search_type]['failed'] = $this->failed;
489  $_SESSION['usr_search_cache'][$this->search_type]['page'] = $this->page_number;
490  $_SESSION['usr_search_cache'][$this->search_type]['query'] = $this->getQuery();
491  $_SESSION['usr_search_cache'][$this->search_type]['root'] = $this->getRoot();
492  $_SESSION['usr_search_cache'][$this->search_type]['item_filter'] = $this->getItemFilter();
493  $_SESSION['usr_search_cache'][$this->search_type]['mime_filter'] = $this->getMimeFilter();
494  $_SESSION['usr_search_cache'][$this->search_type]['creation_filter'] = $this->getCreationFilter();
495 
496  $_SESSION['usr_search_cache'][self::LAST_QUERY]['query'] = $this->getQuery();
497 
498  return true;
499 
500  }
501 
502 
509  private function read()
510  {
511  $this->failed = array();
512  $this->checked = array();
513  $this->search_result = array();
514  $this->page_number = 0;
515 
516  if($this->isAnonymous())
517  {
518  return $this->readAnonymous();
519  }
520 
521  $query = "SELECT * FROM usr_search ".
522  "WHERE usr_id = ".$this->db->quote($this->usr_id ,'integer')." ".
523  "AND search_type = ".$this->db->quote($this->search_type ,'integer');
524 
525  $res = $this->db->query($query);
526  while($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT))
527  {
528  $this->search_result = unserialize(stripslashes($row->search_result));
529  if(strlen($row->checked))
530  {
531  $this->checked = unserialize(stripslashes($row->checked));
532  }
533  if(strlen($row->failed))
534  {
535  $this->failed = unserialize(stripslashes($row->failed));
536  }
537  $this->page_number = $row->page;
538  $this->setQuery(unserialize($row->query));
539  $this->setRoot($row->root);
540  $this->setItemFilter(unserialize($row->item_filter));
541  $this->setCreationFilter(unserialize($row->creation_filter));
542  }
543  return true;
544  }
545 
549  private function readAnonymous()
550  {
551  $this->search_result = (array) $_SESSION['usr_search_cache'][$this->search_type]['search_result'];
552  $this->checked = (array) $_SESSION['usr_search_cache'][$this->search_type]['checked'];
553  $this->failed = (array) $_SESSION['usr_search_cache'][$this->search_type]['failed'];
554  $this->page_number = $_SESSION['usr_search_cache'][$this->search_type]['page_number'];
555 
556  $this->setQuery($_SESSION['usr_search_cache'][$this->search_type]['query']);
557  $this->setRoot((string) $_SESSION['usr_search_cache'][$this->search_type]['root']);
558  $this->setItemFilter((array) $_SESSION['usr_search_cache'][$this->search_type]['item_filter']);
559  $this->setMimeFilter((array) $_SESSION['usr_search_cache'][$this->search_type]['mime_filter']);
560  $this->setCreationFilter((array) $_SESSION['usr_search_cache'][$this->search_type]['creation_filter']);
561 
562  return true;
563  }
564 }
565 ?>
setQuery($a_query)
set query
isChecked($a_ref_id)
Check if reference was already checked.
addResult($a_result_item)
Append result.
const DEFAULT_SEARCH
$_SESSION["AccountId"]
__construct($a_usr_id)
Constructor.
getCheckedItems()
Get all checked items.
deleteCachedEntries()
delete cached entries
switchSearchType($a_type)
switch to search type reads entries from database
deleteCachedEntriesAnonymous()
Delete cached entries for anonymous user.
readAnonymous()
Read from session for anonymous user.
getResultPageNumber()
get result page number
getUrlEncodedQuery()
Urlencode query for further use in e.g glossariers (highlighting off search terms).
$a_type
Definition: workflow.php:93
static _getInstance($a_usr_id)
Get singleton instance.
setResults($a_results)
Set results.
setRoot($a_root)
set root node of search
Create styles array
The data for the language used.
isFailed($a_ref_id)
check if reference has failed access
appendToFailed($a_ref_id)
Append failed id.
isAnonymous()
Check if current user is anonymous user.
global $ilDB
Class for storing search result.
appendToChecked($a_ref_id, $a_obj_id)
Append checked id.
read()
Read user entries.
setResultPageNumber($a_number)
Set result page number.