18 import(
'lib.pkp.classes.search.SubmissionSearch');
26 $resultCount = count($unorderedResults);
28 foreach ($unorderedResults as $submissionId => &$data) {
30 $data[
'score'] = ($resultCount * $data[
'count']) + $i++;
42 $orderedResults = array();
46 $contextTitles = array();
47 if ($orderBy ==
'popularityAll' || $orderBy ==
'popularityMonth') {
49 $metricType = $application->getDefaultMetricType();
50 if (is_null($metricType)) {
55 $column = STATISTICS_DIMENSION_SUBMISSION_ID;
57 STATISTICS_DIMENSION_ASSOC_TYPE => array(ASSOC_TYPE_GALLEY, ASSOC_TYPE_SUBMISSION),
58 STATISTICS_DIMENSION_SUBMISSION_ID => array(array_keys($unorderedResults))
60 if ($orderBy ==
'popularityMonth') {
61 $oneMonthAgo = date(
'Ymd', strtotime(
'-1 month'));
63 $filter[STATISTICS_DIMENSION_DAY] = array(
'from' => $oneMonthAgo,
'to' => $today);
65 $rawReport = $application->getMetrics($metricType, $column, $filter);
66 foreach ($rawReport as $row) {
67 $unorderedResults[$row[
'submission_id']][
'metric'] = (int)$row[
'metric'];
73 foreach ($unorderedResults as $submissionId => $data) {
75 if (in_array($submissionId, $exclude))
continue;
79 $submission = $submissionDao->getById($submissionId);
80 $orderKey = $submission->getAuthorString();
84 $submission = $submissionDao->getById($submissionId);
86 if (!empty($submission->getCurrentPublication())) {
87 $orderKey = $submission->getCurrentPublication()->getLocalizedData(
'title');
92 if (!isset($contextTitles[$data[
'journal_id']])) {
93 $context = $contextDao->getById($data[
'journal_id']);
94 $contextTitles[$data[
'journal_id']] = $context->getLocalizedName();
96 $orderKey = $contextTitles[$data[
'journal_id']];
99 case 'publicationDate':
100 $orderKey = $data[$orderBy];
103 case 'popularityAll':
104 case 'popularityMonth':
105 $orderKey = (isset($data[
'metric']) ? $data[
'metric'] : 0);
109 $orderKey = $data[
'score'];
111 if (!isset($orderedResults[$orderKey])) {
112 $orderedResults[$orderKey] = array();
114 $orderedResults[$orderKey][$data[
'score'] + $i++] = $submissionId;
118 if (strtolower($orderDir) ==
'asc') {
119 ksort($orderedResults);
121 krsort($orderedResults);
125 $finalOrder = array();
126 foreach($orderedResults as $orderKey => $submissionIds) {
127 if (count($submissionIds) == 1) {
128 $finalOrder[] = array_pop($submissionIds);
130 if (strtolower($orderDir) ==
'asc') {
131 ksort($submissionIds);
133 krsort($submissionIds);
135 $finalOrder = array_merge($finalOrder, array_values($submissionIds));
147 $searchFilters = array(
148 'query' => $request->getUserVar(
'query'),
149 'searchJournal' => $request->getUserVar(
'searchJournal'),
150 'abstract' => $request->getUserVar(
'abstract'),
151 'authors' => $request->getUserVar(
'authors'),
152 'title' => $request->getUserVar(
'title'),
153 'galleyFullText' => $request->getUserVar(
'galleyFullText'),
154 'discipline' => $request->getUserVar(
'discipline'),
155 'subject' => $request->getUserVar(
'subject'),
156 'type' => $request->getUserVar(
'type'),
157 'coverage' => $request->getUserVar(
'coverage'),
158 'indexTerms' => $request->getUserVar(
'indexTerms')
163 $simpleQuery = $request->getUserVar(
'simpleQuery');
164 if (!empty($simpleQuery)) {
167 $searchType = $request->getUserVar(
'searchField');
168 if (array_key_exists($searchType, $searchFilters)) {
169 $searchFilters[$searchType] = $simpleQuery;
174 $fromDate = $request->getUserDateVar(
'dateFrom', 1, 1);
175 $searchFilters[
'fromDate'] = (is_null($fromDate) ? null : date(
'Y-m-d H:i:s', $fromDate));
176 $toDate = $request->getUserDateVar(
'dateTo', 32, 12,
null, 23, 59, 59);
177 $searchFilters[
'toDate'] = (is_null($toDate) ? null : date(
'Y-m-d H:i:s', $toDate));
180 $context = $request->getContext();
181 $siteSearch = !((boolean)$context);
184 if (!empty($searchFilters[
'searchJournal'])) {
185 $context = $contextDao->getById($searchFilters[
'searchJournal']);
186 } elseif (array_key_exists(
'journalTitle', $request->getUserVars())) {
187 $contexts = $contextDao->getAll(
true);
188 while ($context = $contexts->next()) {
190 $request->getUserVar(
'journalTitle'),
191 (array) $context->getTitle(
null)
196 $searchFilters[
'searchJournal'] = $context;
197 $searchFilters[
'siteSearch'] = $siteSearch;
199 return $searchFilters;
210 $indexFieldMap[SUBMISSION_SEARCH_INDEX_TERMS] =
'indexTerms';
212 if (isset($searchFilters[
'query'])) {
213 $keywords[
null] = $searchFilters[
'query'];
215 foreach($indexFieldMap as $bitmap => $searchField) {
216 if (isset($searchFilters[$searchField]) && !empty($searchFilters[$searchField])) {
217 $keywords[$bitmap] = $searchFilters[$searchField];
235 $publishedSubmissionCache = array();
236 $articleCache = array();
237 $contextCache = array();
238 $sectionCache = array();
241 foreach ($results as $articleId) {
243 if (!isset($articleCache[$articleId])) {
245 $publishedSubmissionCache[$articleId] = $submission;
246 $articleCache[$articleId] = $submission;
248 $article = $articleCache[$articleId];
249 $publishedSubmission = $publishedSubmissionCache[$articleId];
251 if ($publishedSubmission && $article) {
252 $sectionId = $article->getSectionId();
253 if (!isset($sectionCache[$sectionId])) {
254 $sectionCache[$sectionId] = $sectionDao->getById($sectionId);
258 $contextId = $article->getData(
'contextId');
259 if (!isset($contextCache[$contextId])) {
260 $contextCache[$contextId] = $contextDao->getById($contextId);
265 'article' => $article,
266 'publishedSubmission' => $publishedSubmissionCache[$articleId],
267 'journal' => $contextCache[$contextId],
268 'section' => $sectionCache[$sectionId]
283 $searchTerms = array();
284 $result =
HookRegistry::call(
'ArticleSearch::getSimilarityTerms', array($submissionId, &$searchTerms));
288 if ($result ===
false) {
291 if ($article->getData(
'status') === STATUS_PUBLISHED) {
295 foreach ($allSearchTerms as $locale => $localeSearchTerms) {
296 $searchTerms += $localeSearchTerms;
306 SUBMISSION_SEARCH_AUTHOR =>
'authors',
307 SUBMISSION_SEARCH_TITLE =>
'title',
308 SUBMISSION_SEARCH_ABSTRACT =>
'abstract',
309 SUBMISSION_SEARCH_GALLEY_FILE =>
'galleyFullText',
310 SUBMISSION_SEARCH_DISCIPLINE =>
'discipline',
311 SUBMISSION_SEARCH_SUBJECT =>
'subject',
312 SUBMISSION_SEARCH_TYPE =>
'type',
313 SUBMISSION_SEARCH_COVERAGE =>
'coverage'
321 $resultSetOrderingOptions = array(
322 'score' => __(
'search.results.orderBy.relevance'),
323 'authors' => __(
'search.results.orderBy.author'),
324 'publicationDate' => __(
'search.results.orderBy.date'),
325 'title' => __(
'search.results.orderBy.article')
330 $metricType = $application->getDefaultMetricType();
331 if (!is_null($metricType)) {
332 $resultSetOrderingOptions[
'popularityAll'] = __(
'search.results.orderBy.popularityAll');
333 $resultSetOrderingOptions[
'popularityMonth'] = __(
'search.results.orderBy.popularityMonth');
337 $context = $request->getContext();
339 $resultSetOrderingOptions[
'journalTitle'] = __(
'search.results.orderBy.journal');
344 'SubmissionSearch::getResultSetOrderingOptions',
345 array($context, &$resultSetOrderingOptions)
348 return $resultSetOrderingOptions;
356 if (in_array($orderBy, array(
'score',
'publicationDate',
'popularityAll',
'popularityMonth'))) {