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.
This commit is contained in:
Eric Merrill 2013-02-26 09:35:42 -05:00 committed by Damyon Wiese
parent 738b0965a4
commit d77731d612

View File

@ -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 .= '<div class="details">';
$str .= get_string('mysubmission', 'assign');
$submission = $mysubmissions[$assignment->id];