]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-13845 major performance problems when regrading course; merged from MOODLE_19_STABLE
authorskodak <skodak>
Sat, 8 Mar 2008 12:51:16 +0000 (12:51 +0000)
committerskodak <skodak>
Sat, 8 Mar 2008 12:51:16 +0000 (12:51 +0000)
lib/grade/grade_category.php
lib/grade/grade_item.php
lib/gradelib.php

index 545f9343ffc5e1c956b40f9a38e405b5ea57e318..00e0e959680aa16caf08d908da2c486824adb536 100644 (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');
         }
 
index 8ad789c34dea18422897641133476f27fcf9ad8b..907b72fce1eef4f5a8cbf2d273aaf3a1dfdbf0c0 100644 (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');
         }
 
index abbecc836b5ad36cca62dea0ce984e1998cc4d3a..b3c993fd0397dbe9fea37f2a5b4f02b07f0ba823 100644 (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);
 }
 ?>