00001 <?php
00002
00016 import('classes.submission.reviewAssignment.ReviewAssignment');
00017 import('lib.pkp.classes.submission.reviewAssignment.PKPReviewAssignmentDAO');
00018
00019 class ReviewAssignmentDAO extends PKPReviewAssignmentDAO {
00020 var $submissionFileDao;
00021 var $monographCommentsDao;
00022
00026 function ReviewAssignmentDAO() {
00027 parent::PKPReviewAssignmentDAO();
00028 $this->submissionFileDao =& DAORegistry::getDAO('SubmissionFileDAO');
00029 $this->monographCommentDao =& DAORegistry::getDAO('MonographCommentDAO');
00030 }
00031
00038 function &getLastReviewRoundReviewAssignmentByReviewer($monographId, $reviewerId) {
00039 $params = array(
00040 (int) $monographId,
00041 (int) $reviewerId
00042 );
00043
00044 $result =& $this->retrieve(
00045 $this->_getSelectQuery() .
00046 ' WHERE r.submission_id = ? AND
00047 r.reviewer_id = ? AND
00048 r.cancelled <> 1
00049 ORDER BY r2.stage_id DESC, r2.round DESC LIMIT 1',
00050 $params
00051 );
00052
00053 $returner = null;
00054 if ($result->RecordCount() != 0) {
00055 $returner =& $this->_fromRow($result->GetRowAssoc(false));
00056 }
00057
00058 $result->Close();
00059 unset($result);
00060
00061 return $returner;
00062 }
00063
00068 function getInsertReviewId() {
00069 return $this->getInsertId('review_assignments', 'review_id');
00070 }
00071
00076 function getAverageQualityRatings($pressId) {
00077 $averageQualityRatings = array();
00078 $result =& $this->retrieve(
00079 'SELECT r.reviewer_id, AVG(r.quality) AS average, COUNT(r.quality) AS count
00080 FROM review_assignments r, monographs a
00081 WHERE r.submission_id = a.monograph_id AND
00082 a.press_id = ?
00083 GROUP BY r.reviewer_id',
00084 (int) $pressId
00085 );
00086
00087 while (!$result->EOF) {
00088 $row = $result->GetRowAssoc(false);
00089 $averageQualityRatings[$row['reviewer_id']] = array('average' => $row['average'], 'count' => $row['count']);
00090 $result->MoveNext();
00091 }
00092
00093 $result->Close();
00094 unset($result);
00095
00096 return $averageQualityRatings;
00097 }
00098
00103 function newDataObject() {
00104 return new ReviewAssignment();
00105 }
00106
00107
00113 function &_fromRow(&$row) {
00114 $reviewAssignment =& parent::_fromRow($row);
00115
00116
00117 $reviewAssignment->setMostRecentPeerReviewComment($this->monographCommentDao->getMostRecentMonographComment($row['submission_id'], COMMENT_TYPE_PEER_REVIEW, $row['review_id']));
00118
00119 HookRegistry::call('ReviewAssignmentDAO::_fromRow', array(&$reviewAssignment, &$row));
00120 return $reviewAssignment;
00121 }
00122
00127 function getReviewMethodsTranslationKeys() {
00128 return array(
00129 SUBMISSION_REVIEW_METHOD_DOUBLEBLIND => 'editor.submissionReview.doubleBlind',
00130 SUBMISSION_REVIEW_METHOD_BLIND => 'editor.submissionReview.blind',
00131 SUBMISSION_REVIEW_METHOD_OPEN => 'editor.submissionReview.open',
00132 );
00133 }
00134
00138 function getReviewRoundJoin() {
00139 return 'r.review_round_id = r2.review_round_id';
00140 }
00141
00142
00143
00144
00145 function updateObject(&$reviewAssignment) {
00146 parent::updateReviewAssignment($reviewAssignment);
00147 }
00148
00149
00150
00151
00152
00153
00160 function &getReviewAssignment($reviewRoundId, $reviewerId) {
00161 $params = array(
00162 (int) $reviewRoundId,
00163 (int) $reviewerId
00164 );
00165
00166 $result =& $this->retrieve(
00167 $this->_getSelectQuery() .
00168 ' WHERE r.review_round_id = ? AND
00169 r.reviewer_id = ? AND
00170 r.cancelled <> 1',
00171 $params
00172 );
00173
00174 $returner = null;
00175 if ($result->RecordCount() != 0) {
00176 $returner =& $this->_fromRow($result->GetRowAssoc(false));
00177 }
00178
00179 $result->Close();
00180 unset($result);
00181
00182 return $returner;
00183 }
00184
00192 function &getByReviewRoundId($reviewRoundId, $excludeCancelled = false) {
00193 $params = array((int)$reviewRoundId);
00194
00195 $query = $this->_getSelectQuery() .
00196 ' WHERE r.review_round_id = ?';
00197
00198 if ($excludeCancelled) {
00199 $query .= ' AND (r.cancelled = 0 OR r.cancelled IS NULL)';
00200 }
00201
00202 $query .= ' ORDER BY review_id';
00203
00204 return $this->_getReviewAssignmentsArray($query, $params);
00205 }
00206
00210 function &getBySubmissionId($submissionId, $reviewRoundId = null, $stageId = null) {
00211 $query = $this->_getSelectQuery() .
00212 ' WHERE r.submission_id = ?';
00213
00214 $orderBy = ' ORDER BY review_id';
00215
00216 $queryParams[] = (int) $submissionId;
00217
00218 if ($reviewRoundId != null) {
00219 $query .= ' AND r2.review_round_id = ?';
00220 $queryParams[] = (int) $reviewRoundId;
00221 } else {
00222 $orderBy .= ', r2.review_round_id';
00223 }
00224
00225 if ($stageId != null) {
00226 $query .= ' AND r2.stage_id = ?';
00227 $queryParams[] = (int) $stageId;
00228 } else {
00229 $orderBy .= ', r2.stage_id';
00230 }
00231
00232 $query .= $orderBy;
00233
00234 return $this->_getReviewAssignmentsArray($query, $queryParams);
00235 }
00236
00240 function &getReviewerIdsBySubmissionId($submissionId, $stageId = null, $reviewRoundId = null) {
00241 $query = 'SELECT r.reviewer_id
00242 FROM review_assignments r
00243 WHERE r.submission_id = ?';
00244
00245 $queryParams[] = (int) $submissionId;
00246
00247 if ($reviewRoundId != null) {
00248 $query .= ' AND r.review_round_id = ?';
00249 $queryParams[] = (int) $reviewRoundId;
00250 }
00251
00252 if ($stageId != null) {
00253 $query .= ' AND r.stage_id = ?';
00254 $queryParams[] = (int) $stageId;
00255 }
00256
00257 $result =& $this->retrieve($query, $queryParams);
00258
00259 $reviewAssignments = array();
00260 while (!$result->EOF) {
00261 $row = $result->GetRowAssoc(false);
00262 $reviewAssignments[] = $row['reviewer_id'];
00263 $result->MoveNext();
00264 }
00265
00266 $result->Close();
00267 unset($result);
00268
00269 return $reviewAssignments;
00270 }
00271
00275 function &getReviewIndexesForRound($submissionId, $reviewRoundId) {
00276 $result =& $this->retrieve(
00277 'SELECT review_id
00278 FROM review_assignments
00279 WHERE submission_id = ? AND
00280 review_round_id = ? AND
00281 (cancelled = 0 OR cancelled IS NULL)
00282 ORDER BY review_id',
00283 array((int) $submissionId, (int) $reviewRoundId)
00284 );
00285
00286 $index = 0;
00287 $returner = array();
00288 while (!$result->EOF) {
00289 $row = $result->GetRowAssoc(false);
00290 $returner[$row['review_id']] = $index++;
00291 $result->MoveNext();
00292 }
00293
00294 $result->Close();
00295 unset($result);
00296
00297 return $returner;
00298 }
00299
00303 function &getLastModifiedByRound($submissionId) {
00304 $returner = array();
00305
00306 $result =& $this->retrieve(
00307 'SELECT review_round_id, MAX(last_modified) as last_modified
00308 FROM review_assignments
00309 WHERE submission_id = ?
00310 GROUP BY review_round_id',
00311 (int) $submissionId
00312 );
00313
00314 while (!$result->EOF) {
00315 $row = $result->GetRowAssoc(false);
00316 $returner[$row['review_round_id']] = $this->datetimeFromDB($row['last_modified']);
00317 $result->MoveNext();
00318 }
00319
00320 $result->Close();
00321 unset($result);
00322
00323 return $returner;
00324 }
00325
00329 function &getEarliestNotificationByRound($submissionId) {
00330 $returner = array();
00331
00332 $result =& $this->retrieve(
00333 'SELECT review_round_id, MIN(date_notified) as earliest_date
00334 FROM review_assignments
00335 WHERE submission_id = ?
00336 GROUP BY review_round_id',
00337 (int) $submissionId
00338 );
00339
00340 while (!$result->EOF) {
00341 $row = $result->GetRowAssoc(false);
00342 $returner[$row['review_round_id']] = $this->datetimeFromDB($row['earliest_date']);
00343 $result->MoveNext();
00344 }
00345
00346 $result->Close();
00347 unset($result);
00348
00349 return $returner;
00350 }
00351
00356 function _getSelectQuery() {
00357 return 'SELECT r.*, r2.review_revision, u.first_name, u.last_name FROM review_assignments r
00358 LEFT JOIN users u ON (r.reviewer_id = u.user_id)
00359 LEFT JOIN review_rounds r2 ON (r.review_round_id = r2.review_round_id)';
00360 }
00361
00369 function &_getReviewAssignmentsArray($query, $queryParams) {
00370 $reviewAssignments = array();
00371
00372 $result =& $this->retrieve($query, $queryParams);
00373
00374 while (!$result->EOF) {
00375 $reviewAssignments[$result->fields['review_id']] =& $this->_fromRow($result->GetRowAssoc(false));
00376 $result->MoveNext();
00377 }
00378
00379 $result->Close();
00380 unset($result);
00381
00382 return $reviewAssignments;
00383 }
00384 }
00385
00386 ?>