Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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.
  • Loading branch information...
commit 7ef965ce502ff54ebc79fae73a5a18f5f3f0030a 1 parent a09484c
@merrill-oakland merrill-oakland authored
Showing with 36 additions and 33 deletions.
  1. +36 −33 mod/assign/lib.php
View
69 mod/assign/lib.php
@@ -312,38 +312,6 @@ function assign_print_overview($courses, &$htmlarray) {
//
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
- $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", array_merge(array($USER->id, $USER->id), $assignmentidparams));
-
foreach ($assignments as $assignment) {
// Do not show assignments that are not open
if (!in_array($assignment->id, $assignmentids)) {
@@ -361,7 +329,33 @@ 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; // init
if ($students = get_enrolled_users($context, 'mod/assign:view', 0, 'u.id')) {
@@ -377,6 +371,15 @@ function assign_print_overview($courses, &$htmlarray) {
$str .= '<div class="details"><a href="'.$link.'">'.get_string('submissionsnotgraded', 'assign', $submissions).'</a></div>';
}
} if (has_capability('mod/assign:submit', $context)) {
+ if (!isset($mysubmissions)) {
+ // get all user submissions, indexed by assignment id
+ $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",
+ array_merge(array($USER->id, $USER->id), $assignmentidparams));
+ }
$str .= '<div class="details">';
$str .= get_string('mysubmission', 'assign');
$submission = $mysubmissions[$assignment->id];
Please sign in to comment.
Something went wrong with that request. Please try again.