Skip to content

Commit

Permalink
MDL-12224: preload ratings for the specific user and only for his dis…
Browse files Browse the repository at this point in the history
…cussions, merged from 19
  • Loading branch information
jerome committed Sep 2, 2008
1 parent 924ddb1 commit c38965f
Showing 1 changed file with 76 additions and 26 deletions.
102 changes: 76 additions & 26 deletions mod/forum/lib.php
Expand Up @@ -1052,7 +1052,7 @@ function forum_user_outline($course, $user, $mod, $forum) {
*
*/
function forum_user_complete($course, $user, $mod, $forum) {
global $CFG;
global $CFG,$USER;

if ($posts = forum_get_user_posts($forum->id, $user->id)) {

Expand All @@ -1061,6 +1061,23 @@ function forum_user_complete($course, $user, $mod, $forum) {
}
$discussions = forum_get_user_involved_discussions($forum->id, $user->id);

// preload all user ratings for these discussions - one query only and minimal memory
$cm->cache->ratings = array();
$cm->cache->myratings = array();
if ($postratings = forum_get_all_user_ratings($user->id, $discussions)) {
foreach ($postratings as $pr) {
if (!isset($cm->cache->ratings[$pr->postid])) {
$cm->cache->ratings[$pr->postid] = array();
}
$cm->cache->ratings[$pr->postid][$pr->id] = $pr->rating;

if ($pr->userid == $USER->id) {
$cm->cache->myratings[$pr->postid] = $pr->rating;
}
}
unset($postratings);
}

foreach ($posts as $post) {
if (!isset($discussions[$post->discussion])) {
continue;
Expand All @@ -1079,7 +1096,6 @@ function forum_user_complete($course, $user, $mod, $forum) {
}
}

pre_load_all_ratings($cm, $discussion);

forum_print_post($post, $discussion, $forum, $cm, $course, false, false, false, $ratings);

Expand All @@ -1089,29 +1105,9 @@ function forum_user_complete($course, $user, $mod, $forum) {
}
}

/**
* Preload all ratings of a discussion into course module
* Use this function to optimize post display with ratings:
* one query only and minimal memory
* @param object $cm course module (passed by reference as cache attribut is modified)
* @param object $discussion the discussion for which the ratings are cached
*/
function pre_load_all_ratings(&$cm, $discussion) {
global $CFG,$USER;
$cm->cache->ratings = array();
$cm->cache->myratings = array();
if ($postratings = forum_get_all_discussion_ratings($discussion)) {
foreach ($postratings as $pr) {
if (!isset($cm->cache->ratings[$pr->postid])) {
$cm->cache->ratings[$pr->postid] = array();
}
$cm->cache->ratings[$pr->postid][$pr->id] = $pr->rating;
if ($pr->userid == $USER->id) {
$cm->cache->myratings[$pr->postid] = $pr->rating;
}
}
}
}





/**
Expand Down Expand Up @@ -1990,6 +1986,46 @@ function forum_get_all_discussion_ratings($discussion) {
ORDER BY p.id ASC", array($discussion->id));
}

/**
* Returns a list of ratings for one specific user for all posts in discussion
* @global object $CFG
* @global object $DB
* @param object $discussions the discussions for which we return all ratings
* @param int $userid the user for who we return all ratings
* @return object
*/
function forum_get_all_user_ratings($userid, $discussions) {
global $CFG, $DB;


foreach ($discussions as $discussion) {
if (!isset($discussionsid)){
$discussionsid = $discussion->id;
}
else {
$discussionsid .= ",".$discussion->id;
}
}

$sql = "SELECT r.id, r.userid, p.id AS postid, r.rating
FROM {$CFG->prefix}forum_ratings r,
{$CFG->prefix}forum_posts p
WHERE r.post = p.id AND p.userid = :userid";


$params = array();
$params['userid'] = $userid;
//postgres compability
if (!isset($discussionsid)) {
$sql .=" AND p.discussion IN (".$discussionsid.")";
}
$sql .=" ORDER BY p.id ASC";

return $DB->get_records_sql($sql, $params);


}

/**
* Returns a list of ratings for a particular post - sorted.
* @param int $postid
Expand Down Expand Up @@ -5173,7 +5209,21 @@ function forum_print_discussion($course, $cm, $forum, $discussion, $post, $mode,
echo '<input type="hidden" name="forumid" value="'.$forum->id.'" />';
$ratingsformused = true;
}
pre_load_all_ratings($cm, $discussion);
// preload all ratings - one query only and minimal memory
$cm->cache->ratings = array();
$cm->cache->myratings = array();
if ($postratings = forum_get_all_discussion_ratings($discussion)) {
foreach ($postratings as $pr) {
if (!isset($cm->cache->ratings[$pr->postid])) {
$cm->cache->ratings[$pr->postid] = array();
}
$cm->cache->ratings[$pr->postid][$pr->id] = $pr->rating;
if ($pr->userid == $USER->id) {
$cm->cache->myratings[$pr->postid] = $pr->rating;
}
}
unset($postratings);
}
}
}

Expand Down

0 comments on commit c38965f

Please sign in to comment.