From d05956ac9f9f59cfb0742d79ddb76d4f33f08b5a Mon Sep 17 00:00:00 2001 From: moodler Date: Wed, 14 Jan 2004 11:50:29 +0000 Subject: [PATCH] Some improvements in efficiency of Recent Activity. 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 | 1 + mod/forum/db/mysql.php | 13 +++++++++ mod/forum/db/mysql.sql | 1 + mod/forum/db/postgres7.php | 14 ++++++++- mod/forum/db/postgres7.sql | 1 + mod/forum/lib.php | 59 +++++++++++++++++++++++++++----------- mod/forum/restorelib.php | 8 +++++- mod/forum/version.php | 2 +- 8 files changed, 80 insertions(+), 19 deletions(-) diff --git a/mod/forum/backuplib.php b/mod/forum/backuplib.php index e096a39141..9b3228f37b 100644 --- a/mod/forum/backuplib.php +++ b/mod/forum/backuplib.php @@ -128,6 +128,7 @@ 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 diff --git a/mod/forum/db/mysql.php b/mod/forum/db/mysql.php index 14ed763964..876fb24373 100644 --- a/mod/forum/db/mysql.php +++ b/mod/forum/db/mysql.php @@ -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; diff --git a/mod/forum/db/mysql.sql b/mod/forum/db/mysql.sql index 8729497d8f..66d0522268 100644 --- a/mod/forum/db/mysql.sql +++ b/mod/forum/db/mysql.sql @@ -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) diff --git a/mod/forum/db/postgres7.php b/mod/forum/db/postgres7.php index b5a92de5e8..f1e272e0a4 100644 --- a/mod/forum/db/postgres7.php +++ b/mod/forum/db/postgres7.php @@ -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; } - ?> diff --git a/mod/forum/db/postgres7.sql b/mod/forum/db/postgres7.sql index ed6308938b..2e7095c640 100644 --- a/mod/forum/db/postgres7.sql +++ b/mod/forum/db/postgres7.sql @@ -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' ); diff --git a/mod/forum/lib.php b/mod/forum/lib.php index d0e2bf31d1..c70eadf7a6 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -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 diff --git a/mod/forum/restorelib.php b/mod/forum/restorelib.php index 8632378eb6..aee54b682e 100644 --- a/mod/forum/restorelib.php +++ b/mod/forum/restorelib.php @@ -199,6 +199,7 @@ $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']['#']); @@ -227,13 +228,18 @@ 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."
"; //Debug } else { diff --git a/mod/forum/version.php b/mod/forum/version.php index 8f90df7474..7f1122084d 100644 --- a/mod/forum/version.php +++ b/mod/forum/version.php @@ -5,7 +5,7 @@ // This fragment is called by /admin/index.php //////////////////////////////////////////////////////////////////////////////// -$module->version = 2004010500; +$module->version = 2004011404; $module->cron = 60; ?> -- 2.39.5