Open Journal Systems  3.3.0
OAIDAO.inc.php
1 <?php
2 
17 import('lib.pkp.classes.oai.PKPOAIDAO');
18 import('classes.issue.Issue');
19 
20 class OAIDAO extends PKPOAIDAO {
21 
26  var $issueDao;
28 
32 
36  function __construct() {
37  parent::__construct();
38  $this->journalDao = DAORegistry::getDAO('JournalDAO');
39  $this->sectionDao = DAORegistry::getDAO('SectionDAO');
40  $this->articleGalleyDao = DAORegistry::getDAO('ArticleGalleyDAO');
41  $this->issueDao = DAORegistry::getDAO('IssueDAO');
42  $this->authorDao = DAORegistry::getDAO('AuthorDAO');
43 
44  $this->journalCache = array();
45  $this->sectionCache = array();
46  }
47 
52  }
53 
59  function &getJournal($journalId) {
60  if (!isset($this->journalCache[$journalId])) {
61  $this->journalCache[$journalId] = $this->journalDao->getById($journalId);
62  }
63  return $this->journalCache[$journalId];
64  }
65 
71  function &getIssue($issueId) {
72  if (!isset($this->issueCache[$issueId])) {
73  $this->issueCache[$issueId] = $this->issueDao->getById($issueId);
74  }
75  return $this->issueCache[$issueId];
76  }
77 
83  function &getSection($sectionId) {
84  if (!isset($this->sectionCache[$sectionId])) {
85  $this->sectionCache[$sectionId] = $this->sectionDao->getById($sectionId);
86  }
87  return $this->sectionCache[$sectionId];
88  }
89 
90 
91  //
92  // Sets
93  //
101  function &getJournalSets($journalId, $offset, $limit, &$total) {
102  if (isset($journalId)) {
103  $journals = array($this->journalDao->getById($journalId));
104  } else {
105  $journals = $this->journalDao->getAll(true);
106  $journals = $journals->toArray();
107  }
108 
109  // FIXME Set descriptions
110  $sets = array();
111  foreach ($journals as $journal) {
112  $title = $journal->getLocalizedName();
113  $abbrev = $journal->getPath();
114  array_push($sets, new OAISet(urlencode($abbrev), $title, ''));
115 
116  $tombstoneDao = DAORegistry::getDAO('DataObjectTombstoneDAO'); /* @var $tombstoneDao DataObjectTombstoneDAO */
117  $articleTombstoneSets = $tombstoneDao->getSets(ASSOC_TYPE_JOURNAL, $journal->getId());
118 
119  $sections = $this->sectionDao->getByJournalId($journal->getId());
120  foreach ($sections->toArray() as $section) {
121  if (array_key_exists(urlencode($abbrev) . ':' . urlencode($section->getLocalizedAbbrev()), $articleTombstoneSets)) {
122  unset($articleTombstoneSets[urlencode($abbrev) . ':' . urlencode($section->getLocalizedAbbrev())]);
123  }
124  array_push($sets, new OAISet(urlencode($abbrev) . ':' . urlencode($section->getLocalizedAbbrev()), $section->getLocalizedTitle(), ''));
125  }
126  foreach ($articleTombstoneSets as $articleTombstoneSetSpec => $articleTombstoneSetName) {
127  array_push($sets, new OAISet($articleTombstoneSetSpec, $articleTombstoneSetName, ''));
128  }
129  }
130 
131  HookRegistry::call('OAIDAO::getJournalSets', array($this, $journalId, $offset, $limit, $total, &$sets));
132 
133  $total = count($sets);
134  $sets = array_slice($sets, $offset, $limit);
135 
136  return $sets;
137  }
138 
146  function getSetJournalSectionId($journalSpec, $sectionSpec, $restrictJournalId = null) {
147  $journal =& $this->journalDao->getByPath($journalSpec);
148  if (!isset($journal) || (isset($restrictJournalId) && $journal->getId() != $restrictJournalId)) {
149  return array(0, 0);
150  }
151 
152  $journalId = $journal->getId();
153  $sectionId = null;
154 
155  if (isset($sectionSpec)) {
156  $section = $this->sectionDao->getByAbbrev($sectionSpec, $journal->getId());
157  if (isset($section)) {
158  $sectionId = $section->getId();
159  } else {
160  $sectionId = 0;
161  }
162  }
163 
164  return array($journalId, $sectionId);
165  }
166 
167  //
168  // Protected methods.
169  //
173  function setOAIData($record, $row, $isRecord = true) {
174  $journal = $this->getJournal($row['journal_id']);
175  $section = $this->getSection($row['section_id']);
176  $articleId = $row['submission_id'];
177 
178  $record->identifier = $this->oai->articleIdToIdentifier($articleId);
179  $record->sets = array(urlencode($journal->getPath()) . ':' . urlencode($section->getLocalizedAbbrev()));
180 
181  if ($isRecord) {
182  $submission = Services::get('submission')->get($articleId);
183  $issue = $this->getIssue($row['issue_id']);
184  $galleys = $this->articleGalleyDao->getByPublicationId($submission->getCurrentPublication()->getId())->toArray();
185 
186  $record->setData('article', $submission);
187  $record->setData('journal', $journal);
188  $record->setData('section', $section);
189  $record->setData('issue', $issue);
190  $record->setData('galleys', $galleys);
191  }
192 
193  return $record;
194  }
195 
207  function _getRecordsRecordSet($setIds, $from, $until, $set, $submissionId = null, $orderBy = 'journal_id, submission_id') {
208  $journalId = array_shift($setIds);
209  $sectionId = array_shift($setIds);
210 
211  $params = array('enableOai', (int) STATUS_PUBLISHED);
212  if (isset($journalId)) $params[] = (int) $journalId;
213  if (isset($sectionId)) $params[] = (int) $sectionId;
214  if ($submissionId) $params[] = (int) $submissionId;
215  if (isset($journalId)) $params[] = (int) $journalId;
216  if (isset($sectionId)) $params[] = (int) $sectionId;
217  if (isset($set)) {
218  $params[] = $set;
219  $params[] = $set . ':%';
220  }
221  if ($submissionId) $params[] = (int) $submissionId;
222  $result = $this->retrieve(
223  'SELECT GREATEST(a.last_modified, i.last_modified) AS last_modified,
224  a.submission_id AS submission_id,
225  j.journal_id AS journal_id,
226  s.section_id AS section_id,
227  i.issue_id,
228  NULL AS tombstone_id,
229  NULL AS set_spec,
230  NULL AS oai_identifier
231  FROM
232  submissions a
233  JOIN publications p ON (a.current_publication_id = p.publication_id)
234  JOIN publication_settings psissue ON (psissue.publication_id = p.publication_id AND psissue.setting_name=\'issueId\')
235  JOIN issues i ON (CAST(i.issue_id AS CHAR) = psissue.setting_value)
236  JOIN sections s ON (s.section_id = p.section_id)
237  JOIN journals j ON (j.journal_id = a.context_id)
238  JOIN journal_settings jsoai ON (jsoai.journal_id = j.journal_id AND jsoai.setting_name=? AND jsoai.setting_value=\'1\')
239  WHERE i.published = 1 AND j.enabled = 1 AND a.status = ?
240  ' . (isset($journalId) ?' AND j.journal_id = ?':'') . '
241  ' . (isset($sectionId) ?' AND p.section_id = ?':'') . '
242  ' . ($from?' AND GREATEST(a.last_modified, i.last_modified) >= ' . $this->datetimeToDB($from):'') . '
243  ' . ($until?' AND GREATEST(a.last_modified, i.last_modified) <= ' . $this->datetimeToDB($until):'') . '
244  ' . ($submissionId?' AND a.submission_id = ?':'') . '
245  UNION
246  SELECT dot.date_deleted AS last_modified,
247  dot.data_object_id AS submission_id,
248  ' . (isset($journalId) ? 'tsoj.assoc_id' : 'NULL') . ' AS assoc_id,' . '
249  ' . (isset($sectionId)? 'tsos.assoc_id' : 'NULL') . ' AS section_id,
250  NULL AS issue_id,
251  dot.tombstone_id,
252  dot.set_spec,
253  dot.oai_identifier
254  FROM data_object_tombstones dot' . '
255  ' . (isset($journalId) ? 'JOIN data_object_tombstone_oai_set_objects tsoj ON (tsoj.tombstone_id = dot.tombstone_id AND tsoj.assoc_type = ' . ASSOC_TYPE_JOURNAL . ' AND tsoj.assoc_id = ?)' : '') . '
256  ' . (isset($sectionId)? 'JOIN data_object_tombstone_oai_set_objects tsos ON (tsos.tombstone_id = dot.tombstone_id AND tsos.assoc_type = ' . ASSOC_TYPE_SECTION . ' AND tsos.assoc_id = ?)' : '') . '
257  WHERE 1=1
258  ' . (isset($set)?' AND (dot.set_spec = ? OR dot.set_spec LIKE ?)':'') . '
259  ' . ($from?' AND dot.date_deleted >= ' . $this->datetimeToDB($from):'') . '
260  ' . ($until?' AND dot.date_deleted <= ' . $this->datetimeToDB($until):'') . '
261  ' . ($submissionId?' AND dot.data_object_id = ?':'') . '
262  ORDER BY ' . $orderBy,
263  $params
264  );
265  return $result;
266  }
267 }
268 
269 
OAIDAO\setOAIData
setOAIData($record, $row, $isRecord=true)
Definition: OAIDAO.inc.php:173
OAIDAO\$sectionCache
$sectionCache
Definition: OAIDAO.inc.php:30
OAIDAO\$issueDao
$issueDao
Definition: OAIDAO.inc.php:26
OAIDAO\getSetJournalSectionId
getSetJournalSectionId($journalSpec, $sectionSpec, $restrictJournalId=null)
Definition: OAIDAO.inc.php:146
OAIDAO\$journalDao
$journalDao
Definition: OAIDAO.inc.php:23
PKPOAIDAO
Base class for DAO operations for the OAI interface.
Definition: PKPOAIDAO.inc.php:19
OAIDAO\$issueCache
$issueCache
Definition: OAIDAO.inc.php:31
OAIDAO\getIssue
& getIssue($issueId)
Definition: OAIDAO.inc.php:71
OAIDAO\getEarliestDatestampQuery
getEarliestDatestampQuery()
Definition: OAIDAO.inc.php:51
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
OAIDAO
DAO operations for the OJS OAI interface.
Definition: OAIDAO.inc.php:20
OAIDAO\__construct
__construct()
Definition: OAIDAO.inc.php:36
OAIDAO\$authorDao
$authorDao
Definition: OAIDAO.inc.php:27
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
OAIDAO\$journalCache
$journalCache
Definition: OAIDAO.inc.php:29
OAIDAO\getJournalSets
& getJournalSets($journalId, $offset, $limit, &$total)
Definition: OAIDAO.inc.php:101
OAISet
Definition: OAIStruct.inc.php:235
OAIDAO\_getRecordsRecordSet
_getRecordsRecordSet($setIds, $from, $until, $set, $submissionId=null, $orderBy='journal_id, submission_id')
Definition: OAIDAO.inc.php:207
DAO\datetimeToDB
datetimeToDB($dt)
Definition: DAO.inc.php:299
OAIDAO\$sectionDao
$sectionDao
Definition: OAIDAO.inc.php:24
OAIDAO\getSection
& getSection($sectionId)
Definition: OAIDAO.inc.php:83
OAIDAO\$articleGalleyDao
$articleGalleyDao
Definition: OAIDAO.inc.php:25
OAI\sets
sets($offset, $limit, &$total)
Definition: OAI.inc.php:172
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
OAIDAO\getJournal
& getJournal($journalId)
Definition: OAIDAO.inc.php:59
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49