]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-12224: preload ratings for the specific user and only for his discussions, merged...
authorjerome <jerome>
Tue, 2 Sep 2008 09:51:11 +0000 (09:51 +0000)
committerjerome <jerome>
Tue, 2 Sep 2008 09:51:11 +0000 (09:51 +0000)
mod/forum/lib.php

index 2c2360365bb9dab49a89f33ad1ff91bf6e99de44..2404537d2d7727d6216c66c0a2ab9cbb8dbda3f4 100644 (file)
@@ -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 '<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);
+            }
         }
     }