17 import(
'lib.pkp.classes.oai.PKPOAIDAO');
40 parent::__construct();
53 if (!isset($this->_pressCache[$pressId])) {
54 $this->_pressCache[$pressId] = $this->_pressDao->getById($pressId);
56 return $this->_pressCache[$pressId];
65 if (!isset($this->_seriesCache[$seriesId])) {
66 $this->_seriesCache[$seriesId] = $this->_seriesDao->getById($seriesId);
68 return $this->_seriesCache[$seriesId];
82 function getSets($pressId =
null, $offset, $limit, &$total) {
83 if (isset($pressId)) {
84 $presses = array($this->
getPress($pressId));
86 $pressFactory = $this->_pressDao->getAll();
87 $presses = $pressFactory->toArray();
92 foreach ($presses as $press) {
93 $title = $press->getLocalizedName();
94 $abbrev = $press->getPath();
97 $publicationFormatSets = $dataObjectTombstoneDao->getSets(ASSOC_TYPE_PRESS, $press->getId());
99 if (!array_key_exists(urlencode($abbrev), $publicationFormatSets)) array_push($sets,
new OAISet(urlencode($abbrev), $title,
''));
101 $seriesFactory = $this->_seriesDao->getByPressId($press->getId());
102 foreach ($seriesFactory->toArray() as $series) {
103 if (array_key_exists(urlencode($abbrev) .
':' . urlencode($series->getPath()), $publicationFormatSets)) {
104 unset($publicationFormatSets[urlencode($abbrev) .
':' . urlencode($series->getPath())]);
106 array_push($sets,
new OAISet(urlencode($abbrev) .
':' . urlencode($series->getPath()), $series->getLocalizedTitle(),
''));
108 foreach ($publicationFormatSets as $publicationFormatSetSpec => $publicationFormatSetName) {
109 array_push($sets,
new OAISet($publicationFormatSetSpec, $publicationFormatSetName,
''));
113 HookRegistry::call(
'OAIDAO::getSets', array(&$this, $pressId, $offset, $limit, $total, &$sets));
115 $total = count($sets);
116 $sets = array_slice($sets, $offset, $limit);
129 $press = $this->_pressDao->getByPath($pressSpec);
130 if (!isset($press) || (isset($restrictPressId) && $press->getId() != $restrictPressId)) {
134 $pressId = $press->getId();
137 if (isset($seriesSpec)) {
138 $series = $this->_seriesDao->getByPath($seriesSpec, $press->getId());
139 if ($series && is_a($series,
'Series')) {
140 $seriesId = $series->getId();
146 return array($pressId, $seriesId);
156 function setOAIData($record, $row, $isRecord =
true) {
157 $press = $this->
getPress($row[
'press_id']);
158 $series = $this->
getSeries($row[
'series_id']);
159 $publicationFormatId = $row[
'data_object_id'];
161 $record->identifier = $this->oai->publicationFormatIdToIdentifier($publicationFormatId);
162 $record->sets = array(urlencode($press->getPath()) . ($series?
':' . urlencode($series->getPath()):
''));
165 $publicationFormat = $this->_publicationFormatDao->getById($publicationFormatId);
166 $publication =
Services::get(
'publication')->get($publicationFormat->getData(
'publicationId'));
167 $submission =
Services::get(
'submission')->get($publication->getData(
'submissionId'));
168 $record->setData(
'publicationFormat', $publicationFormat);
169 $record->setData(
'monograph', $submission);
170 $record->setData(
'press', $press);
171 $record->setData(
'series', $series);
188 function _getRecordsRecordSet($setIds, $from, $until, $set, $submissionId =
null, $orderBy =
'press_id, data_object_id') {
189 $pressId = array_shift($setIds);
190 $seriesId = array_shift($setIds);
193 if ($pressId) $params[] = (int) $pressId;
194 if ($seriesId) $params[] = (int) $seriesId;
195 if ($submissionId) $params[] = (int) $submissionId;
196 if ($pressId) $params[] = (int) $pressId;
197 if ($seriesId) $params[] = (int) $seriesId;
198 if (isset($set)) $params[] = $set;
199 if ($submissionId) $params[] = (int) $submissionId;
201 import(
'lib.pkp.classes.submission.PKPSubmission');
203 'SELECT ms.last_modified AS last_modified,
204 pf.publication_format_id AS data_object_id,
205 p.press_id AS press_id,
206 pub.series_id AS series_id,
207 NULL AS tombstone_id,
209 NULL AS oai_identifier
210 FROM publication_formats pf
211 JOIN publications pub ON (pub.publication_id = pf.publication_id)
212 JOIN submissions ms ON (ms.current_publication_id = pub.publication_id)
213 LEFT JOIN series s ON (s.series_id = pub.series_id)
214 JOIN presses p ON (p.press_id = ms.context_id)
216 ' . ($pressId?
' AND p.press_id = ?':
'') .
'
217 ' . ($seriesId?
' AND pub.series_id = ?':
'') .
'
218 AND ms.status <> ' . STATUS_DECLINED .
'
219 AND pf.is_available = 1
220 AND pub.date_published IS NOT NULL
221 ' . ($from?
' AND ms.last_modified >= ' . $this->
datetimeToDB($from):
'') .
'
222 ' . ($until?
' AND ms.last_modified <= ' . $this->
datetimeToDB($until):
'') .
'
223 ' . ($submissionId?
' AND pf.publication_format_id=?':
'') .
'
225 SELECT dot.date_deleted AS last_modified,
226 dot.data_object_id AS data_object_id,
227 tsop.assoc_id AS press_id,
228 tsos.assoc_id AS series_id,
233 data_object_tombstones dot
234 LEFT JOIN data_object_tombstone_oai_set_objects tsop ON ' . (isset($pressId) ?
'(tsop.tombstone_id = dot.tombstone_id AND tsop.assoc_type = ' . ASSOC_TYPE_PRESS .
' AND tsop.assoc_id = ?)' :
'tsop.assoc_id = null') .
'
235 LEFT JOIN data_object_tombstone_oai_set_objects tsos ON ' . (isset($seriesId) ?
'(tsos.tombstone_id = dot.tombstone_id AND tsos.assoc_type = ' . ASSOC_TYPE_SERIES .
' AND tsos.assoc_id = ?)' :
'tsos.assoc_id = null') .
'
237 ' . ($from?
' AND dot.date_deleted >= ' . $this->
datetimeToDB($from):
'') .
'
238 ' . ($until?
' AND dot.date_deleted <= ' . $this->
datetimeToDB($until):
'') .
'
239 ' . (isset($set)?
' AND dot.set_spec = ?':
'') .
'
240 ' . ($submissionId?
' AND dot.data_object_id = ?':
'') .
'
241 ORDER BY ' . $orderBy,