ILIAS  trunk Revision v12.0_alpha-16-g3e876e53c80
SearcherImpl.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
27use ILIAS\UI\Renderer as UIRenderer;
31use ilLanguage;
33use ilUtil;
37use ilDate;
39
40class SearcherImpl implements Searcher
41{
42 public function __construct(
43 protected ilSearchSettings $settings,
44 protected ilGlobalTemplateInterface $tpl,
45 protected UIRenderer $ui_renderer,
46 protected ResultPresenter $presenter,
47 protected ilLanguage $lng
48 ) {
49 }
50
52 int $usr_id,
53 ilUserSearchCache $cache,
54 ViewControlInfos $view_control_infos,
55 SearchStateHandler $state_handler
56 ): void {
57 // Step 1: parse query string
58 if (!is_object($query_parser = $this->parseQueryString($cache->getQuery()))) {
59 $this->tpl->setOnScreenMessage(GlobalTemplate::MESSAGE_TYPE_INFO, $query_parser);
60 return;
61 }
62 // Step 2: perform object search. Get an ObjectSearch object via factory. Depends on fulltext or like search type.
63 $result = $this->searchObjects($query_parser, $cache);
64
65 // Step 3: perform meta keyword search. Get an MetaDataSearch object.
66 $result_meta = $this->searchLOM('keyword', $query_parser, $cache);
67 $result->mergeEntries($result_meta);
68
69 $result_meta = $this->searchLOM('contribute', $query_parser, $cache);
70 $result->mergeEntries($result_meta);
71
72 $result_meta = $this->searchLOM('title', $query_parser, $cache);
73 $result->mergeEntries($result_meta);
74
75 $result_meta = $this->searchLOM('description', $query_parser, $cache);
76 $result->mergeEntries($result_meta);
77
78 // Step 4: Perform details search in object specific tables
79 $result = $this->searchDetails($query_parser, $cache, $result);
80
81
82 // Step 5: merge and validate results
83 $result->filter(
84 $cache->getRoot(),
86 $this->parseStartDateFromCreationFilter($cache),
87 $this->parseEndDateFromCreationFilter($cache),
88 $cache->getCopyrightFilter()
89 );
90 $result->save();
91
96 if (
97 $view_control_infos->currentPage() === $view_control_infos->maxPages() &&
98 $result->isLimitReached()
99 ) {
100 $view_control_infos = $this->presenter->getViewControlInfos(
101 $view_control_infos->sortation(),
102 $view_control_infos->currentPage(),
103 $view_control_infos->maxPages() + 1,
104 $view_control_infos->pageSize(),
105 $view_control_infos->paginationAction(),
106 $view_control_infos->pageParam(),
107 $view_control_infos->sortationAction(),
108 $view_control_infos->sortationParam()
109 );
110 $state_handler->updateMaxPage($view_control_infos->maxPages());
111 }
112
113 $this->renderResults($result, $cache->getQuery(), $view_control_infos);
114 }
115
117 int $usr_id,
118 ilUserSearchCache $cache,
119 ViewControlInfos $view_control_infos
120 ): void {
121 $results = new ilSearchResult($usr_id);
122 $results->read();
123 $results->filterResults($cache->getRoot());
124 $this->renderResults($results, $cache->getQuery(), $view_control_infos);
125 }
126
127 protected function renderResults(
129 string $term,
130 ViewControlInfos $view_control_infos
131 ): void {
132 if ($results->getResults()) {
133 $result_panel_and_modals = $this->presenter->getDirectSearchResultAsPanel(
134 $results,
135 $view_control_infos
136 );
137 $this->tpl->setVariable(
138 'SEARCH_RESULTS',
139 $this->ui_renderer->render($result_panel_and_modals)
140 );
141 } elseif ($term !== '') {
142 $this->tpl->setOnScreenMessage(
143 GlobalTemplate::MESSAGE_TYPE_INFO,
144 sprintf(
145 $this->lng->txt('search_no_match_hint'),
146 $term
147 )
148 );
149 } else {
150 $this->tpl->setOnScreenMessage(
151 GlobalTemplate::MESSAGE_TYPE_INFO,
152 $this->lng->txt('search_no_match')
153 );
154 }
155 }
156
157 protected function parseQueryString(string $term): ilQueryParser|string
158 {
159 $query_parser = new ilQueryParser(ilUtil::stripSlashes($term));
160 $query_parser->setCombination(
161 $this->settings->getDefaultOperator() === ilSearchSettings::OPERATOR_AND ?
163 );
164 $query_parser->parse();
165
166 if (!$query_parser->validate()) {
167 return $query_parser->getMessage();
168 }
169 return $query_parser;
170 }
171
175 protected function searchObjects(
176 ilQueryParser $query_parser,
177 ilUserSearchCache $cache
178 ): ilSearchResult {
179 $obj_search = ilObjectSearchFactory::_getObjectSearchInstance($query_parser);
180 if (($type_filter = $this->parseTypeFilter($cache)) !== []) {
181 $obj_search->setFilter($type_filter);
182 }
183 $this->parseCreationFilter($obj_search, $cache);
184 return $obj_search->performSearch();
185 }
186
187 protected function searchLOM(
188 string $field,
189 ilQueryParser $query_parser,
190 ilUserSearchCache $cache
191 ): ilSearchResult {
192 $meta_search = ilObjectSearchFactory::_getMetaDataSearchInstance($query_parser);
193 if (($type_filter = $this->parseTypeFilter($cache)) !== []) {
194 $meta_search->setFilter($type_filter);
195 }
196 switch ($field) {
197 case 'keyword':
198 $meta_search->setMode('keyword');
199 break;
200
201 case 'contribute':
202 $meta_search->setMode('contribute');
203 break;
204
205 case 'title':
206 $meta_search->setMode('title');
207 break;
208
209 case 'description':
210 $meta_search->setMode('description');
211 break;
212 }
213 return $meta_search->performSearch();
214 }
215
216 protected function searchDetails(
217 ilQueryParser $query_parser,
218 ilUserSearchCache $cache,
219 ilSearchResult $result
220 ): ilSearchResult {
221 foreach ($cache->getItemFilter() as $type => $enabled) {
222 if (!$enabled) {
223 continue;
224 }
225
226 switch ($type) {
227 case 'crs':
228 $crs_search = ilObjectSearchFactory::_getObjectSearchInstance($query_parser);
229 $crs_search->setFilter(['crs']);
230 $result->mergeEntries($crs_search->performSearch());
231 break;
232
233 case 'grp':
234 $grp_search = ilObjectSearchFactory::_getObjectSearchInstance($query_parser);
235 $grp_search->setFilter(['grp']);
236 $result->mergeEntries($grp_search->performSearch());
237 break;
238
239 case 'lms':
240 $content_search = ilObjectSearchFactory::_getLMContentSearchInstance($query_parser);
241 $content_search->setFilter($this->parseTypeFilter($cache));
242 $result->mergeEntries($content_search->performSearch());
243 break;
244
245 case 'frm':
246 $forum_search = ilObjectSearchFactory::_getForumSearchInstance($query_parser);
247 $forum_search->setFilter($this->parseTypeFilter($cache));
248 $result->mergeEntries($forum_search->performSearch());
249 break;
250
251 case 'glo':
252 // Glossary term definition pages
253 $gdf_search = ilObjectSearchFactory::_getLMContentSearchInstance($query_parser);
254 $gdf_search->setFilter(['term']);
255 $result->mergeEntries($gdf_search->performSearch());
256 // Glossary terms
257 $gdf_term_search = ilObjectSearchFactory::_getGlossaryDefinitionSearchInstance($query_parser);
258 $result->mergeEntries($gdf_term_search->performSearch());
259 break;
260
261 case 'exc':
262 $exc_search = ilObjectSearchFactory::_getExerciseSearchInstance($query_parser);
263 $exc_search->setFilter($this->parseTypeFilter($cache));
264 $result->mergeEntries($exc_search->performSearch());
265 break;
266
267 case 'mcst':
268 $mcst_search = ilObjectSearchFactory::_getMediacastSearchInstance($query_parser);
269 $result->mergeEntries($mcst_search->performSearch());
270 break;
271
272 case 'tst':
273 $tst_search = ilObjectSearchFactory::_getTestSearchInstance($query_parser);
274 $tst_search->setFilter($this->parseTypeFilter($cache));
275 $result->mergeEntries($tst_search->performSearch());
276 break;
277
278 case 'mep':
279 $mep_search = ilObjectSearchFactory::_getMediaPoolSearchInstance($query_parser);
280 $mep_search->setFilter($this->parseTypeFilter($cache));
281 $result->mergeEntries($mep_search->performSearch());
282
283 // Mob keyword search
284 $mob_search = ilObjectSearchFactory::_getMediaPoolSearchInstance($query_parser);
285 $mob_search->setFilter($this->parseTypeFilter($cache));
286 $result->mergeEntries($mob_search->performKeywordSearch());
287
288 break;
289
290 case 'wiki':
291 $wiki_search = ilObjectSearchFactory::_getWikiContentSearchInstance($query_parser);
292 $wiki_search->setFilter($this->parseTypeFilter($cache));
293 $result->mergeEntries($wiki_search->performSearch());
294 break;
295 }
296 }
297 return $result;
298 }
299
300 protected function parseCreationFilter(
301 ilObjectSearch $search,
302 ilUserSearchCache $cache
303 ): void {
304 $date_start = $this->parseStartDateFromCreationFilter($cache);
305 $date_end = $this->parseEndDateFromCreationFilter($cache);
306
307 if (is_null($date_start) && is_null($date_end)) {
308 return;
309 }
310
311 $search->setCreationDateFilterStartDate($date_start);
312 $search->setCreationDateFilterEndDate($date_end);
313 }
314
316 {
317 $options = $cache->getCreationFilter();
318 if (!($options['date_start'] ?? false)) {
319 return null;
320 }
321 return new ilDate($options['date_start'], IL_CAL_DATE);
322 }
323
325 {
326 $options = $cache->getCreationFilter();
327 if (!($options['date_end'] ?? false)) {
328 return null;
329 }
330 return new ilDate($options['date_end'], IL_CAL_DATE);
331 }
332
333 protected function parseTypeFilter(ilUserSearchCache $cache): array
334 {
335 $filter = [];
336 foreach ($cache->getItemFilter() as $type => $enabled) {
337 if (!$enabled) {
338 continue;
339 }
340
341 switch ($type) {
342 case 'lms':
343 $filter[] = 'lm';
344 $filter[] = 'pg';
345 $filter[] = 'st';
346 $filter[] = 'sahs';
347 $filter[] = 'htlm';
348 break;
349
350 case 'frm':
351 $filter[] = 'frm';
352 break;
353
354 case 'glo':
355 $filter[] = 'glo';
356 break;
357
358 case 'exc':
359 $filter[] = 'exc';
360 break;
361
362 case 'mcst':
363 $filter[] = 'mcst';
364 break;
365
366 case 'tst':
367 $filter[] = 'tst';
368 $filter[] = 'svy';
369 $filter[] = 'qpl';
370 $filter[] = 'spl';
371 break;
372
373 case 'mep':
374 $filter[] = 'mep';
375 $filter[] = 'mob';
376 break;
377
378 case 'fil':
379 $filter[] = 'file';
380 break;
381
382 case 'wiki':
383 $filter[] = 'wiki';
384 $filter[] = 'wpg';
385 break;
386
387 default:
388 $filter[] = $type;
389 }
390 }
391 return $filter;
392 }
393}
parseCreationFilter(ilObjectSearch $search, ilUserSearchCache $cache)
parseEndDateFromCreationFilter(ilUserSearchCache $cache)
renderResults(ilSearchResult $results, string $term, ViewControlInfos $view_control_infos)
searchLOM(string $field, ilQueryParser $query_parser, ilUserSearchCache $cache)
readSavedResultsAndRenderResults(int $usr_id, ilUserSearchCache $cache, ViewControlInfos $view_control_infos)
searchObjects(ilQueryParser $query_parser, ilUserSearchCache $cache)
Search in object title, desctiption.
__construct(protected ilSearchSettings $settings, protected ilGlobalTemplateInterface $tpl, protected UIRenderer $ui_renderer, protected ResultPresenter $presenter, protected ilLanguage $lng)
performSearchAndRenderResults(int $usr_id, ilUserSearchCache $cache, ViewControlInfos $view_control_infos, SearchStateHandler $state_handler)
Note that the cache doubles here as an actual cache, but also as a data object bundling all inputs ne...
parseTypeFilter(ilUserSearchCache $cache)
searchDetails(ilQueryParser $query_parser, ilUserSearchCache $cache, ilSearchResult $result)
parseStartDateFromCreationFilter(ilUserSearchCache $cache)
const IL_CAL_DATE
Class for single dates.
language handling
static _getObjectSearchInstance(ilQueryParser $query_parser)
static _getForumSearchInstance(ilQueryParser $query_parser)
static _getMediacastSearchInstance(ilQueryParser $query_parser)
static _getGlossaryDefinitionSearchInstance(ilQueryParser $query_parser)
static _getMediaPoolSearchInstance(ilQueryParser $query_parser)
static _getExerciseSearchInstance(ilQueryParser $query_parser)
static _getWikiContentSearchInstance(ilQueryParser $query_parser)
static _getLMContentSearchInstance(ilQueryParser $query_parser)
static _getTestSearchInstance(ilQueryParser $query_parser)
setCreationDateFilterStartDate(?ilDate $day)
setCreationDateFilterEndDate(?ilDate $day)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
mergeEntries(ilSearchResult $result_obj)
merge entries of this instance and another result object
Class for storing search result.
Util class various functions, usage as namespace.
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
Until there is a unified format for search results, rendering also has to be done seperately.
Definition: Searcher.php:31
An entity that renders components to a string output.
Definition: Renderer.php:31
global $lng
Definition: privfeed.php:31
$results
if(!file_exists('../ilias.ini.php'))