1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4/**
5* Class ilObjSearchSettingsGUI
6*
7* @author Stefan Meyer <meyer@leifos.com>
8* @version $Id$
9*
10* @extends ilObjectGUI
11* @package ilias-core
12*/
13
14class ilSearchSettings
15{
16    const LIKE_SEARCH = 0;
17    const INDEX_SEARCH = 1;
18    const LUCENE_SEARCH = 2;
19
20    const OPERATOR_AND = 1;
21    const OPERATOR_OR = 2;
22
23    protected static $instance = null;
24
25    protected $default_operator = self::OPERATOR_AND;
26    protected $fragmentSize = 30;
27    protected $fragmentCount = 3;
28    protected $numSubitems = 5;
29    protected $showRelevance = true;
30    protected $last_index_date = null;
31    protected $lucene_item_filter_enabled = false;
32    protected $lucene_item_filter = array();
33    protected $lucene_offline_filter = true;
34    protected $auto_complete_length = 10;
35    protected $show_inactiv_user = true;
36    protected $show_limited_user = true;
37
38    protected $lucene_mime_filter_enabled = false;
39    protected $lucene_mime_filter = array();
40    protected $showSubRelevance = false;
41    protected $prefix_wildcard = false;
42
43    protected $user_search = false;
44
45    protected $date_filter = false;
46
47    public $ilias = null;
48    public $max_hits = null;
49    public $index = null;
50
51    public function __construct()
52    {
53        global $DIC;
54
55        $ilias = $DIC['ilias'];
56
57        $this->ilias = $ilias;
58        $this->__read();
59    }
60
61    /**
62     *
63     *
64     * @static
65     * @return ilSearchSettings
66     */
67    public static function getInstance()
68    {
69        if (self::$instance == null) {
70            return self::$instance = new ilSearchSettings();
71        }
72        return self::$instance;
73    }
74
75    /**
76     * Get lucene item filter definitions
77     * @return
78     * @todo This has to be defined in module.xml
79     */
80    public static function getLuceneItemFilterDefinitions()
81    {
82        return array(
83            'crs' => array('filter' => 'type:crs','trans' => 'objs_crs'),
84            'grp' => array('filter' => 'type:grp', 'trans' => 'objs_grp'),
85            'lms' => array('filter' => 'type:lm OR type:htlm','trans' => 'obj_lrss'),
86            'glo' => array('filter' => 'type:glo','trans' => 'objs_glo'),
87            'mep' => array('filter' => 'type:mep', 'trans' => 'objs_mep'),
88            'tst' => array('filter' => 'type:tst OR type:svy OR type:qpl OR type:spl','trans' => 'search_tst_svy'),
89            'frm' => array('filter' => 'type:frm','trans' => 'objs_frm'),
90            'exc' => array('filter' => 'type:exc','trans' => 'objs_exc'),
91            'file' => array('filter' => 'type:file','trans' => 'objs_file'),
92            'mcst' => array('filter' => 'type:mcst','trans' => 'objs_mcst'),
93            'wiki' => array('filter' => 'type:wiki','trans' => 'objs_wiki'),
94            'copa' => array('filter' => 'type:copa','trans' => 'objs_copa'),
95        );
96    }
97
98    public static function getLuceneMimeFilterDefinitions()
99    {
100        return array(
101            'pdf' => array('filter' => 'mimeType:pdf','trans' => 'search_mime_pdf'),
102            'word' => array('filter' => 'mimeType:word','trans' => 'search_mime_word'),
103            'excel' => array('filter' => 'mimeType:excel','trans' => 'search_mime_excel'),
104            'powerpoint' => array('filter' => 'mimeType:powerpoint','trans' => 'search_mime_powerpoint'),
105            'image' => array('filter' => 'mimeType:image','trans' => 'search_mime_image')
106        );
107    }
108
109    /**
110     * Get lucene item filter definitions
111     * @return
112     * @todo This has to be defined in module.xml
113     */
114    public function getEnabledLuceneItemFilterDefinitions()
115    {
116        if (!$this->isLuceneItemFilterEnabled()) {
117            return array();
118        }
119
120        $filter = $this->getLuceneItemFilter();
121        $enabled = array();
122        foreach (self::getLuceneItemFilterDefinitions() as $obj => $def) {
123            if (isset($filter[$obj]) and $filter[$obj]) {
124                $enabled[$obj] = $def;
125            }
126        }
127        return $enabled;
128    }
129
130    // begin-patch mime_filter
131    public function getEnabledLuceneMimeFilterDefinitions()
132    {
133        if (!$this->isLuceneItemFilterEnabled()) {
134            return array();
135        }
136
137        $filter = $this->getLuceneMimeFilter();
138        $enabled = array();
139        foreach (self::getLuceneMimeFilterDefinitions() as $mime => $def) {
140            if (isset($filter[$mime]) and $filter[$mime]) {
141                $enabled[$mime] = $def;
142            }
143        }
144        return $enabled;
145    }
146
147    public function enablePrefixWildcardQuery($a_stat)
148    {
149        $this->prefix_wildcard = $a_stat;
150    }
151
152    public function isPrefixWildcardQueryEnabled()
153    {
154        return $this->prefix_wildcard;
155    }
156
157    // end-patch mime_filter
158
159    /**
160    * Read the ref_id of Search Settings object. normally used for rbacsystem->checkAccess()
161    * @return int ref_id
162    * @access	public
163    */
164    public static function _getSearchSettingRefId()
165    {
166        global $DIC;
167
168        $ilDB = $DIC['ilDB'];
169
170        static $seas_ref_id = 0;
171
172        if ($seas_ref_id) {
173            return $seas_ref_id;
174        }
175        $query = "SELECT object_reference.ref_id as ref_id FROM object_reference,tree,object_data " .
176            "WHERE tree.parent = " . $ilDB->quote(SYSTEM_FOLDER_ID, 'integer') . " " .
177            "AND object_data.type = 'seas' " .
178            "AND object_reference.ref_id = tree.child " .
179            "AND object_reference.obj_id = object_data.obj_id";
180
181        $res = $ilDB->query($query);
182        $row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT);
183
184        return $seas_ref_id = $row->ref_id;
185    }
186
187    public function enabledIndex()
188    {
189        return $this->index ? true : false;
190    }
191    public function enableIndex($a_status)
192    {
193        $this->index = $a_status;
194    }
195    public function enabledLucene()
196    {
197        return $this->lucene ? true : false;
198    }
199    public function enableLucene($a_status)
200    {
201        $this->lucene = $a_status ? true : false;
202    }
203
204    public function getMaxHits()
205    {
206        return $this->max_hits;
207    }
208    public function setMaxHits($a_max_hits)
209    {
210        $this->max_hits = $a_max_hits;
211    }
212
213    public function getDefaultOperator()
214    {
215        return $this->default_operator;
216    }
217
218    public function setDefaultOperator($a_op)
219    {
220        $this->default_operator = $a_op;
221    }
222
223    public function setFragmentSize($a_size)
224    {
225        $this->fragmentSize = $a_size;
226    }
227
228    public function getFragmentSize()
229    {
230        return $this->fragmentSize;
231    }
232
233    public function setFragmentCount($a_count)
234    {
235        $this->fragmentCount = $a_count;
236    }
237
238    public function getHideAdvancedSearch()
239    {
240        return $this->hide_adv_search ? true : false;
241    }
242    public function setHideAdvancedSearch($a_status)
243    {
244        $this->hide_adv_search = $a_status;
245    }
246    public function getAutoCompleteLength()
247    {
248        return $this->auto_complete_length;
249    }
250    public function setAutoCompleteLength($auto_complete_length)
251    {
252        $this->auto_complete_length = $auto_complete_length;
253    }
254
255    public function getFragmentCount()
256    {
257        return $this->fragmentCount;
258    }
259
260    public function setMaxSubitems($a_max)
261    {
262        $this->numSubitems = $a_max;
263    }
264
265    public function getMaxSubitems()
266    {
267        return $this->numSubitems;
268    }
269
270    public function isRelevanceVisible()
271    {
272        return $this->showRelevance;
273    }
274
275    public function showRelevance($a_status)
276    {
277        $this->showRelevance = (bool) $a_status;
278    }
279
280    public function getLastIndexTime()
281    {
282        return $this->last_index_date instanceof ilDateTime  ?
283            $this->last_index_date :
284            new ilDateTime('2009-01-01 12:00:00', IL_CAL_DATETIME);
285    }
286
287    public function enableLuceneItemFilter($a_status)
288    {
289        $this->lucene_item_filter_enabled = $a_status;
290    }
291
292    public function isLuceneItemFilterEnabled()
293    {
294        return $this->lucene_item_filter_enabled;
295    }
296
297    public function getLuceneItemFilter()
298    {
299        return $this->lucene_item_filter;
300    }
301
302
303    public function setLuceneItemFilter($a_filter)
304    {
305        $this->lucene_item_filter = $a_filter;
306    }
307
308    public function enableLuceneOfflineFilter($a_stat)
309    {
310        $this->lucene_offline_filter = $a_stat;
311    }
312
313    public function isLuceneOfflineFilterEnabled()
314    {
315        return $this->lucene_offline_filter;
316    }
317
318    public function showSubRelevance($a_stat)
319    {
320        $this->showSubRelevance = $a_stat;
321    }
322
323    public function isSubRelevanceVisible()
324    {
325        return $this->showSubRelevance;
326    }
327
328
329    public function setLuceneMimeFilter($a_filter)
330    {
331        $this->lucene_mime_filter = $a_filter;
332    }
333
334    public function getLuceneMimeFilter()
335    {
336        return $this->lucene_mime_filter;
337    }
338
339    /**
340     * Check if lucene mime filter is enabled
341     */
342    public function isLuceneMimeFilterEnabled()
343    {
344        return $this->lucene_mime_filter_enabled;
345    }
346
347    /**
348     * Enable lucene mime filter
349     * @param type $a_stat
350     */
351    public function enableLuceneMimeFilter($a_stat)
352    {
353        $this->lucene_mime_filter_enabled = $a_stat;
354    }
355
356
357    /**
358     * @param object instance of ilDateTime
359     */
360    public function setLastIndexTime($time)
361    {
362        $this->last_index_date = $time;
363    }
364
365    /**
366     * Check if user search is enabled
367     * @return type
368     */
369    public function isLuceneUserSearchEnabled()
370    {
371        return $this->user_search;
372    }
373
374    /**
375     * Enable lucene user search
376     * @param type $a_status
377     */
378    public function enableLuceneUserSearch($a_status)
379    {
380        $this->user_search = $a_status;
381    }
382
383    /**
384     * show inactive user in user search
385     *
386     * @param bool $a_visible
387     */
388    public function showInactiveUser($a_visible)
389    {
390        $this->show_inactiv_user = (bool) $a_visible;
391    }
392
393    /**
394     * are inactive user visible in user search
395     *
396     * @return bool
397     */
398    public function isInactiveUserVisible()
399    {
400        return $this->show_inactiv_user;
401    }
402
403    /**
404     * show user with limited access in user search
405     *
406     * @param bool $a_visible
407     */
408    public function showLimitedUser($a_visible)
409    {
410        $this->show_limited_user = (bool) $a_visible;
411    }
412
413    /**
414     * are user with limited access visible in user search
415     *
416     * @return bool
417     */
418    public function isLimitedUserVisible()
419    {
420        return $this->show_limited_user;
421    }
422
423    public function isDateFilterEnabled()
424    {
425        return $this->date_filter;
426    }
427
428    public function enableDateFilter($a_filter)
429    {
430        $this->date_filter = $a_filter;
431    }
432
433    public function update()
434    {
435        global $DIC;
436
437        $ilSetting = $DIC['ilSetting'];
438
439        $this->ilias->setSetting('search_max_hits', $this->getMaxHits());
440        $this->ilias->setSetting('search_index', (int) $this->enabledIndex());
441        $this->ilias->setSetting('search_lucene', (int) $this->enabledLucene());
442
443        $this->ilias->setSetting('lucene_default_operator', $this->getDefaultOperator());
444        $this->ilias->setSetting('lucene_fragment_size', $this->getFragmentSize());
445        $this->ilias->setSetting('lucene_fragment_count', $this->getFragmentCount());
446        $this->ilias->setSetting('lucene_max_subitems', $this->getMaxSubitems());
447        $this->ilias->setSetting('lucene_show_relevance', $this->isRelevanceVisible());
448        $this->ilias->setSetting('lucene_last_index_time', $this->getLastIndexTime()->get(IL_CAL_UNIX));
449        $this->ilias->setSetting('hide_adv_search', (int) $this->getHideAdvancedSearch());
450        $this->ilias->setSetting('auto_complete_length', (int) $this->getAutoCompleteLength());
451        $this->ilias->setSetting('lucene_item_filter_enabled', (int) $this->isLuceneItemFilterEnabled());
452        $this->ilias->setSetting('lucene_item_filter', serialize($this->getLuceneItemFilter()));
453        $this->ilias->setSetting('lucene_offline_filter', (int) $this->isLuceneOfflineFilterEnabled());
454        $this->ilias->setSetting('lucene_mime_filter', serialize($this->getLuceneMimeFilter()));
455        $this->ilias->setSetting('lucene_sub_relevance', $this->isSubRelevanceVisible());
456        $ilSetting->set('lucene_mime_filter_enabled', $this->isLuceneMimeFilterEnabled());
457        $this->ilias->setSetting('lucene_prefix_wildcard', $this->isPrefixWildcardQueryEnabled());
458        $ilSetting->set('lucene_user_search', $this->isLuceneUserSearchEnabled());
459        $ilSetting->set('search_show_inactiv_user', $this->isInactiveUserVisible());
460        $ilSetting->set('search_show_limited_user', $this->isLimitedUserVisible());
461
462        $ilSetting->set('search_date_filter', $this->isDateFilterEnabled());
463
464        return true;
465    }
466
467    // PRIVATE
468    public function __read()
469    {
470        global $DIC;
471
472        $ilSetting = $DIC['ilSetting'];
473
474        $this->setMaxHits($this->ilias->getSetting('search_max_hits', 10));
475        $this->enableIndex($this->ilias->getSetting('search_index', 0));
476        $this->enableLucene($this->ilias->getSetting('search_lucene', 0));
477
478        $this->setDefaultOperator($this->ilias->getSetting('lucene_default_operator', self::OPERATOR_AND));
479        $this->setFragmentSize($this->ilias->getSetting('lucene_fragment_size', 50));
480        $this->setFragmentCount($this->ilias->getSetting('lucene_fragment_count', 3));
481        $this->setMaxSubitems($this->ilias->getSetting('lucene_max_subitems', 5));
482        $this->showRelevance($this->ilias->getSetting('lucene_show_relevance', true));
483
484        if ($time = $this->ilias->getSetting('lucene_last_index_time', false)) {
485            $this->setLastIndexTime(new ilDateTime($time, IL_CAL_UNIX));
486        } else {
487            $this->setLastIndexTime(null);
488        }
489
490        $this->setHideAdvancedSearch($this->ilias->getSetting('hide_adv_search', 0));
491        $this->setAutoCompleteLength($this->ilias->getSetting('auto_complete_length', $this->getAutoCompleteLength()));
492
493        $this->enableLuceneItemFilter($this->ilias->getSetting('lucene_item_filter_enabled', (int) $this->isLuceneItemFilterEnabled()));
494
495        $filter = $this->ilias->getSetting('lucene_item_filter', serialize($this->getLuceneItemFilter()));
496        $this->setLuceneItemFilter(unserialize($filter));
497        $this->enableLuceneOfflineFilter($this->ilias->getSetting('lucene_offline_filter'), $this->isLuceneOfflineFilterEnabled());
498
499        $this->enableLuceneMimeFilter($ilSetting->get('lucene_mime_filter_enabled', $this->lucene_item_filter_enabled));
500        $filter = $this->ilias->getSetting('lucene_mime_filter', serialize($this->getLuceneMimeFilter()));
501        $this->setLuceneMimeFilter(unserialize($filter));
502        $this->showSubRelevance($this->ilias->getSetting('lucene_sub_relevance', $this->showSubRelevance));
503        $this->enablePrefixWildcardQuery($this->ilias->getSetting('lucene_prefix_wildcard', $this->prefix_wildcard));
504        $this->enableLuceneUserSearch($ilSetting->get('lucene_user_search', $this->user_search));
505
506        $this->showInactiveUser($ilSetting->get('search_show_inactiv_user', $this->show_inactiv_user));
507        $this->showLimitedUser($ilSetting->get('search_show_limited_user', $this->show_limited_user));
508
509        $this->enableDateFilter($ilSetting->get('search_date_filter', $this->date_filter));
510    }
511}
512