]> git.mjollnir.org Git - moodle.git/commitdiff
Some improvements in efficiency of Recent Activity.
authormoodler <moodler>
Wed, 14 Jan 2004 11:50:29 +0000 (11:50 +0000)
committermoodler <moodler>
Wed, 14 Jan 2004 11:50:29 +0000 (11:50 +0000)
There is now a new field in forum_discussions which has the userid
of the author in it.  This saves a lookup every time to forum_posts.

There is also some caching and rearrangement of the logic.

It seems to work OK, I'm about to do some speed tests on moodle.org

mod/forum/backuplib.php
mod/forum/db/mysql.php
mod/forum/db/mysql.sql
mod/forum/db/postgres7.php
mod/forum/db/postgres7.sql
mod/forum/lib.php
mod/forum/restorelib.php
mod/forum/version.php

index e096a39141ffe86016b4d5fb94d66948c0bc866f..9b3228f37b63dc964aae75feed4f71cafd92cbf0 100644 (file)
                 fwrite ($bf,full_tag("ID",6,false,$for_dis->id));
                 fwrite ($bf,full_tag("NAME",6,false,$for_dis->name));
                 fwrite ($bf,full_tag("FIRSTPOST",6,false,$for_dis->firstpost));
+                fwrite ($bf,full_tag("USERID",6,false,$for_dis->userid));
                 fwrite ($bf,full_tag("ASSESSED",6,false,$for_dis->assessed));
                 fwrite ($bf,full_tag("TIMEMODIFIED",6,false,$for_dis->timemodified));
                 //Now print posts to xml
