From: nicolasconnault <nicolasconnault>
Date: Mon, 21 May 2007 05:54:12 +0000 (+0000)
Subject: MDL-9506 Removed the debugging message for the fetch() methods. Added droplow and... 
X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=ab53054fd14e2c052c366a7e63db726f49375aec;p=moodle.git

MDL-9506 Removed the debugging message for the fetch() methods. Added droplow and keephigh rules to grade_category::aggregate_grades(). The only question now is what to do when the droplow or keephigh field is larger than the number of grades for a given user/item combination. At the moment it just gives that value 0.
---

diff --git a/lib/grade/grade_calculation.php b/lib/grade/grade_calculation.php
index d80d3f7b9b..1508dc89a2 100644
--- a/lib/grade/grade_calculation.php
+++ b/lib/grade/grade_calculation.php
@@ -102,7 +102,6 @@ class grade_calculation extends grade_object {
                 return $grade_calculation;
             }
         } else {
-            debugging("No grade_calculation matching your criteria in the database.");
             return false;
         }
     }
diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php
index a0195837c6..54bc1d6fa9 100644
--- a/lib/grade/grade_category.php
+++ b/lib/grade/grade_category.php
@@ -183,7 +183,6 @@ class grade_category extends grade_object {
                 return $grade_category;
             }
         } else {
-            debugging("No grade_category matching your criteria in the database.");
             return false;
         }
     }
