From d77731d612a814a64575e1647b277dd4d9a24a7f Mon Sep 17 00:00:00 2001 From: Eric Merrill Date: Tue, 26 Feb 2013 09:35:42 -0500 Subject: [PATCH 1/2] MDL-35127 mod_assign More efficient use of expensive database queries Moving two relatively expensive DB queries so they are only executed when needed instead of on every function call. They will still only execute once, and not repeatedly during execution of the loop. --- mod/assign/lib.php | 92 ++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/mod/assign/lib.php b/mod/assign/lib.php index 04dbde700d0..ee7de4616b6 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -337,50 +337,6 @@ function assign_print_overview($courses, &$htmlarray) { // 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 assignment id/ userid - // for use where the user has grading rights on assignment. - $dbparams = array_merge(array(ASSIGN_SUBMISSION_STATUS_SUBMITTED), $assignmentidparams); - $rs = $DB->get_recordset_sql('SELECT - s.assignment as assignment, - s.userid as userid, - s.id as id, - s.status as status, - g.timemodified as timegraded - FROM {assign_submission} s - LEFT JOIN {assign_grades} g ON - s.userid = g.userid AND - s.assignment = g.assignment - WHERE - ( g.timemodified is NULL OR - s.timemodified > g.timemodified ) AND - s.timemodified IS NOT NULL AND - s.status = ? AND - s.assignment ' . $sqlassignmentids, $dbparams); - - $unmarkedsubmissions = array(); - foreach ($rs as $rd) { - $unmarkedsubmissions[$rd->assignment][$rd->userid] = $rd->id; - } - $rs->close(); - - // Get all user submissions, indexed by assignment id. - $dbparams = array_merge(array($USER->id, $USER->id), $assignmentidparams); - $mysubmissions = $DB->get_records_sql('SELECT - a.id AS assignment, - a.nosubmissions AS nosubmissions, - g.timemodified AS timemarked, - g.grader AS grader, - g.grade AS grade, - s.status AS status - FROM {assign} a - LEFT JOIN {assign_grades} g ON - g.assignment = a.id AND - g.userid = ? - LEFT JOIN {assign_submission} s ON - s.assignment = a.id AND - s.userid = ? - WHERE a.id ' . $sqlassignmentids, $dbparams); - foreach ($assignments as $assignment) { // Do not show assignments that are not open. if (!in_array($assignment->id, $assignmentids)) { @@ -415,6 +371,34 @@ function assign_print_overview($courses, &$htmlarray) { } $context = context_module::instance($assignment->coursemodule); if (has_capability('mod/assign:grade', $context)) { + if (!isset($unmarkedsubmissions)) { + // Build up and array of unmarked submissions indexed by assignment id/ userid + // for use where the user has grading rights on assignment. + $dbparams = array_merge(array(ASSIGN_SUBMISSION_STATUS_SUBMITTED), $assignmentidparams); + $rs = $DB->get_recordset_sql('SELECT + s.assignment as assignment, + s.userid as userid, + s.id as id, + s.status as status, + g.timemodified as timegraded + FROM {assign_submission} s + LEFT JOIN {assign_grades} g ON + s.userid = g.userid AND + s.assignment = g.assignment + WHERE + ( g.timemodified is NULL OR + s.timemodified > g.timemodified ) AND + s.timemodified IS NOT NULL AND + s.status = ? AND + s.assignment ' . $sqlassignmentids, $dbparams); + + $unmarkedsubmissions = array(); + foreach ($rs as $rd) { + $unmarkedsubmissions[$rd->assignment][$rd->userid] = $rd->id; + } + $rs->close(); + } + // Count how many people can submit. $submissions = 0; if ($students = get_enrolled_users($context, 'mod/assign:view', 0, 'u.id')) { @@ -435,6 +419,26 @@ function assign_print_overview($courses, &$htmlarray) { } } if (has_capability('mod/assign:submit', $context)) { + if (!isset($mysubmissions)) { + // Get all user submissions, indexed by assignment id. + $dbparams = array_merge(array($USER->id, $USER->id), $assignmentidparams); + $mysubmissions = $DB->get_records_sql('SELECT + a.id AS assignment, + a.nosubmissions AS nosubmissions, + g.timemodified AS timemarked, + g.grader AS grader, + g.grade AS grade, + s.status AS status + FROM {assign} a + LEFT JOIN {assign_grades} g ON + g.assignment = a.id AND + g.userid = ? + LEFT JOIN {assign_submission} s ON + s.assignment = a.id AND + s.userid = ? + WHERE a.id ' . $sqlassignmentids, $dbparams); + } + $str .= '
'; $str .= get_string('mysubmission', 'assign'); $submission = $mysubmissions[$assignment->id]; From b8d3aa8fc895c54b7a82455eb6fc0b2bc4408fe0 Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Wed, 27 Feb 2013 09:27:04 +0800 Subject: [PATCH 2/2] MDL-35127 Assignment - declare the variables in the outer scope (for readability) --- mod/assign/lib.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mod/assign/lib.php b/mod/assign/lib.php index ee7de4616b6..aad2a587d73 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -337,6 +337,9 @@ function assign_print_overview($courses, &$htmlarray) { // We do all possible database work here *outside* of the loop to ensure this scales. list($sqlassignmentids, $assignmentidparams) = $DB->get_in_or_equal($assignmentids); + $mysubmissions = null; + $unmarkedsubmissions = null; + foreach ($assignments as $assignment) { // Do not show assignments that are not open. if (!in_array($assignment->id, $assignmentids)) {