From a6bc93ae8f2b2f9ce89169722bf5861145883cef Mon Sep 17 00:00:00 2001 From: Tom Lanyon Date: Wed, 9 May 2012 16:56:53 +0930 Subject: [PATCH 1/2] MDL-32931 mod_forum Change forum overview to avoid use of (potentially large and slow ) log table. --- mod/forum/lib.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/mod/forum/lib.php b/mod/forum/lib.php index b1fd07e826043..035a9c043ba7d 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -1222,21 +1222,24 @@ function forum_print_overview($courses,&$htmlarray) { } - // get all forum logs in ONE query (much better!) + // look for new posts since lastaccess + $course_tuples = join( + ' OR ', + array_fill(0, count($visited_courses), '(f.course = ? AND p.created > ?)') + ); + + $sql = "SELECT f.id, COUNT(*) " + .'FROM {forum_posts} p, {forum_discussions} d, {forum} f ' + .'WHERE p.discussion = d.id AND d.forum = f.id ' + ."AND ($course_tuples) " + ."AND p.userid != ? " + ."GROUP BY f.id"; + $params = array(); - $sql = "SELECT instance,cmid,l.course,COUNT(l.id) as count FROM {log} l " - ." JOIN {course_modules} cm ON cm.id = cmid " - ." WHERE ("; foreach ($courses as $course) { - $sql .= '(l.course = ? AND l.time > ?) OR '; $params[] = $course->id; $params[] = $course->lastaccess; } - $sql = substr($sql,0,-3); // take off the last OR - - $sql .= ") AND l.module = 'forum' AND action = 'add post' " - ." AND userid != ? GROUP BY cmid,l.course,instance"; - $params[] = $USER->id; if (!$new = $DB->get_records_sql($sql, $params)) { From b729292ca3401c5052c891a6b47cbb3a4bb3c27b Mon Sep 17 00:00:00 2001 From: David Monllao Date: Mon, 9 Jul 2012 15:29:42 +0800 Subject: [PATCH 2/2] MDL-32931 mod_forum Polishing patch and taking into account courses without previous accesses --- mod/forum/lib.php | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 035a9c043ba7d..f42b6364eb134 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -1221,26 +1221,33 @@ function forum_print_overview($courses,&$htmlarray) { return; } - - // look for new posts since lastaccess - $course_tuples = join( - ' OR ', - array_fill(0, count($visited_courses), '(f.course = ? AND p.created > ?)') - ); - - $sql = "SELECT f.id, COUNT(*) " - .'FROM {forum_posts} p, {forum_discussions} d, {forum} f ' - .'WHERE p.discussion = d.id AND d.forum = f.id ' - ."AND ($course_tuples) " - ."AND p.userid != ? " - ."GROUP BY f.id"; - + // Courses to search for new posts + $coursessqls = array(); $params = array(); foreach ($courses as $course) { - $params[] = $course->id; - $params[] = $course->lastaccess; + + // If the user has never entered into the course all posts are pending + if ($course->lastaccess == 0) { + $coursessqls[] = '(f.course = ?)'; + $params[] = $course->id; + + // Only posts created after the course last access + } else { + $coursessqls[] = '(f.course = ? AND p.created > ?)'; + $params[] = $course->id; + $params[] = $course->lastaccess; + } } $params[] = $USER->id; + $coursessql = implode(' OR ', $coursessqls); + + $sql = "SELECT f.id, COUNT(*) as count " + .'FROM {forum} f ' + .'JOIN {forum_discussions} d ON d.forum = f.id ' + .'JOIN {forum_posts} p ON p.discussion = d.id ' + ."WHERE ($coursessql) " + .'AND p.userid != ? ' + .'GROUP BY f.id'; if (!$new = $DB->get_records_sql($sql, $params)) { $new = array(); // avoid warnings