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;
30use ilLanguage;
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 $filter_query = '';
58 if ($cache->getItemFilter() and ilSearchSettings::getInstance()->isLuceneItemFilterEnabled()) {
59 $filter_settings = ilSearchSettings::getInstance()->getEnabledLuceneItemFilterDefinitions();
60 foreach ($cache->getItemFilter() as $obj => $value) {
61 if (!$filter_query) {
62 $filter_query .= '+( ';
63 } else {
64 $filter_query .= 'OR';
65 }
66 $filter_query .= (' ' . $filter_settings[$obj]['filter'] . ' ');
67 }
68 $filter_query .= ') ';
69 }
70
71 $mime_query = '';
72 if ($cache->getMimeFilter() and ilSearchSettings::getInstance()->isLuceneMimeFilterEnabled()) {
73 $filter_settings = ilSearchSettings::getInstance()->getEnabledLuceneMimeFilterDefinitions();
74 foreach ($cache->getMimeFilter() as $mime => $value) {
75 if (!$mime_query) {
76 $mime_query .= '+( ';
77 } else {
78 $mime_query .= 'OR';
79 }
80 $mime_query .= (' ' . $filter_settings[$mime]['filter'] . ' ');
81 }
82 $mime_query .= ') ';
83 }
84
85 $cdate_query = $this->parseCreationFilter($cache);
86 $copyright_query = $this->parseCopyrightFilter($cache);
87
88 $filter_query = $filter_query . ' ' . $mime_query . ' ' . $cdate_query . ' ' . $copyright_query;
89
90 $query = $cache->getQuery();
91 if ($query) {
92 $query = ' +(' . $query . ')';
93 }
94 $qp = new ilLuceneQueryParser($filter_query . $query);
95 $qp->parse();
96 $searcher = ilLuceneSearcher::getInstance($qp);
97 $searcher->search();
98
99 // Filter results
101 $filter->addFilter(new ilLucenePathFilter($cache->getRoot()));
102 $filter->setCandidates($searcher->getResult());
103 $filter->filter();
104
105 if ($filter->getResultObjIds()) {
106 $searcher->highlight($filter->getResultObjIds());
107 }
108
113 if (
114 $view_control_infos->currentPage() === $view_control_infos->maxPages() &&
115 $filter->isLimitReached()
116 ) {
117 $view_control_infos = $this->presenter->getViewControlInfos(
118 $view_control_infos->sortation(),
119 $view_control_infos->currentPage(),
120 $view_control_infos->maxPages() + 1,
121 $view_control_infos->pageSize(),
122 $view_control_infos->paginationAction(),
123 $view_control_infos->pageParam(),
124 $view_control_infos->sortationAction(),
125 $view_control_infos->sortationParam()
126 );
127 $state_handler->updateMaxPage($view_control_infos->maxPages());
128 }
129
130 $this->renderResults($filter, $searcher->getHighlighter(), $cache->getQuery(), $view_control_infos);
131 }
132
134 int $usr_id,
135 ilUserSearchCache $cache,
136 ViewControlInfos $view_control_infos
137 ): void {
138 if (!strlen($cache->getQuery())) {
139 $this->tpl->setOnScreenMessage(
141 $this->lng->txt('search_no_match')
142 );
143 return;
144 }
145
146 $qp = new ilLuceneQueryParser($cache->getQuery());
147 $qp->parse();
148 $searcher = ilLuceneSearcher::getInstance($qp);
149 $searcher->search();
150
151 // Load saved results
153 $filter->loadFromDb();
154
155 // Highlight
156 $searcher->highlight($filter->getResultObjIds());
157
158 $this->renderResults($filter, $searcher->getHighlighter(), $cache->getQuery(), $view_control_infos);
159 }
160
161 protected function renderResults(
164 string $term,
165 ViewControlInfos $view_control_infos
166 ): void {
167 if ($filter->getResults() && $highlighter !== null) {
168 $result_panel_and_modals = $this->presenter->getLuceneSearchResultAsPanel(
169 $filter,
170 $highlighter,
171 $view_control_infos
172 );
173 $this->tpl->setVariable(
174 'SEARCH_RESULTS',
175 $this->presenter->replacePlaceholders($this->ui_renderer->render($result_panel_and_modals))
176 );
177 } elseif ($term !== '') {
178 $this->tpl->setOnScreenMessage(
179 GlobalTemplate::MESSAGE_TYPE_INFO,
180 sprintf(
181 $this->lng->txt('search_no_match_hint'),
182 $term
183 )
184 );
185 } else {
186 $this->tpl->setOnScreenMessage(
187 GlobalTemplate::MESSAGE_TYPE_INFO,
188 $this->lng->txt('search_no_match')
189 );
190 }
191 }
192
193 protected function parseCreationFilter(ilUserSearchCache $cache): string
194 {
195 $options = $cache->getCreationFilter();
196
197 if (!($options['date_start'] ?? false) && !($options['date_end'] ?? false)) {
198 return '';
199 }
200
201 $start = null;
202 $end = null;
203 if (($options['date_start'] ?? false)) {
204 $start = new ilDate($options['date_start'] ?? "", IL_CAL_DATE);
205 }
206 if (($options['date_end'] ?? false)) {
207 $end = new ilDate($options['date_end'] ?? "", IL_CAL_DATE);
208 }
209
210 if ($start && is_null($end)) {
211 $now = new ilDate(time(), IL_CAL_UNIX);
212 return '+(cdate:[' . $start->get(IL_CAL_DATE) . ' TO ' . $now->get(IL_CAL_DATE) . '*]) ';
213 } elseif ($end && is_null($start)) {
214 return '+(cdate:[* TO ' . $end->get(IL_CAL_DATE) . ']) ';
215 } else {
216 return '+(cdate:[' . $start->get(IL_CAL_DATE) . ' TO ' . $end->get(IL_CAL_DATE) . '*]) ';
217 }
218
219 return '';
220 }
221
222 protected function parseCopyrightFilter(ilUserSearchCache $cache): string
223 {
224 $identifiers = $cache->getCopyrightFilter();
225 if ($identifiers === []) {
226 return '';
227 }
228
229 $conditions = [];
230 foreach ($identifiers as $identifier) {
231 $conditions[] = 'lomCopyright:"' . $identifier . '"';
232 }
233 return '+(' . implode(' OR ', $conditions) . ')';
234 }
235}
renderResults(ilLuceneSearchResultFilter $filter, ?ilLuceneHighlighterResultParser $highlighter, string $term, ViewControlInfos $view_control_infos)
readSavedResultsAndRenderResults(int $usr_id, ilUserSearchCache $cache, ViewControlInfos $view_control_infos)
parseCreationFilter(ilUserSearchCache $cache)
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...
parseCopyrightFilter(ilUserSearchCache $cache)
__construct(protected ilSearchSettings $settings, protected ilGlobalTemplateInterface $tpl, protected UIRenderer $ui_renderer, protected ResultPresenter $presenter, protected ilLanguage $lng)
const IL_CAL_DATE
const IL_CAL_UNIX
Class for single dates.
language handling
Parses result XML from lucene search highlight.
Validate Lucene search results Do access checks, create ref_ids from obj_ids...
Reads and parses lucene search results.
static getInstance(ilLuceneQueryParser $qp)
Get singleton instance.
Class for storing search result.
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
if(!file_exists('../ilias.ini.php'))