00001 <?php
00002
00006 abstract class SDRServiceCache extends SObject {
00007
00012 public static function updateResourceCache($identifier) {
00013 $version = SDRService::getVersion($identifier);
00014 $resource = SDRService::getResource($identifier);
00015
00016 if ($version === false || !$resource)
00017 return false;
00018
00019 if ($version === null) {
00020 self::deleteSearchCaches($resource->cserdId);
00021 return null;
00022 }
00023
00024 $success = true;
00025 if (!self::updateSearchWordCache($version)) {
00026 self::setStaticWarning('Error updating quick search cache.');
00027 $success = false;
00028 }
00029 if (self::updateResourceCacheHelper($resource) === false) {
00030 self::setStaticWarning('Error updating resource cache.');
00031 $success = false;
00032 }
00033 return $success;
00034 }
00035
00039 public function updateAllResourceCaches() {
00040 $DBI = SDRService::getDBI();
00041
00042 $rsrcIdQuery = 'SELECT cserdId from SDRResource';
00043 $results = $DBI->query($rsrcIdQuery);
00044 if (!$results)
00045 return false;
00046 foreach($results as $result) {
00047 $id = $result['cserdId'];
00048 if (!self::updateResourceCache($id)) {
00049 self::setStaticWarning('Could not update cache for id ' . $id);
00050 }
00051 }
00052 return true;
00053 }
00054
00058 public static function updateAllCaches() {
00059 self::updateValueCache();
00060 self::updateAllResourceCaches();
00061 }
00062
00066 public static function updateValueCache() {
00067 $DBI = SDRService::getDBI();
00068
00069 $valCacheQuery = 'TRUNCATE SDRValueCache';
00070 $DBI->query($valCacheQuery);
00071 $valCacheQuery = 'INSERT INTO SDRValueCache '
00072 . 'SELECT valueId, entry from SDRTextValue '
00073 . 'UNION SELECT valueId, entry from SDRDateValue '
00074 . 'UNION SELECT valueId, entry from SDRIntValue;';
00075 $DBI->query($valCacheQuery);
00076 return true;
00077 }
00078
00088 public function updateSearchWordCache($version) {
00089 if (!($version instanceOf SDRVersion)) {
00090 self::setStaticError('Version provided is not an SDRVersion object');
00091 return false;
00092 }
00093 $DBI = SDRService::getDBI();
00094 $skippers = array('the', 'and', 'to', 'of', 'a', 'in', 'is', 'it', 'or');
00095 $wordSplitPattern = "/[\s\,\/\\\.\:\;\!]+/";
00096 $cserdId = $version->cserdId;
00097 $counts = array();
00098 $fields = array();
00099 $vfvs = SDRVersionFieldValue::getList(array('versionId' => $version->id));
00100 if (!$vfvs)
00101 return false;
00102 foreach($vfvs as $vfv) {
00103 $val = new SDRValue(array('id' => $vfv->valueId));
00104 if (!$val) {
00105 self::setStaticWarning('Could not populate value with id ' . $vfv->valueId
00106 . ' for caching.');
00107 continue;
00108 }
00109 $words = preg_split($wordSplitPattern, $val->getValue());
00110
00111 foreach ($words as $word) {
00112
00113 $word = trim($word);
00114 if ($word == '')
00115 continue;
00116 $word = strtolower($word);
00117
00118 if (in_array($word, $skippers))
00119 continue;
00120
00121 if (!isset($counts[$word])) {
00122 $counts[$word] = array();
00123 }
00124
00125 if (!isset($counts[$word][$vfv->fieldId])) {
00126 $counts[$word][$vfv->fieldId] = 1;
00127 $fields[$vfv->fieldId] = true;
00128 } else {
00129 $counts[$word][$vfv->fieldId]++;
00130 }
00131 }
00132 }
00133
00134
00135 if (!self::deleteSearchWordCache($cserdId))
00136 return false;
00137
00138
00139 foreach($counts as $word => $fwcount) {
00140
00141 $select = 'SELECT id FROM SDRSearchWord WHERE word="'
00142 . mysql_escape_string($word) . '";';
00143
00144 $result = $DBI->query($select);
00145 if (!$result)
00146 return false;
00147 if ($result->numRows() > 0) {
00148 $row = $result->getRow(0);
00149 $wordId = $row['id'];
00150 } else {
00151 $insert = 'INSERT INTO SDRSearchWord SET word="'
00152 . mysql_escape_string($word) . '";';
00153
00154 $result = $DBI->query($insert);
00155 if (!$result)
00156 return false;
00157 $wordId = $result->getInsertId();
00158 }
00159 if ($wordId == '') {
00160 self::setStaticError('Error finding/generating a wordId for caching.');
00161 return false;
00162 }
00163
00164 foreach($fwcount as $fieldId => $wcount) {
00165 $query = 'REPLACE INTO SDRSearchWordCount SET cserdId="' . $cserdId . '", '
00166 . 'fieldId="' . $fieldId .'", searchWordId="' . $wordId . '", '
00167 . 'count="' . $wcount . '"';
00168 if (!$DBI->query($query))
00169 return false;
00170 }
00171 }
00172 return true;
00173 }
00174
00182 public function updateResourceCacheHelper($mixed) {
00183 $DBI = SDRService::getDBI();
00184
00185 if ($mixed instanceOf SDRResource) {
00186 $res = $mixed;
00187 } else {
00188 $res = SDRService::getResource($mixed);
00189 }
00190 if (!$res) {
00191 self::setStaticError('Could not find resource ' . $mixed);
00192 return false;
00193 }
00194
00195 $verList = SDRVersion::getList(array('cserdId' => $res->cserdId,
00196 'or'=>array('state'=>array('live','dev','pending'))));
00197 if (count($verList) == 0) {
00198
00199
00200 if (!self::deleteResourceCache($res->cserdId))
00201 return false;
00202 return null;
00203 }
00204
00205
00206 $versionStates = array();
00207 foreach ($verList as $updateVersion) {
00208 $versionStates[$updateVersion->state] = $updateVersion->id;
00209
00210 $md = $updateVersion->getMetadata();
00211 $title = $description = '';
00212 if ($md->attributeExists('Title'))
00213 $title = $md->Title[0];
00214 if ($md->attributeExists('Description'))
00215 $description = $md->Description[0];
00216
00217
00218 $query = 'REPLACE INTO SDRVersionCache SET '
00219 . 'cserdId="' . $res->cserdId . '", '
00220 . 'versionId="' . $updateVersion->id . '", '
00221 . 'Title="' . mysql_escape_string($title) . '", '
00222 . 'Description="' . mysql_escape_string($description) . '", '
00223 . 'MetadataXMLCache="' . $md->getXML() . '", '
00224 . 'created = "' . $updateVersion->created . '", '
00225 . 'modified = "' . $updateVersion->modified . '";';
00226 if (!$DBI->query($query))
00227 return false;
00228 }
00229
00230
00231 $versionToUpdate = '';
00232 if (array_key_exists(SDRVersion::STATE_LIVE, $versionStates)) {
00233 $versionToUpdate .= ', liveVersionId="' . $versionStates[SDRVersion::STATE_LIVE] . '"';
00234
00235 if (!array_key_exists(SDRVersion::STATE_DEV, $versionStates)) {
00236 $versionToUpdate .= ', devVersionId="' . $versionStates[SDRVersion::STATE_LIVE] . '"';
00237
00238 if (!array_key_exists(SDRVersion::STATE_PENDING, $versionStates))
00239 $versionToUpdate .= ', pendingVersionId="' . $versionStates[SDRVersion::STATE_LIVE] . '"';
00240 }
00241 }
00242 if (array_key_exists(SDRVersion::STATE_DEV, $versionStates)) {
00243 $versionToUpdate .= ', devVersionId="' . $versionStates[SDRVersion::STATE_DEV] . '"';
00244
00245 if (!array_key_exists(SDRVersion::STATE_PENDING, $versionStates))
00246 $versionToUpdate .= ', pendingVersionId="' . $versionStates[SDRVersion::STATE_DEV] . '"';
00247 }
00248 if (array_key_exists(SDRVersion::STATE_PENDING, $versionStates)) {
00249 $versionToUpdate .= ', pendingVersionId="' . $versionStates[SDRVersion::STATE_PENDING] . '"';
00250 }
00251
00252 $project = $res->getParentPrimaryProject();
00253 $projectName = $project->name;
00254
00255
00256 $query = 'REPLACE INTO SDRResourceCache SET '
00257 . 'cserdId="' . $res->cserdId . '", '
00258 . 'releaseFlag="' . $res->releaseFlag . '", '
00259 . 'Url="' . mysql_escape_string($res->url) . '", '
00260 . 'AverageReviewRating="' . $res->AverageReviewRating . '", '
00261 . 'ShodorProject="' . $projectName . '", '
00262 . 'Hierarchy="0", '
00263 . 'created = "' . $res->created . '"'
00264 . $versionToUpdate . ';';
00265 if (!$DBI->query($query))
00266 return false;
00267 return true;
00268
00269
00270 }
00271
00284 public static function updateAverageReviewRating($cserdId) {
00285 $CSERD_DBI = CSERD::getDBI();
00286 $query = 'SELECT AVG(response.response+1) AS average FROM response '
00287 . 'LEFT JOIN question ON response.questionId = question.questionId '
00288 . 'LEFT JOIN review ON response.reviewId = review.reviewId '
00289 . 'WHERE question.ref = \'usability\' '
00290 . 'AND review.state = "published" '
00291 . 'AND review.active = 1 '
00292 . 'AND review.cserdId = "' . $cserdId . '";';
00293 $result = $CSERD_DBI->query($query);
00294
00295 if (!$result)
00296 return false;
00297 if (count($result) == 0)
00298 $average = 0;
00299 else
00300 $average = $result[0]['average'];
00301 if ($average == null)
00302 $average = 0;
00303
00304 $SDR_DBI = SDR::getDBI();
00305 $query = 'UPDATE SDRResource '
00306 . 'SET AverageReviewRating = "' . $average . '" '
00307 . 'WHERE cserdId = "' . $cserdId . '";';
00308 $SDR_DBI->query($query);
00309 if ($SDR_DBI->hasError())
00310 return false;
00311
00312 $query = 'UPDATE SDRResourceCache '
00313 . 'SET AverageReviewRating = "' . $average . '" '
00314 . 'WHERE cserdId = "' . $cserdId . '";';
00315 $SDR_DBI->query($query);
00316
00317 if ($SDR_DBI->hasError())
00318 return false;
00319 return true;
00320 }
00321
00325 public static function deleteResourceCache($cserdId) {
00326 $DBI = SDRService::getDBI();
00327 $query = 'DELETE FROM SDRResourceCache WHERE cserdId="'
00328 . mysql_escape_string($cserdId) . '"';
00329 if (!$DBI->query($query)){
00330 self::setStaticError('Could not delete resource cache.');
00331 return false;
00332 }
00333 return true;
00334 }
00335
00339 public static function deleteSearchWordCache($cserdId) {
00340 $DBI = SDRService::getDBI();
00341 $delete = 'DELETE FROM SDRSearchWordCount WHERE cserdId="'
00342 . mysql_escape_string($cserdId) . '";';
00343 if (!$DBI->query($delete))
00344 return false;
00345 return true;
00346 }
00347
00351 public static function deleteSearchCaches($cserdId) {
00352 return (self::deleteResourceCache($cserdId) && self::deleteSearchWordCache($cserdId));
00353 }
00354
00364 public function updateResourceVersionCaches($resource, $version) {
00365
00366 $status = true;
00367 if (!self::updateSearchWordCache($version)) {
00368 self::setStaticWarning('Error updating quick search cache.');
00369 $status = false;
00370 }
00371 if (self::updateResourceCacheHelper($resource) === false) {
00372 self::setStaticWarning('Error updating resource cache.');
00373 $status = false;
00374 }
00375 if (!self::updateValueCache()) {
00376 self::setStaticWarning('Error updating value cache.');
00377 $status = false;
00378 }
00379 return $status;
00380 }
00381
00382
00383 public static function updateCacheFromValue($value) {
00384 $DBI = SDRService::getDBI();
00385 $query = "SELECT distinct SDRVersion.cserdId
00386 FROM SDRVersionFieldValue
00387 LEFT JOIN SDRVersion ON SDRVersion.id = SDRVersionFieldValue.versionId
00388 WHERE valueId = $value->id";
00389
00390 $results = $DBI->query($query);
00391 foreach($results as $row) {
00392 self::updateResourceCache($row['cserdId']);
00393 }
00394 }
00395
00396
00397
00398 public static function updateCacheFromField($field) {
00399 $DBI = SDRService::getDBI();
00400 $query = "SELECT distinct SDRVersion.cserdId
00401 FROM SDRVersionFieldValue
00402 LEFT JOIN SDRVersion ON SDRVersion.id = SDRVersionFieldValue.versionId
00403 WHERE fieldId = $field->id";
00404
00405 $results = $DBI->query($query);
00406 foreach($results as $row) {
00407 self::updateResourceCache($row['cserdId']);
00408 }
00409 }
00410 }
00411 ?>