Open Journal Systems  3.3.0
CounterReportJR1.inc.php
1 <?php
2 
15 import('plugins.reports.counter.classes.CounterReport');
16 
22  function getTitle() {
23  return __('plugins.reports.counter.jr1.title');
24  }
25 
26  /*
27  * Convert an OJS metrics request to COUNTER ReportItems
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 array
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_FILE_TYPE, STATISTICS_DIMENSION_CONTEXT_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  // Any further filters aren't recognized (at this time, at least)
65  if (array_keys($filters)) {
66  $this->setError(new Exception(__('plugins.reports.counter.exception.filter'), COUNTER_EXCEPTION_WARNING | COUNTER_EXCEPTION_BAD_FILTERS));
67  }
68  // Metric type is ojs::counter
69  $metricType = METRIC_TYPE_COUNTER;
70  // Ordering must be by Journal (ReportItem), and by Month (ItemPerformance) for JR1
71  $validOrder = array(STATISTICS_DIMENSION_CONTEXT_ID => STATISTICS_ORDER_DESC, STATISTICS_DIMENSION_MONTH => STATISTICS_ORDER_ASC);
72  // TODO: range
73  $results = $metricsDao->getMetrics($metricType, $defaultColumns, $validFilters, $validOrder);
74  $reportItems = array();
75  if ($results) {
76  // We'll create a new Report Item with these Metrics on a journal change
77  $metrics = array();
78  // We'll create a new Metric with these Performance Counters on a period change
79  $counters = array();
80  $lastPeriod = 0;
81  $lastJournal = 0;
82  foreach ($results as $rs) {
83  // Identify the type of request
84  $metricTypeKey = $this->getKeyForFiletype($rs[STATISTICS_DIMENSION_FILE_TYPE]);
85  // Period changes or greater trigger a new ItemPerformace metric
86  if ($lastPeriod != $rs[STATISTICS_DIMENSION_MONTH] || $lastJournal != $rs[STATISTICS_DIMENSION_CONTEXT_ID]) {
87  if ($lastPeriod != 0) {
88  $metrics[] = $this->createMetricByMonth($lastPeriod, $counters);
89  $counters = array();
90  }
91  }
92  $lastPeriod = $rs[STATISTICS_DIMENSION_MONTH];
93  $counters[] = new COUNTER\PerformanceCounter($metricTypeKey, $rs[STATISTICS_METRIC]);
94  // Journal changes trigger a new ReportItem
95  if ($lastJournal != $rs[STATISTICS_DIMENSION_CONTEXT_ID]) {
96  if ($lastJournal != 0 && $metrics) {
97  $item = $this->_createReportItem($lastJournal, $metrics);
98  if ($item) {
99  $reportItems[] = $item;
100  } else {
101  $this->setError(new Exception(__('plugins.reports.counter.exception.partialData'), COUNTER_EXCEPTION_WARNING | COUNTER_EXCEPTION_PARTIAL_DATA));
102  }
103  $metrics = array();
104  }
105  }
106  $lastJournal = $rs[STATISTICS_DIMENSION_CONTEXT_ID];
107  }
108  // Capture the last unprocessed ItemPerformance and ReportItem entries, if applicable
109  if ($counters) {
110  $metrics[] = $this->createMetricByMonth($lastPeriod, $counters);
111  }
112  if ($metrics) {
113  $item = $this->_createReportItem($lastJournal, $metrics);
114  if ($item) {
115  $reportItems[] = $item;
116  } else {
117  $this->setError(new Exception(__('plugins.reports.counter.exception.partialData'), COUNTER_EXCEPTION_WARNING | COUNTER_EXCEPTION_PARTIAL_DATA));
118  }
119  }
120  } else {
121  $this->setError(new Exception(__('plugins.reports.counter.exception.noData'), COUNTER_EXCEPTION_ERROR | COUNTER_EXCEPTION_NO_DATA));
122  }
123  return $reportItems;
124  }
125 
132  private function _createReportItem($journalId, $metrics) {
133  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
134  $journal = $journalDao->getById($journalId);
135  if (!$journal) {
136  return false;
137  }
138  $journalName = $journal->getLocalizedName();
139  $journalPubIds = array();
140  foreach (array('print', 'online') as $issnType) {
141  if ($journal->getData($issnType.'Issn')) {
142  try {
143  $journalPubIds[] = new COUNTER\Identifier(ucfirst($issnType).'_ISSN', $journal->getData($issnType.'Issn'));
144  } catch (Exception $ex) {
145  // Just ignore it
146  }
147  }
148  }
149  $journalPubIds[] = new COUNTER\Identifier(COUNTER_LITERAL_PROPRIETARY, $journal->getPath());
150  $reportItem = array();
151  try {
152  $reportItem = new COUNTER\ReportItems(__('common.software'), $journalName, COUNTER_LITERAL_JOURNAL, $metrics, NULL, $journalPubIds);
153  } catch (Exception $e) {
154  $this->setError($e, COUNTER_EXCEPTION_ERROR | COUNTER_EXCEPTION_INTERNAL);
155  }
156  return $reportItem;
157  }
158 
159 }
160 
161 
CounterReportJR1\getReportItems
getReportItems($columns=array(), $filters=array(), $orderBy=array(), $range=null)
Definition: CounterReportJR1.inc.php:35
CounterReportJR1\getTitle
getTitle()
Definition: CounterReportJR1.inc.php:22
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
COUNTER\ReportItems
Definition: COUNTER.php:984
COUNTER\PerformanceCounter
Definition: COUNTER.php:1911
CounterReportJR1
Journal Report 1.
Definition: CounterReportJR1.inc.php:17
CounterReport\getKeyForFiletype
getKeyForFiletype($filetype)
Definition: CounterReport.inc.php:81
CounterReport\createMetricByMonth
createMetricByMonth($period, $counters)
Definition: CounterReport.inc.php:163