18 import(
'lib.pkp.classes.search.SubmissionSearch');
24 public function getSparseArray($unorderedResults, $orderBy, $orderDir, $exclude) {
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') {
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 'issuePublicationDate':
100 case 'publicationDate':
101 $orderKey = $data[$orderBy];
104 case 'popularityAll':
105 case 'popularityMonth':
106 $orderKey = (isset($data[
'metric']) ? $data[
'metric'] : 0);
110 $orderKey = $data[
'score'];
112 if (!isset($orderedResults[$orderKey])) {
113 $orderedResults[$orderKey] = array();
115 $orderedResults[$orderKey][$data[
'score'] + $i++] = $submissionId;
119 if (strtolower($orderDir) ==
'asc') {
120 ksort($orderedResults);
122 krsort($orderedResults);
126 $finalOrder = array();
127 foreach($orderedResults as $orderKey => $submissionIds) {
128 if (count($submissionIds) == 1) {
129 $finalOrder[] = array_pop($submissionIds);
131 if (strtolower($orderDir) ==
'asc') {
132 ksort($submissionIds);
134 krsort($submissionIds);
136 $finalOrder = array_merge($finalOrder, array_values($submissionIds));
148 $searchFilters = array(
149 'query' => $request->getUserVar(
'query'),
150 'searchJournal' => $request->getUserVar(
'searchJournal'),
151 'abstract' => $request->getUserVar(
'abstract'),
152 'authors' => $request->getUserVar(
'authors'),
153 'title' => $request->getUserVar(
'title'),
154 'galleyFullText' => $request->getUserVar(
'galleyFullText'),
155 'discipline' => $request->getUserVar(
'discipline'),
156 'subject' => $request->getUserVar(
'subject'),
157 'type' => $request->getUserVar(
'type'),
158 'coverage' => $request->getUserVar(
'coverage'),
159 'indexTerms' => $request->getUserVar(
'indexTerms')
164 $simpleQuery = $request->getUserVar(
'simpleQuery');
165 if (!empty($simpleQuery)) {
168 $searchType = $request->getUserVar(
'searchField');
169 if (array_key_exists($searchType, $searchFilters)) {
170 $searchFilters[$searchType] = $simpleQuery;
175 $fromDate = $request->getUserDateVar(
'dateFrom', 1, 1);
176 $searchFilters[
'fromDate'] = (is_null($fromDate) ? null : date(
'Y-m-d H:i:s', $fromDate));
177 $toDate = $request->getUserDateVar(
'dateTo', 32, 12,
null, 23, 59, 59);
178 $searchFilters[
'toDate'] = (is_null($toDate) ? null : date(
'Y-m-d H:i:s', $toDate));
181 $context = $request->getContext();
182 $siteSearch = !((boolean)$context);
185 if (!empty($searchFilters[
'searchJournal'])) {
186 $context = $contextDao->getById($searchFilters[
'searchJournal']);
187 } elseif (array_key_exists(
'journalTitle', $request->getUserVars())) {
188 $contexts = $contextDao->getAll(
true);
189 while ($context = $contexts->next()) {
191 $request->getUserVar(
'journalTitle'),
192 (array) $context->getTitle(
null)
197 $searchFilters[
'searchJournal'] = $context;
198 $searchFilters[
'siteSearch'] = $siteSearch;
200 return $searchFilters;
211 $indexFieldMap[SUBMISSION_SEARCH_INDEX_TERMS] =
'indexTerms';
213 if (isset($searchFilters[
'query'])) {
214 $keywords[
null] = $searchFilters[
'query'];
216 foreach($indexFieldMap as $bitmap => $searchField) {
217 if (isset($searchFilters[$searchField]) && !empty($searchFilters[$searchField])) {
218 $keywords[$bitmap] = $searchFilters[$searchField];
237 $publishedSubmissionCache = array();
238 $articleCache = array();
239 $issueCache = array();
240 $issueAvailabilityCache = array();
241 $contextCache = array();
242 $sectionCache = array();
245 foreach ($results as $articleId) {
247 if (!isset($articleCache[$articleId])) {
249 $publishedSubmissionCache[$articleId] = $submission;
250 $articleCache[$articleId] = $submission;
252 $article = $articleCache[$articleId];
253 $publishedSubmission = $publishedSubmissionCache[$articleId];
255 if ($publishedSubmission && $article) {
256 $sectionId = $article->getSectionId();
257 if (!isset($sectionCache[$sectionId])) {
258 $sectionCache[$sectionId] = $sectionDao->getById($sectionId);
262 $contextId = $article->getData(
'contextId');
263 if (!isset($contextCache[$contextId])) {
264 $contextCache[$contextId] = $contextDao->getById($contextId);
268 $issueId = $publishedSubmission->getCurrentPublication()->getData(
'issueId');
269 if (!isset($issueCache[$issueId])) {
270 $issue = $issueDao->getById($issueId);
271 $issueCache[$issueId] = $issue;
272 import(
'classes.issue.IssueAction');
274 $issueAvailabilityCache[$issueId] = !$issueAction->subscriptionRequired($issue, $contextCache[$contextId]) || $issueAction->subscribedUser($user, $contextCache[$contextId], $issueId, $articleId) || $issueAction->subscribedDomain(
Application::get()->getRequest(), $contextCache[$contextId], $issueId, $articleId);
278 if (!isset($issueCache[$issueId]) || !$issueCache[$issueId]->getPublished())
continue;
282 'article' => $article,
283 'publishedSubmission' => $publishedSubmissionCache[$articleId],
284 'issue' => $issueCache[$issueId],
285 'journal' => $contextCache[$contextId],
286 'issueAvailable' => $issueAvailabilityCache[$issueId],
287 'section' => $sectionCache[$sectionId]
302 $searchTerms = array();
303 $result =
HookRegistry::call(
'ArticleSearch::getSimilarityTerms', array($submissionId, &$searchTerms));
307 if ($result ===
false) {
310 if ($article->getData(
'status') === STATUS_PUBLISHED) {
314 foreach ($allSearchTerms as $locale => $localeSearchTerms) {
315 $searchTerms += $localeSearchTerms;
325 SUBMISSION_SEARCH_AUTHOR =>
'authors',
326 SUBMISSION_SEARCH_TITLE =>
'title',
327 SUBMISSION_SEARCH_ABSTRACT =>
'abstract',
328 SUBMISSION_SEARCH_GALLEY_FILE =>
'galleyFullText',
329 SUBMISSION_SEARCH_DISCIPLINE =>
'discipline',
330 SUBMISSION_SEARCH_SUBJECT =>
'subject',
331 SUBMISSION_SEARCH_TYPE =>
'type',
332 SUBMISSION_SEARCH_COVERAGE =>
'coverage'
340 $resultSetOrderingOptions = array(
341 'score' => __(
'search.results.orderBy.relevance'),
342 'authors' => __(
'search.results.orderBy.author'),
343 'issuePublicationDate' => __(
'search.results.orderBy.issue'),
344 'publicationDate' => __(
'search.results.orderBy.date'),
345 'title' => __(
'search.results.orderBy.article')
351 if (!is_null($metricType)) {
352 $resultSetOrderingOptions[
'popularityAll'] = __(
'search.results.orderBy.popularityAll');
353 $resultSetOrderingOptions[
'popularityMonth'] = __(
'search.results.orderBy.popularityMonth');
357 $context = $request->getContext();
359 $resultSetOrderingOptions[
'journalTitle'] = __(
'search.results.orderBy.journal');
364 'SubmissionSearch::getResultSetOrderingOptions',
365 array($context, &$resultSetOrderingOptions)
368 return $resultSetOrderingOptions;
376 if (in_array($orderBy, array(
'score',
'publicationDate',
'issuePublicationDate',
'popularityAll',
'popularityMonth'))) {