From ab53054fd14e2c052c366a7e63db726f49375aec Mon Sep 17 00:00:00 2001 From: nicolasconnault Date: Mon, 21 May 2007 05:54:12 +0000 Subject: [PATCH] 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. --- lib/grade/grade_calculation.php | 1 - lib/grade/grade_category.php | 136 ++++++++++++++++++++----------- lib/grade/grade_grades_final.php | 1 - lib/grade/grade_grades_raw.php | 1 - lib/grade/grade_grades_text.php | 1 - lib/grade/grade_history.php | 1 - lib/grade/grade_item.php | 3 +- lib/grade/grade_object.php | 2 +- lib/grade/grade_outcome.php | 1 - lib/grade/grade_scale.php | 1 - lib/simpletest/testgradelib.php | 8 +- 11 files changed, 93 insertions(+), 63 deletions(-) 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(); -- 2.39.5