From 041a1e41730523c036b3f0bbb1a1f8b9e56ca823 Mon Sep 17 00:00:00 2001 From: poltawski Date: Mon, 16 Feb 2009 13:14:30 +0000 Subject: [PATCH] performance/mymoodle MDL-18241 - Assigments were very expensive Reworked to take queries out of loops and let it scale. Unfortunately I don't think we can get the get_users_by_capability() call out of the loop on assignments. Real query numbers before/after: Teacher: 12,509 / 314 Student: 127 / 72 Admin: 718 / 133 Conflicts: mod/assignment/lib.php Merged from 19_STABLE (with dmlib changes) --- mod/assignment/lib.php | 55 +++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/mod/assignment/lib.php b/mod/assignment/lib.php index 1b4dd4d57b2..8d5c2ff4301 100644 --- a/mod/assignment/lib.php +++ b/mod/assignment/lib.php @@ -2893,6 +2893,8 @@ function assignment_print_overview($courses, &$htmlarray) { return; } + $assignmentids = array(); + // Do assignment_base::isopen() here without loading the whole thing for speed foreach ($assignments as $key => $assignment) { $time = time(); @@ -2905,9 +2907,16 @@ function assignment_print_overview($courses, &$htmlarray) { } if (empty($isopen) || empty($assignment->timedue)) { unset($assignments[$key]); + }else{ + $assignmentids[] = $assignment->id; } } + if(empty($assignmentids)){ + // no assigments to look at - we're done + return true; + } + $strduedate = get_string('duedate', 'assignment'); $strduedateno = get_string('duedateno', 'assignment'); $strgraded = get_string('graded', 'assignment'); @@ -2917,6 +2926,31 @@ function assignment_print_overview($courses, &$htmlarray) { $strassignment = get_string('modulename', 'assignment'); $strreviewed = get_string('reviewed','assignment'); + + // NOTE: we do all possible database work here *outside* of the loop to ensure this scales + // + list($sqlassignmentids, $assignmentidparams) = $DB->get_in_or_equal($assignmentids); + + // build up and array of unmarked submissions indexed by assigment id/ userid + // for use where the user has grading rights on assigment + $rs = $DB->get_recordset_sql("SELECT id, assignment, userid + FROM {assignment_submissions} + WHERE teacher = 0 AND timemarked = 0 + AND assignment $sqlassignmentids", $assignmentidparams); + + $unmarkedsubmissions = array(); + foreach ($rs as $rd) { + $unmarkedsubmissions[$rd->assignment][$rd->userid] = $rd->id; + } + $rs->close(); + + + // get all user submissions, indexed by assigment id + $mysubmissions = $DB->get_records_sql("SELECT assignment, timemarked, teacher, grade + FROM {assignment_submissions} + WHERE userid = ? AND + assignment $sqlassignmentids", array_merge(array($USER->id), $assignmentidparams)); + foreach ($assignments as $assignment) { $str = '