Skip to content

Commit

Permalink
Some improvements in efficiency of Recent Activity.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
moodler committed Jan 14, 2004
1 parent da80798 commit d05956a
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 19 deletions.
1 change: 1 addition & 0 deletions mod/forum/backuplib.php
Expand Up @@ -128,6 +128,7 @@ function backup_forum_discussions ($bf,$preferences,$forum) {
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
Expand Down
13 changes: 13 additions & 0 deletions mod/forum/db/mysql.php
Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions mod/forum/db/mysql.sql
Expand Up @@ -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)
Expand Down
14 changes: 13 additions & 1 deletion mod/forum/db/postgres7.php
Expand Up @@ -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;

}



?>

1 change: 1 addition & 0 deletions mod/forum/db/postgres7.sql
Expand Up @@ -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'
);
Expand Down
59 changes: 43 additions & 16 deletions mod/forum/lib.php
Expand Up @@ -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);
Expand All @@ -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;
}
}
}
Expand Down Expand Up @@ -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
Expand Down
8 changes: 7 additions & 1 deletion mod/forum/restorelib.php
Expand Up @@ -199,6 +199,7 @@ function forum_discussions_restore_mods($forum_id,$info,$restore) {
$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']['#']);

Expand Down Expand Up @@ -227,13 +228,18 @@ function forum_discussions_restore_mods($forum_id,$info,$restore) {
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 {
Expand Down
2 changes: 1 addition & 1 deletion mod/forum/version.php
Expand Up @@ -5,7 +5,7 @@
// This fragment is called by /admin/index.php
////////////////////////////////////////////////////////////////////////////////

$module->version = 2004010500;
$module->version = 2004011404;
$module->cron = 60;

?>

0 comments on commit d05956a

Please sign in to comment.