Open Journal Systems  3.3.0
CounterReportAR1.inc.php
1 <?php
2 
15 import('plugins.reports.counter.classes.CounterReport');
16 
22  function getTitle() {
23  return __('plugins.reports.counter.ar1.title');
24  }
25 
26  /*
27  * Convert an OJS metrics request to a COUNTER ReportItem
28  * @param $columns string|array column (aggregation level) selection
29  * @param $filters array report-level filter selection
30  * @param $orderBy array order criteria
31  * @param $range null|DBResultRange paging specification
32  * @see ReportPlugin::getMetrics for more details
33  * @return array COUNTER\ReportItem
34  */
35  function getReportItems($columns = array(), $filters = array(), $orderBy = array(), $range = null) {
36  $metricsDao = DAORegistry::getDAO('MetricsDAO'); /* @var $metricsDao MetricsDAO */
37 
38  // Columns are fixed for this report
39  $defaultColumns = array(STATISTICS_DIMENSION_MONTH, STATISTICS_DIMENSION_SUBMISSION_ID);
40  if ($columns && array_diff($columns, $defaultColumns)) {
41  $this->setError(new Exception(__('plugins.reports.counter.exception.column'), COUNTER_EXCEPTION_WARNING | COUNTER_EXCEPTION_BAD_COLUMNS));
42  }
43  // Check filters for correct context(s)
44  $validFilters = $this->filterForContext($filters);
45  // Filters defaults to last month, but can be provided by month or by day
46  if (!isset($filters[STATISTICS_DIMENSION_MONTH]) && !isset($filters[STATISTICS_DIMENSION_DAY])) {
47  $validFilters[STATISTICS_DIMENSION_MONTH] = array(
48  'from' => date_format(date_create("first day of previous month"), 'Ymd'),
49  'to' => date_format(date_create("last day of previous month"), 'Ymd')
50  );
51  } elseif (isset($filters[STATISTICS_DIMENSION_MONTH])) {
52  $validFilters[STATISTICS_DIMENSION_MONTH] = $filters[STATISTICS_DIMENSION_MONTH];
53  unset($filters[STATISTICS_DIMENSION_MONTH]);
54  } elseif (isset($filters[STATISTICS_DIMENSION_DAY])) {
55  $validFilters[STATISTICS_DIMENSION_DAY] = $filters[STATISTICS_DIMENSION_DAY];
56  unset($filters[STATISTICS_DIMENSION_DAY]);
57  }
58  if (!isset($filters[STATISTICS_DIMENSION_ASSOC_TYPE])) {
59  $validFilters[STATISTICS_DIMENSION_ASSOC_TYPE] = ASSOC_TYPE_SUBMISSION_FILE;
60  unset($filters[STATISTICS_DIMENSION_ASSOC_TYPE]);
61  } elseif ($filters[STATISTICS_DIMENSION_ASSOC_TYPE] != ASSOC_TYPE_SUBMISSION_FILE) {
62  $this->setError(new Exception(__('plugins.reports.counter.exception.filter'), COUNTER_EXCEPTION_ERROR | COUNTER_EXCEPTION_BAD_FILTERS));
63  }
64  // AR1 could be filtered to the Journal, Issue, or Article level
65  foreach ($filters as $key => $filter) {
66  switch ($key) {
67  case STATISTICS_DIMENSION_CONTEXT_ID:
68  case STATISTICS_DIMENSION_ISSUE_ID:
69  case STATISTICS_DIMENSION_SUBMISSION_ID:
70  $validFilters[$key] = $filter;
71  unset($filters[$key]);
72  }
73  }
74  // Unrecognized filters raise an error
75  if (array_keys($filters)) {
76  $this->setError(new Exception(__('plugins.reports.counter.exception.filter'), COUNTER_EXCEPTION_WARNING | COUNTER_EXCEPTION_BAD_FILTERS));
77  }
78  // Metric type is ojs::counter
79  $metricType = METRIC_TYPE_COUNTER;
80  // Ordering must be by Journal (ReportItem), and by Month (ItemPerformance) for JR1
81  $validOrder = array(STATISTICS_DIMENSION_SUBMISSION_ID => STATISTICS_ORDER_DESC, STATISTICS_DIMENSION_MONTH => STATISTICS_ORDER_ASC);
82  // TODO: range
83  $results = $metricsDao->getMetrics($metricType, $defaultColumns, $validFilters, $validOrder);
84  $reportItems = array();
85  if ($results) {
86  // We'll create a new Report Item with these Metrics on a article change
87  $metrics = array();
88  $lastArticle = 0;
89  foreach ($results as $rs) {
90  // Article changes trigger a new ReportItem
91  if ($lastArticle != $rs[STATISTICS_DIMENSION_SUBMISSION_ID]) {
92  if ($lastArticle != 0 && $metrics) {
93  $item = $this->_createReportItem($lastArticle, $metrics);
94  if ($item) {
95  $reportItems[] = $item;
96  } else {
97  $this->setError(new Exception(__('plugins.reports.counter.exception.partialData'), COUNTER_EXCEPTION_WARNING | COUNTER_EXCEPTION_PARTIAL_DATA));
98  }
99  $metrics = array();
100  }
101  }
102  $metrics[] = $this->createMetricByMonth($rs[STATISTICS_DIMENSION_MONTH], array(new COUNTER\PerformanceCounter('ft_total', $rs[STATISTICS_METRIC])));
103  $lastArticle = $rs[STATISTICS_DIMENSION_SUBMISSION_ID];
104  }
105  // Capture the last unprocessed ItemPerformance and ReportItem entries, if applicable
106  if ($metrics) {
107  $item = $this->_createReportItem($lastArticle, $metrics);
108  if ($item) {
109  $reportItems[] = $item;
110  } else {
111  $this->setError(new Exception(__('plugins.reports.counter.exception.partialData'), COUNTER_EXCEPTION_WARNING | COUNTER_EXCEPTION_PARTIAL_DATA));
112  }
113  }
114  } else {
115  $this->setError(new Exception(__('plugins.reports.counter.exception.noData'), COUNTER_EXCEPTION_ERROR | COUNTER_EXCEPTION_NO_DATA));
116  }
117  return $reportItems;
118  }
119 
126  private function _createReportItem($submissionId, $metrics) {
127  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
128  $article = $submissionDao->getById($submissionId);
129  if (!$article) {
130  return false;
131  }
132  $title = $article->getLocalizedTitle();
133  $journalId = $article->getContextId();
134  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
135  $journal = $journalDao->getById($journalId);
136  if (!$journal) {
137  return false;
138  }
139  $journalName = $journal->getLocalizedName();
140  $journalPubIds = array();
141  foreach (array('print', 'online') as $issnType) {
142  if ($journal->getData($issnType.'Issn')) {
143  try {
144  $journalPubIds[] = new COUNTER\Identifier(ucfirst($issnType).'_ISSN', $journal->getData($issnType.'Issn'));
145  } catch (Exception $ex) {
146  // Just ignore it
147  }
148  }
149  }
150  $journalPubIds[] = new COUNTER\Identifier(COUNTER_LITERAL_PROPRIETARY, $journal->getPath());
151  $pubIdPlugins = PluginRegistry::loadCategory('pubIds', true, $journalId);
152  $articlePubIds = array();
153  $articlePubIds[] = new COUNTER\Identifier(COUNTER_LITERAL_PROPRIETARY, $submissionId);
154  foreach ($pubIdPlugins as $pubIdPlugin) {
155  $pubId = $article->getStoredPubId($pubIdPlugin->getPubIdType(), true);
156  if ($pubId) {
157  switch ($pubIdPlugin->getPubIdType()) {
158  case 'doi':
159  try {
160  $articlePubIds[] = new COUNTER\Identifier(strtoupper($pubIdPlugin->getPubIdType()), $pubId);
161  } catch (Exception $ex) {
162  // Just ignore it
163  }
164  break;
165  default:
166  }
167  }
168  }
169  $reportItem = array();
170  try {
171  $reportItem = new COUNTER\ReportItems(
172  __('common.software'),
173  $title,
174  COUNTER_LITERAL_ARTICLE,
175  $metrics,
176  new COUNTER\ParentItem($journalName, COUNTER_LITERAL_JOURNAL, $journalPubIds),
177  $articlePubIds
178  );
179  } catch (Exception $e) {
180  $this->setError($e, COUNTER_EXCEPTION_ERROR | COUNTER_EXCEPTION_INTERNAL);
181  }
182  return $reportItem;
183  }
184 
185 }
186 
187 
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
CounterReport
A COUNTER report, base class.
Definition: CounterReport.inc.php:33
CounterReport\filterForContext
filterForContext($filters)
Definition: CounterReport.inc.php:143
COUNTER\Identifier
Definition: COUNTER.php:1499
CounterReport\setError
setError($error)
Definition: CounterReport.inc.php:131
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
CounterReportAR1\getReportItems
getReportItems($columns=array(), $filters=array(), $orderBy=array(), $range=null)
Definition: CounterReportAR1.inc.php:35
CounterReportAR1\getTitle
getTitle()
Definition: CounterReportAR1.inc.php:22
COUNTER\ReportItems
Definition: COUNTER.php:984
CounterReportAR1
Definition: CounterReportAR1.inc.php:17
COUNTER
Definition: COUNTER.php:20
CounterReport\createMetricByMonth
createMetricByMonth($period, $counters)
Definition: CounterReport.inc.php:163