@@ -410,49 +409,66 @@ class grade_category extends grade_object {
             foreach ($set as $userid => $final_grade) {
                 $this->load_grade_item();
                 $value = standardise_score((float) $final_grade, 0, 1, $this->grade_item->grademin, $this->grade_item->grademax);
-                $pooled_grades[$userid][] = $value;
+                $pooled_grades[$userid][] = (string) $value;
             }
         }
 
         foreach ($pooled_grades as $userid => $grades) {
             $aggregated_value = null;
-
-            switch ($this->aggregation) {
-                case GRADE_AGGREGATE_MEAN : // Arithmetic average
-                    $num = count($grades);
-                    $sum = array_sum($grades);
-                    $aggregated_value = $sum / $num;
-                    break;
-                case GRADE_AGGREGATE_MEDIAN : // Middle point value in the set: ignores frequencies
-                    sort($grades);
-                    $num = count($grades);
-                    $halfpoint = intval($num / 2);
-                    
-                    if($num % 2 == 0) { 
-                        $aggregated_value = ($grades[ceil($halfpoint)] + $grades[floor($halfpoint)]) / 2; 
-                    } else { 
-                        $aggregated_value = $grades[$halfpoint]; 
-                    }
-
-                    break;
-                case GRADE_AGGREGATE_MODE : // Value that occurs most frequently. Not always useful (all values are likely to be different)
-                    // TODO implement or reject
-                    break;
-                case GRADE_AGGREGATE_SUM : // I don't see much point to this one either
-                    $aggregated_value = array_sum($grades);
-                    break;
-                default:
-                    $num = count($grades);
-                    $sum = array_sum($grades);
-                    $aggregated_value = $sum / $num; 
-                    break;
+            // Sort grades from lowest to largest
+            sort($grades, SORT_NUMERIC);
+            
+            // Apply droplow or keephigh rule
+            if (!empty($this->droplow)) {
+                $reversed_grades = array_reverse($grades);
+                for ($i = 0; $i < $this->droplow; $i++) {
+                    array_pop($reversed_grades);
+                }
+                $grades = array_reverse($reversed_grades);
+            } elseif (!empty($this->keephigh)) { 
+                for ($i = 0; $i < $this->keephigh; $i++) {
+                    array_pop($grades);
+                }
             }
             
-            // If the gradevalue is null, we have a problem
-            if (empty($aggregated_value)) {
-                debugging("There was an error during the aggregation procedure, an empty value resulted.");
-                return false;
-            }            
+            if (count($grades) > 1) {
+
+                switch ($this->aggregation) {
+                    case GRADE_AGGREGATE_MEAN : // Arithmetic average
+                        $num = count($grades);
+                        $sum = array_sum($grades);
+                        $aggregated_value = $sum / $num;
+                        break;
+                    case GRADE_AGGREGATE_MEDIAN : // Middle point value in the set: ignores frequencies
+                        sort($grades);
+                        $num = count($grades);
+                        $halfpoint = intval($num / 2);
+                        
+                        if($num % 2 == 0) { 
+                            $aggregated_value = ($grades[ceil($halfpoint)] + $grades[floor($halfpoint)]) / 2; 
+                        } else { 
+                            $aggregated_value = $grades[$halfpoint]; 
+                        }
+
+                        break;
+                    case GRADE_AGGREGATE_MODE : // Value that occurs most frequently. Not always useful (all values are likely to be different)
+                        // TODO implement or reject
+                        break;
+                    case GRADE_AGGREGATE_SUM : // I don't see much point to this one either
+                        $aggregated_value = array_sum($grades);
+                        break;
+                    default:
+                        $num = count($grades);
+                        $sum = array_sum($grades);
+                        $aggregated_value = $sum / $num; 
+                        break;
+                }
+            } elseif (count($grades) == 1) {
+                $aggregated_value = $grades[0];
+            } else {
+                // TODO what happens if the droplow and keephigh rules have deleted all grades?
+                $aggregated_value = 0;
+            }
             
             $grade_raw = new grade_grades_raw();
             
@@ -633,29 +649,38 @@ class grade_category extends grade_object {
     }
 
     /**
-     * Retrieves from DB, instantiates and saves the associated grade_item object.
-     * If no grade_item exists yet, create one.
+     * Uses get_grade_item to load or create a grade_item, then saves it as $this->grade_item.
      * @return object Grade_item
      */
     function load_grade_item() {
+        $this->grade_item = $this->get_grade_item();
+        return $this->grade_item;
+    }
+    
+    /**
+     * Retrieves from DB and instantiates the associated grade_item object.
+     * If no grade_item exists yet, create one.
+     * @return object Grade_item
+     */
+    function get_grade_item() {
         $grade_items = get_records_select('grade_items', "iteminstance = $this->id AND itemtype = 'category'", null, '*', 0, 1);
         
         if ($grade_items){ 
             $params = current($grade_items);
-            $this->grade_item = new grade_item($params);
+            $grade_item = new grade_item($params);
         } else {
-            $this->grade_item = new grade_item();
+            $grade_item = new grade_item();
         }
         
         // If the associated grade_item isn't yet created, do it now. But first try loading it, in case it exists in DB.
-        if (empty($this->grade_item->id)) {
-            $this->grade_item->iteminstance = $this->id;
-            $this->grade_item->itemtype = 'category';
-            $this->grade_item->insert();
-            $this->grade_item->update_from_db();
+        if (empty($grade_item->id)) {
+            $grade_item->iteminstance = $this->id;
+            $grade_item->itemtype = 'category';
+            $grade_item->insert();
+            $grade_item->update_from_db();
         }
 
-        return $this->grade_item;
+        return $grade_item;
     }
 
     /**
@@ -665,11 +690,24 @@ class grade_category extends grade_object {
      */
     function load_parent_category() {
         if (empty($this->parent_category) && !empty($this->parent)) {
-            $this->parent_category = new grade_category(array('id' => $this->parent));
+            $this->parent_category = $this->get_parent_category();
         }
         return $this->parent_category;
     } 
-   
+    
+    /**
+     * Uses $this->parent to instantiate and return a grade_category object.
+     * @return object Parent_category
+     */
+    function get_parent_category() {
+        if (!empty($this->parent)) {
+            $parent_category = new grade_category(array('id' => $this->parent));
+            return $parent_category; 
+        } else {
+            return null;
+        }
+    }
+
     /**
      * Sets this category as the parent for the given children.
      * A number of constraints are necessary:
diff --git a/lib/grade/grade_grades_final.php b/lib/grade/grade_grades_final.php
index 6fb1fb6c66..18221ce1e4 100644
--- a/lib/grade/grade_grades_final.php
+++ b/lib/grade/grade_grades_final.php
@@ -147,7 +147,6 @@ class grade_grades_final extends grade_object {
                 return $object;
             }
         } else {
-            debugging("No grade_grades_final matching your criteria in the database.");
             return false;
         }
     } 
diff --git a/lib/grade/grade_grades_raw.php b/lib/grade/grade_grades_raw.php
index 9a1da08545..ecdb038ec3 100644
--- a/lib/grade/grade_grades_raw.php
+++ b/lib/grade/grade_grades_raw.php
@@ -173,7 +173,6 @@ class grade_grades_raw extends grade_object {
                 return $object;
             }
         } else {
-            debugging("No grade_grades_raw matching your criteria in the database.");
             return false;
         }
     } 
diff --git a/lib/grade/grade_grades_text.php b/lib/grade/grade_grades_text.php
index a312a604a3..0f215264e1 100644
--- a/lib/grade/grade_grades_text.php
+++ b/lib/grade/grade_grades_text.php
@@ -115,7 +115,6 @@ class grade_grades_text extends grade_object {
                 return $grade_text;
             }
         } else {
-            debugging("No grade_grades_text matching your criteria in the database.");
             return false;
         }
     }
diff --git a/lib/grade/grade_history.php b/lib/grade/grade_history.php
index 08c65778cb..56fb5f669b 100644
--- a/lib/grade/grade_history.php
+++ b/lib/grade/grade_history.php
@@ -102,7 +102,6 @@ class grade_history extends grade_object {
                 return $grade_history;
             }
         } else {
-            debugging("No grade_history matching your criteria in the database.");
             return false;
         }
     } 
diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php
index 6e249b0cdf..1da7943f8e 100644
--- a/lib/grade/grade_item.php
+++ b/lib/grade/grade_item.php
@@ -426,7 +426,6 @@ class grade_item extends grade_object {
                 return $grade_item;
             }
         } else { 
-            debugging("No grade_item matching these criteria in the database.");
             return false;
         }
     }
@@ -513,7 +512,7 @@ class grade_item extends grade_object {
                 $this->grade_grades_raw[$userid] = $raw_grade;
             }
         } else {
-            debugging("The data given to grade_item::save_raw($data) was not valid, it must be an arra of raw grades.");
+            debugging("The data given to grade_item::save_raw($raw_grades) was not valid, it must be an array of raw grades.");
             return false;
         }
     }
diff --git a/lib/grade/grade_object.php b/lib/grade/grade_object.php
index 111d642db6..5b87aff595 100644
--- a/lib/grade/grade_object.php
+++ b/lib/grade/grade_object.php
@@ -137,7 +137,7 @@ class grade_object {
      */
     function update_from_db() {
         if (empty($this->id)) {
-            debugging("The object could not be used in its state to retrieve a matching record from the DB, because it's id field is not set.");
+            debugging("The object could not be used in its state to retrieve a matching record from the DB, because its id field is not set.");
             return false;
         } else {
             $class = get_class($this);
diff --git a/lib/grade/grade_outcome.php b/lib/grade/grade_outcome.php
index 7d2a855151..707351935f 100644
--- a/lib/grade/grade_outcome.php
+++ b/lib/grade/grade_outcome.php
@@ -117,7 +117,6 @@ class grade_outcome extends grade_object {
                 return $grade_outcome;
             }
         } else {
-            debugging("No matching grade_outcome in DB with the given criteria.");
             return false;
         }
     }
diff --git a/lib/grade/grade_scale.php b/lib/grade/grade_scale.php
index d65555fb25..38264bc492 100644
--- a/lib/grade/grade_scale.php
+++ b/lib/grade/grade_scale.php
@@ -96,7 +96,6 @@ class grade_scale extends grade_object {
                 return $grade_scale;
             }
         } else {
-            debugging("No matching grade_scale in DB with the given criteria.");
             return false;
         }
     }
diff --git a/lib/simpletest/testgradelib.php b/lib/simpletest/testgradelib.php
index a348105f96..0ad1eb3442 100644
--- a/lib/simpletest/testgradelib.php
+++ b/lib/simpletest/testgradelib.php
@@ -385,7 +385,7 @@ class gradelib_test extends UnitTestCase {
         $grade_category->courseid    = $this->courseid;
         $grade_category->aggregation = GRADE_AGGREGATE_MEAN;
         $grade_category->keephigh    = 100;
-        $grade_category->droplow     = 10;
+        $grade_category->droplow     = 0;
         $grade_category->hidden      = 0;
         $grade_category->timecreated = mktime();
         $grade_category->timemodified = mktime();
@@ -401,7 +401,7 @@ class gradelib_test extends UnitTestCase {
         $grade_category->courseid    = $this->courseid;
         $grade_category->aggregation = GRADE_AGGREGATE_MEAN;
         $grade_category->keephigh    = 100;
-        $grade_category->droplow     = 10;
+        $grade_category->droplow     = 0;
         $grade_category->hidden      = 0;
         $grade_category->parent      = $this->grade_categories[0]->id;
         $grade_category->timecreated = mktime();
@@ -418,7 +418,7 @@ class gradelib_test extends UnitTestCase {
         $grade_category->courseid    = $this->courseid;
         $grade_category->aggregation = GRADE_AGGREGATE_MEAN;
         $grade_category->keephigh    = 100;
-        $grade_category->droplow     = 10;
+        $grade_category->droplow     = 0;
         $grade_category->hidden      = 0;
         $grade_category->parent      = $this->grade_categories[0]->id;
         $grade_category->timecreated = mktime();
@@ -437,7 +437,7 @@ class gradelib_test extends UnitTestCase {
         $grade_category->courseid    = $this->courseid;
         $grade_category->aggregation = GRADE_AGGREGATE_MEAN;
         $grade_category->keephigh    = 100;
-        $grade_category->droplow     = 10;
+        $grade_category->droplow     = 0;
         $grade_category->hidden      = 0;
         $grade_category->timecreated = mktime();
         $grade_category->timemodified = mktime();