index 14ed763964659e623d32bf3a7a91523f258bed2a..876fb243735a03e082f6da6ecb62cd84aa145c28 100644 (file)
@@ -83,6 +83,19 @@ function forum_upgrade($oldversion) {
   if ($oldversion < 2004010100) {
       table_column("forum", "", "assesspublic", "integer", "4", "unsigned", "0", "", "assessed");
   }
+
+  if ($oldversion < 2004011404) {
+      table_column("forum_discussions", "", "userid", "integer", "10", "unsigned", "0", "", "firstpost");
+
+      if ($discussions = get_records_sql("SELECT d.id, p.userid
+                                            FROM {$CFG->prefix}forum_discussions as d, 
+                                                 {$CFG->prefix}forum_posts as p
+                                           WHERE d.firstpost = p.id")) {
+          foreach ($discussions as $discussion) {
+              update_record("forum_discussions", $discussion);
+          }
+      }
+  }
   
   return true;
 
index 8729497d8f756e53c0e12448f24d2e16fb5d9b08..66d0522268dd7baa18975a57ea72b65f0fbe4f53 100644 (file)
@@ -32,6 +32,7 @@ CREATE TABLE prefix_forum_discussions (
   forum int(10) unsigned NOT NULL default '0',
   name varchar(255) NOT NULL default '',
   firstpost int(10) unsigned NOT NULL default '0',
+  userid int(10) unsigned NOT NULL default '0',
   assessed tinyint(1) NOT NULL default '1',
   timemodified int(10) unsigned NOT NULL default '0',
   PRIMARY KEY  (id)
index b5a92de5e8864aeaeb6e4ddad8d5009e5167064a..f1e272e0a4d0f1f4289fa104df696002767f420e 100644 (file)
@@ -27,11 +27,23 @@ function forum_upgrade($oldversion) {
       table_column("forum", "", "assesspublic", "integer", "4", "unsigned", "0", "", "assessed");
   }
 
+  if ($oldversion < 2004011404) {
+      table_column("forum_discussions", "", "userid", "integer", "10", "unsigned", "0", "", "firstpost");
+
+      if ($discussions = get_records_sql("SELECT d.id, p.userid
+                                            FROM {$CFG->prefix}forum_discussions as d, 
+                                                 {$CFG->prefix}forum_posts as p
+                                           WHERE d.firstpost = p.id")) {
+          foreach ($discussions as $discussion) {
+              update_record("forum_discussions", $discussion);
+          }
+      }
+  }
+
   return true;
 
 }
 
 
-
 ?>
 
index ed6308938b5ecfbf52c4e832fcb7363aa6cf8703..2e7095c640117e5d63bc984bdfe9c7d820967438 100644 (file)
@@ -30,6 +30,7 @@ CREATE TABLE prefix_forum_discussions (
   forum integer NOT NULL default '0',
   name varchar(255) NOT NULL default '',
   firstpost integer NOT NULL default '0',
+  userid integer NOT NULL default '0',
   assessed integer NOT NULL default '1',
   timemodified integer NOT NULL default '0'
 );
index d0e2bf31d11c3d88063ca1cf1a07457a38b799b9..c70eadf7a682116d33fa2567cfa37c1ff16e953c 100644 (file)
@@ -386,6 +386,11 @@ function forum_print_recent_activity($course, $isteacher, $timestart) {
 
     $strftimerecent = get_string("strftimerecent");
 
+    $isteacheredit = isteacheredit($course->id);
+    $mygroupid     = mygroupid($course->id);
+
+    $groupmode = array();   /// To cache group modes
+
     foreach ($logs as $log) {
         //Get post info, I'll need it later
         $post = forum_get_post_from_log($log);
@@ -411,22 +416,16 @@ function forum_print_recent_activity($course, $isteacher, $timestart) {
                     }
                 }
                 /// Check whether this is belongs to a discussion in a group that 
-                /// should not be accessible to the current user
-                /// TEMPORARY:  This algorithm is ridiculously cumbersome ... 
-                ///             There MUST be a better way of doing this...
-                if ($cm = get_coursemodule_from_instance("forum", $post->forum, $course->id)) {
-                    $groupmode = groupmode($course, $cm);
-                    if ($groupmode == SEPARATEGROUPS or $groupmode == VISIBLEGROUPS) {
-                        if (!isteacheredit($course->id)) {
-                            if ($discussion = get_record("forum_discussions", "id", $post->discussion)) {
-                                if ($firstpost = get_record("forum_posts", "id", $discussion->firstpost)) {
-                                    if ($group = user_group($course->id, $firstpost->userid)) {
-                                        if (mygroupid($course->id) != $group->id) {
-                                            continue;
-                                        }
-                                    }
-                                }
-                            }
+                /// should NOT be accessible to the current user
+
+                if (!$isteacheredit) {   /// Because editing teachers can see everything
+                    if (!isset($cm[$post->forum])) {
+                        $cm[$forum->id] = get_coursemodule_from_instance("forum", $forum->id, $course->id);
+                        $groupmode[$forum->id] = groupmode($course, $cm[$forum->id]);
+                    }
+                    if ($groupmode($forum->id)) {
+                        if ($mygroupid != forum_get_groupid_from_discussion($post->discussion, $course->id)) {
+                            continue;
                         }
                     }
                 }
@@ -800,6 +799,34 @@ function forum_get_post_from_log($log) {
     return NULL;
 }
 
+function forum_get_firstpost_from_discussion($discussionid) {
+/// Given a discussion id, return the first post from the discussion
+    global $CFG;
+
+    return get_record_sql("SELECT p.*
+                             FROM {$CFG->prefix}forum_discussions d, 
+                                  {$CFG->prefix}forum_posts p
+                            WHERE d.id = '$discussionid' 
+                              AND d.firstpost = p.id ");
+}
+
+function forum_get_groupid_from_discussion($discussionid, $courseid) {
+/// Given a discussion id, return the groupid of the first poster
+    global $CFG;
+
+    if ($info = get_record_sql("SELECT gm.groupid as id
+                                  FROM {$CFG->prefix}forum_discussions d, 
+                                       {$CFG->prefix}forum_posts p,
+                                       {$CFG->prefix}groups g,
+                                       {$CFG->prefix}groups_members gm
+                                 WHERE d.id = '$discussionid' 
+                                   AND g.courseid = '$courseid'
+                                   AND gm.groupid = g.id
+                                   AND gm.userid = d.userid")) {
+        return $info->groupid;
+    }
+    return 0;
+}
 
 function forum_get_user_grades($forumid) {
 /// Get all user grades for a forum
index 8632378eb6f52694bd6051b25c187f2aa53932e5..aee54b682e21fb9e60bfe5abdec98b92cab936e3 100644 (file)
             $discussion->course = $restore->course_id;
             $discussion->name = backup_todb($dis_info['#']['NAME']['0']['#']);
             $discussion->firstpost = backup_todb($dis_info['#']['FIRSTPOST']['0']['#']);
+            $discussion->userid = backup_todb($dis_info['#']['USERID']['0']['#']);
             $discussion->assessed = backup_todb($dis_info['#']['ASSESSED']['0']['#']);
             $discussion->timemodified = backup_todb($dis_info['#']['TIMEMODIFIED']['0']['#']);
 
                 if ($rec) {
                     //Put its new firstpost
                     $discussion->firstpost = $rec->new_id;
+                    if ($post = get_record("forum_posts", "id", $discussion->firstpost)) {
+                        $discussion->userid = $post->userid;
+                    }
                 } else {
                      $discussion->firstpost = 0;
+                     $discussion->userid = 0;
                 }
                 //Create temp discussion record
                 $temp_discussion->id = $newid;
                 $temp_discussion->firstpost = $discussion->firstpost;
-                //Update discussion (only firstpost will be changed)
+                $temp_discussion->userid = $discussion->userid;
+                //Update discussion (only firstpost and userid will be changed)
                 $status = update_record("forum_discussions",$temp_discussion);
                 //echo "Updated firstpost ".$old_firstpost." to ".$temp_discussion->firstpost."<br>";                //Debug
             } else {
index 8f90df7474dcc61cc911874a5529394b863fdafa..7f1122084dba332c8801009c6d9ed47d266325b3 100644 (file)
@@ -5,7 +5,7 @@
 //  This fragment is called by /admin/index.php
 ////////////////////////////////////////////////////////////////////////////////
 
-$module->version  = 2004010500;
+$module->version  = 2004011404;
 $module->cron     = 60;
 
 ?>