From 8a592bd55197e057596516f59a378383c54a6078 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Tue, 18 Oct 2011 17:24:59 -0400 Subject: [PATCH 1/2] MDL-29733 grade: Query for Identifying Grade Grades to Precreate is SLOW --- lib/grade/grade_item.php | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 8378b78c1f4..c485f65b8c8 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -1730,16 +1730,26 @@ class grade_item extends grade_object { return true; // no need to recalculate locked items } - // precreate grades - we need them to exist - $params = array($this->courseid, $this->id, $this->id); - $sql = "SELECT DISTINCT go.userid - FROM {grade_grades} go - JOIN {grade_items} gi - ON (gi.id = go.itemid AND gi.courseid = ?) - LEFT OUTER JOIN {grade_grades} g - ON (g.userid = go.userid AND g.itemid = ?) - WHERE gi.id <> ? AND g.id IS NULL"; - if ($missing = $DB->get_records_sql($sql, $params)) { + if ($userid) { + $missing = array(); + if (!$DB->record_exists('grade_grades', array('itemid'=>$this->id, 'userid'=>$userid))) { + $m = new stdClass(); + $m->userid = $userid; + $missing[] = $m; + } + } else { + // precreate grades - we need them to exist + $params = array($this->courseid, $this->id); + $sql = "SELECT go.userid + FROM {grade_grades} go + JOIN {grade_items} gi + ON (gi.id = go.itemid AND gi.courseid = ?) + GROUP BY go.userid + HAVING SUM(go.itemid = ?) = 0"; + $missing = $DB->get_records_sql($sql, $params); + } + + if ($missing) { foreach ($missing as $m) { $grade = new grade_grade(array('itemid'=>$this->id, 'userid'=>$m->userid), false); $grade->grade_item =& $this; From 415b15ccd69183402ff4afab8dfc6444137fdf0d Mon Sep 17 00:00:00 2001 From: Andrew Davis Date: Fri, 24 Aug 2012 11:41:45 +0800 Subject: [PATCH 2/2] MDL-29733 grade: SQL and comment cleanup --- lib/grade/grade_item.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index c485f65b8c8..46101926021 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -1730,6 +1730,7 @@ class grade_item extends grade_object { return true; // no need to recalculate locked items } + // Precreate grades - we need them to exist if ($userid) { $missing = array(); if (!$DB->record_exists('grade_grades', array('itemid'=>$this->id, 'userid'=>$userid))) { @@ -1738,14 +1739,14 @@ class grade_item extends grade_object { $missing[] = $m; } } else { - // precreate grades - we need them to exist - $params = array($this->courseid, $this->id); - $sql = "SELECT go.userid - FROM {grade_grades} go + // Find any users who have grades for some but not all grade items in this course + $params = array('gicourseid' => $this->courseid, 'ggitemid' => $this->id); + $sql = "SELECT gg.userid + FROM {grade_grades} gg JOIN {grade_items} gi - ON (gi.id = go.itemid AND gi.courseid = ?) - GROUP BY go.userid - HAVING SUM(go.itemid = ?) = 0"; + ON (gi.id = gg.itemid AND gi.courseid = :gicourseid) + GROUP BY gg.userid + HAVING SUM(CASE WHEN gg.itemid = :ggitemid THEN 1 ELSE 0 END) = 0"; $missing = $DB->get_records_sql($sql, $params); }