MDL-13845 major performance problems when regrading course; merged from MOODLE_19_STABLE

This commit is contained in:
skodak 2008-03-08 12:51:16 +00:00
parent ded38d4960
commit 66690b6914
3 changed files with 43 additions and 55 deletions

View File

@ -469,12 +469,7 @@ class grade_category extends grade_object {
}
if ($oldgrade) {
if (is_null($oldgrade->finalgrade)) {
$oldfinalgrade = null;
} else {
// we need proper floats here for !== comparison later
$oldfinalgrade = (float)$oldgrade->finalgrade;
}
$oldfinalgrade = $oldgrade->finalgrade;
$grade = new grade_grade($oldgrade, false);
$grade->grade_item =& $this->grade_item;
@ -504,7 +499,7 @@ class grade_category extends grade_object {
// if no grades calculation possible or grading not allowed clear final grade
if (empty($grade_values) or empty($items) or ($this->grade_item->gradetype != GRADE_TYPE_VALUE and $this->grade_item->gradetype != GRADE_TYPE_SCALE)) {
$grade->finalgrade = null;
if ($grade->finalgrade !== $oldfinalgrade) {
if (!is_null($oldfinalgrade)) {
$grade->update('aggregation');
}
return;
@ -541,7 +536,7 @@ class grade_category extends grade_object {
if (count($grade_values) == 0) {
// not enough attempts yet
$grade->finalgrade = null;
if ($grade->finalgrade !== $oldfinalgrade) {
if (!is_null($oldfinalgrade)) {
$grade->update('aggregation');
}
return;
@ -560,7 +555,7 @@ class grade_category extends grade_object {
}
// update in db if changed
if ($grade->finalgrade !== $oldfinalgrade) {
if (grade_floatval($grade->finalgrade) !== grade_floatval($oldfinalgrade)) {
$grade->update('aggregation');
}
@ -718,10 +713,10 @@ class grade_category extends grade_object {
$this->apply_limit_rules($grade_values);
$sum = array_sum($grade_values);
$grade->finalgrade = (float)bounded_number($this->grade_item->grademin, $sum, $this->grade_item->grademax);
$grade->finalgrade = bounded_number($this->grade_item->grademin, $sum, $this->grade_item->grademax);
// update in db if changed
if ($grade->finalgrade !== $oldfinalgrade) {
if (grade_floatval($grade->finalgrade) !== grade_floatval($oldfinalgrade)) {
$grade->update('aggregation');
}

View File

@ -286,14 +286,14 @@ class grade_item extends grade_object {
$calculationdiff = $db_item->calculation != $this->calculation;
$categorydiff = $db_item->categoryid != $this->categoryid;
$gradetypediff = $db_item->gradetype != $this->gradetype;
$grademaxdiff = $db_item->grademax != $this->grademax;
$grademindiff = $db_item->grademin != $this->grademin;
$scaleiddiff = $db_item->scaleid != $this->scaleid;
$outcomeiddiff = $db_item->outcomeid != $this->outcomeid;
$multfactordiff = $db_item->multfactor != $this->multfactor;
$plusfactordiff = $db_item->plusfactor != $this->plusfactor;
$locktimediff = $db_item->locktime != $this->locktime;
$acoefdiff = $db_item->aggregationcoef != $this->aggregationcoef;
$grademaxdiff = grade_floatval($db_item->grademax) !== grade_floatval($this->grademax);
$multfactordiff = grade_floatval($db_item->multfactor) !== grade_floatval($this->multfactor);
$plusfactordiff = grade_floatval($db_item->plusfactor) !== grade_floatval($this->plusfactor);
$acoefdiff = grade_floatval($db_item->aggregationcoef) !== grade_floatval($this->aggregationcoef);
$needsupdatediff = !$db_item->needsupdate && $this->needsupdate; // force regrading only if setting the flag first time
$lockeddiff = !empty($db_item->locked) && empty($this->locked); // force regrading only when unlocking
@ -683,7 +683,7 @@ class grade_item extends grade_object {
$grade->finalgrade = $this->adjust_raw_grade($grade->rawgrade, $grade->rawgrademin, $grade->rawgrademax);
if ($grade_record->finalgrade !== $grade->finalgrade) {
if (grade_floatval($grade_record->finalgrade) !== grade_floatval($grade->finalgrade)) {
if (!$grade->update('system')) {
$result = "Internal error updating final grade";
}
@ -1357,11 +1357,6 @@ class grade_item extends grade_object {
return false;
}
// we need proper floats here for !== comparison later
if (!is_null($grade->finalgrade)) {
$grade->finalgrade = (float)$grade->finalgrade;
}
$oldgrade = new object();
$oldgrade->finalgrade = $grade->finalgrade;
$oldgrade->overridden = $grade->overridden;
@ -1379,7 +1374,7 @@ class grade_item extends grade_object {
if (is_null($finalgrade)) {
$grade->finalgrade = null;
} else {
$grade->finalgrade = (float)bounded_number($this->grademin, $finalgrade, $this->grademax);
$grade->finalgrade = bounded_number($this->grademin, $finalgrade, $this->grademax);
}
}
@ -1399,9 +1394,9 @@ class grade_item extends grade_object {
$grade->timemodified = time(); // overridden flag might take over, but anyway
$result = (boolean)$grade->insert($source);
} else if ($grade->finalgrade !== $oldgrade->finalgrade
or $grade->feedback !== $oldgrade->feedback
or $grade->feedbackformat !== $oldgrade->feedbackformat) {
} else if (grade_floatval($grade->finalgrade) !== grade_floatval($oldgrade->finalgrade)
or grade_floatval($grade->feedback) !== grade_floatval($oldgrade->feedback)
or grade_floatval($grade->feedbackformat) !== grade_floatval($oldgrade->feedbackformat)) {
$grade->timemodified = time(); // overridden flag might take over, but anyway
$result = $grade->update($source);
} else {
@ -1490,25 +1485,24 @@ class grade_item extends grade_object {
return false;
}
// we need proper floats here for !== comparison later
$oldgrade = new object();
$oldgrade->finalgrade = grade_floatval($grade->finalgrade);
$oldgrade->rawgrade = grade_floatval($grade->rawgrade);
$oldgrade->rawgrademin = grade_floatval($grade->rawgrademin);
$oldgrade->rawgrademax = grade_floatval($grade->rawgrademax);
$oldgrade->rawscaleid = grade_floatval($grade->rawscaleid);
$oldgrade->finalgrade = $grade->finalgrade;
$oldgrade->rawgrade = $grade->rawgrade;
$oldgrade->rawgrademin = $grade->rawgrademin;
$oldgrade->rawgrademax = $grade->rawgrademax;
$oldgrade->rawscaleid = $grade->rawscaleid;
$oldgrade->feedback = $grade->feedback;
$oldgrade->feedbackformat = $grade->feedbackformat;
// use new min and max
$grade->rawgrade = grade_floatval($grade->rawgrade);
$grade->rawgrademin = grade_floatval($this->grademin);
$grade->rawgrademax = grade_floatval($this->grademax);
$grade->rawscaleid = grade_floatval($this->scaleid);
$grade->rawgrade = $grade->rawgrade;
$grade->rawgrademin = $this->grademin;
$grade->rawgrademax = $this->grademax;
$grade->rawscaleid = $this->scaleid;
// change raw grade?
if ($rawgrade !== false) {
$grade->rawgrade = grade_floatval($rawgrade);
$grade->rawgrade = $rawgrade;
}
// do we have comment from teacher?
@ -1519,7 +1513,7 @@ class grade_item extends grade_object {
// update final grade if possible
if (!$grade->is_locked() and !$grade->is_overridden()) {
$grade->finalgrade = grade_floatval($this->adjust_raw_grade($grade->rawgrade, $grade->rawgrademin, $grade->rawgrademax));
$grade->finalgrade = $this->adjust_raw_grade($grade->rawgrade, $grade->rawgrademin, $grade->rawgrademax);
}
if (is_null($grade->rawgrade)) {
@ -1529,14 +1523,16 @@ class grade_item extends grade_object {
if (empty($grade->id)) {
$result = (boolean)$grade->insert($source);
} else if ($grade->finalgrade !== $oldgrade->finalgrade
or $grade->rawgrade !== $oldgrade->rawgrade
or $grade->rawgrademin !== $oldgrade->rawgrademin
or $grade->rawgrademax !== $oldgrade->rawgrademax
or $grade->rawscaleid !== $oldgrade->rawscaleid
or $grade->feedback !== $oldgrade->feedback
or $grade->feedbackformat !== $oldgrade->feedbackformat) {
} else if (grade_floatval($grade->finalgrade) !== grade_floatval($oldgrade->finalgrade)
or grade_floatval($grade->rawgrade) !== grade_floatval($oldgrade->rawgrade)
or grade_floatval($grade->rawgrademin) !== grade_floatval($oldgrade->rawgrademin)
or grade_floatval($grade->rawgrademax) !== grade_floatval($oldgrade->rawgrademax)
or grade_floatval($grade->rawscaleid) !== grade_floatval($oldgrade->rawscaleid)
or grade_floatval($grade->feedback) !== grade_floatval($oldgrade->feedback)
or grade_floatval($grade->feedbackformat) !== grade_floatval($oldgrade->feedbackformat)) {
$result = $grade->update($source);
} else {
return $result;
}
if (!$result) {
@ -1667,12 +1663,7 @@ class grade_item extends grade_object {
// insert final grade - will be needed later anyway
if ($oldgrade) {
if (is_null($oldgrade->finalgrade)) {
$oldfinalgrade = null;
} else {
// we need proper floats here for !== comparison later
$oldfinalgrade = (float)$oldgrade->finalgrade;
}
$oldfinalgrade = $oldgrade->finalgrade;
$grade = new grade_grade($oldgrade, false); // fetching from db is not needed
$grade->grade_item =& $this;
@ -1701,11 +1692,11 @@ class grade_item extends grade_object {
if ($this->gradetype == GRADE_TYPE_SCALE) {
$result = round($result+0.00001); // round scales upwards
}
$grade->finalgrade = (float)$result;
$grade->finalgrade = $result;
}
// update in db if changed
if ($grade->finalgrade !== $oldfinalgrade) {
if (grade_floatval($grade->finalgrade) !== grade_floatval($oldfinalgrade)) {
$grade->update('compute');
}

View File

@ -1244,14 +1244,16 @@ function grade_course_reset($courseid) {
}
/**
* Convert number to float or null
* Convert number to 5 decimalfloat, empty tring or null db compatible format
* (we need this to decide if db value changed)
* @param mixed number
* @return mixed float or null
*/
function grade_floatval($number) {
if (is_null($number)) {
if (is_null($number) or $number === '') {
return null;
}
return (float)$number;
// we must round to 5 digits to get the same precision as in 10,5 db fields
return round($number, 5);
}
?>