From: jerome Date: Tue, 2 Sep 2008 09:51:11 +0000 (+0000) Subject: MDL-12224: preload ratings for the specific user and only for his discussions, merged... X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=c38965fbfa19dba5566c79b6b90269f7ee26f2c4;p=moodle.git MDL-12224: preload ratings for the specific user and only for his discussions, merged from 19 --- diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 2c2360365b..2404537d2d 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -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)) { @@ -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; @@ -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); @@ -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; - } - } - } -} + + + /** @@ -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 @@ -5173,7 +5209,21 @@ function forum_print_discussion($course, $cm, $forum, $discussion, $post, $mode, echo ''; $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); + } } }