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 = '
'.$strassignment. ': '. 'visible ? '':' class="dimmed"'). @@ -2933,14 +2967,9 @@ function assignment_print_overview($courses, &$htmlarray) { // count how many people can submit $submissions = 0; // init - if ($students = get_users_by_capability($context, 'mod/assignment:submit', '', '', '', '', 0, '', false)) { - foreach ($students as $student) { - if ($DB->record_exists_sql("SELECT id - FROM {assignment_submissions} - WHERE assignment = ? AND - userid = ? AND - teacher = 0 AND - timemarked = 0", array($assignment->id, $student->id))) { + if ($students = get_users_by_capability($context, 'mod/assignment:submit', 'u.id', '', '', '', 0, '', false)) { + foreach($students as $student){ + if(isset($unmarkedsubmissions[$assignment->id][$student->id])){ $submissions++; } } @@ -2950,12 +2979,10 @@ function assignment_print_overview($courses, &$htmlarray) { $str .= get_string('submissionsnotgraded', 'assignment', $submissions); } } else { - $sql = "SELECT * - FROM {assignment_submissions} - WHERE userid = ? - AND assignment = ?"; - $params = array($USER->id, $assignment->id); - if ($submission = $DB->get_record_sql($sql, $params)) { + if(isset($mysubmissions[$assignment->id])){ + + $submission = $mysubmissions[$assignment->id]; + if ($submission->teacher == 0 && $submission->timemarked == 0) { $str .= $strsubmitted . ', ' . $strnotgradedyet; } else if ($submission->grade <= 0) {