Skip to content

Commit

Permalink
Merge branch 'MDL-35453' of git://github.com/timhunt/moodle
Browse files Browse the repository at this point in the history
  • Loading branch information
Damyon Wiese committed Jun 23, 2014
2 parents 69377dd + 2ce9a94 commit 2404605
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 24 deletions.
9 changes: 5 additions & 4 deletions mod/quiz/report/overview/report.php
Expand Up @@ -526,10 +526,11 @@ protected function count_question_attempts_needing_regrade($quiz, $groupstudents
*/
protected function has_regraded_questions($from, $where, $params) {
global $DB;
$qubaids = new qubaid_join($from, 'uniqueid', $where, $params);
return $DB->record_exists_select('quiz_overview_regrades',
'questionusageid ' . $qubaids->usage_id_in(),
$qubaids->usage_id_in_params());
return $DB->record_exists_sql("
SELECT 1
FROM {$from}
JOIN {quiz_overview_regrades} qor ON qor.questionusageid = quiza.uniqueid
WHERE {$where}", $params);
}

/**
Expand Down
30 changes: 11 additions & 19 deletions mod/quiz/report/reportlib.php
Expand Up @@ -156,35 +156,27 @@ function quiz_report_qm_filter_select($quiz, $quizattemptsalias = 'quiza') {
function quiz_report_grade_method_sql($grademethod, $quizattemptsalias = 'quiza') {
switch ($grademethod) {
case QUIZ_GRADEHIGHEST :
return "$quizattemptsalias.id = (
SELECT MIN(qa2.id)
FROM {quiz_attempts} qa2
return "NOT EXISTS (SELECT 1 FROM {quiz_attempts} qa2
WHERE qa2.quiz = $quizattemptsalias.quiz AND
qa2.userid = $quizattemptsalias.userid AND
COALESCE(qa2.sumgrades, 0) = (
SELECT MAX(COALESCE(qa3.sumgrades, 0))
FROM {quiz_attempts} qa3
WHERE qa3.quiz = $quizattemptsalias.quiz AND
qa3.userid = $quizattemptsalias.userid
)
)";
qa2.userid = $quizattemptsalias.userid AND (
COALESCE(qa2.sumgrades, 0) > COALESCE($quizattemptsalias.sumgrades, 0) OR
(COALESCE(qa2.sumgrades, 0) = COALESCE($quizattemptsalias.sumgrades, 0) AND qa2.attempt < $quizattemptsalias.attempt)
))";

case QUIZ_GRADEAVERAGE :
return '';

case QUIZ_ATTEMPTFIRST :
return "$quizattemptsalias.id = (
SELECT MIN(qa2.id)
FROM {quiz_attempts} qa2
return "NOT EXISTS (SELECT 1 FROM {quiz_attempts} qa2
WHERE qa2.quiz = $quizattemptsalias.quiz AND
qa2.userid = $quizattemptsalias.userid)";
qa2.userid = $quizattemptsalias.userid AND
qa2.attempt < $quizattemptsalias.attempt)";

case QUIZ_ATTEMPTLAST :
return "$quizattemptsalias.id = (
SELECT MAX(qa2.id)
FROM {quiz_attempts} qa2
return "NOT EXISTS (SELECT 1 FROM {quiz_attempts} qa2
WHERE qa2.quiz = $quizattemptsalias.quiz AND
qa2.userid = $quizattemptsalias.userid)";
qa2.userid = $quizattemptsalias.userid AND
qa2.attempt > $quizattemptsalias.attempt)";
}
}

Expand Down
91 changes: 90 additions & 1 deletion mod/quiz/tests/reportlib_test.php
Expand Up @@ -36,7 +36,7 @@
* @copyright 2008 Jamie Pratt me@jamiep.org
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*/
class mod_quiz_reportlib_testcase extends basic_testcase {
class mod_quiz_reportlib_testcase extends advanced_testcase {
public function test_quiz_report_index_by_keys() {
$datum = array();
$object = new stdClass();
Expand Down Expand Up @@ -73,4 +73,93 @@ public function test_quiz_report_scale_summarks_as_percentage() {
$this->assertEquals('-',
quiz_report_scale_summarks_as_percentage('-', $quiz, true));
}

public function test_quiz_report_qm_filter_select_only_one_attempt_allowed() {
$quiz = new stdClass();
$quiz->attempts = 1;
$this->assertSame('', quiz_report_qm_filter_select($quiz));
}

public function test_quiz_report_qm_filter_select_average() {
$quiz = new stdClass();
$quiz->attempts = 10;
$quiz->grademethod = QUIZ_GRADEAVERAGE;
$this->assertSame('', quiz_report_qm_filter_select($quiz));
}

public function test_quiz_report_qm_filter_select_first_last_best() {
global $DB;
$this->resetAfterTest();

$fakeattempt = new stdClass();
$fakeattempt->userid = 123;
$fakeattempt->quiz = 456;
$fakeattempt->layout = '1,2,0,3,4,0,5';

// We intentionally insert these in a funny order, to test the SQL better.
// The test data is:
// id | quizid | user | attempt | sumgrades
// ----------------------------------------
// 4 | 456 | 123 | 1 | 30
// 2 | 456 | 123 | 2 | 50
// 1 | 456 | 123 | 3 | 50
// 3 | 456 | 123 | 4 | null
// 5 | 456 | 1 | 1 | 100
// layout is only given because it has a not-null constraint.
// uniqueid values are meaningless, but that column has a unique constraint.

$fakeattempt->attempt = 3;
$fakeattempt->sumgrades = 50;
$fakeattempt->uniqueid = 13;
$DB->insert_record('quiz_attempts', $fakeattempt);

$fakeattempt->attempt = 2;
$fakeattempt->sumgrades = 50;
$fakeattempt->uniqueid = 26;
$DB->insert_record('quiz_attempts', $fakeattempt);

$fakeattempt->attempt = 4;
$fakeattempt->sumgrades = null;
$fakeattempt->uniqueid = 39;
$DB->insert_record('quiz_attempts', $fakeattempt);

$fakeattempt->attempt = 1;
$fakeattempt->sumgrades = 30;
$fakeattempt->uniqueid = 52;
$DB->insert_record('quiz_attempts', $fakeattempt);

$fakeattempt->attempt = 1;
$fakeattempt->userid = 1;
$fakeattempt->sumgrades = 100;
$fakeattempt->uniqueid = 65;
$DB->insert_record('quiz_attempts', $fakeattempt);

$quiz = new stdClass();
$quiz->attempts = 10;

$quiz->grademethod = QUIZ_ATTEMPTFIRST;
$firstattempt = $DB->get_records_sql("
SELECT * FROM {quiz_attempts} quiza WHERE userid = ? AND quiz = ? AND "
. quiz_report_qm_filter_select($quiz), array(123, 456));
$this->assertEquals(1, count($firstattempt));
$firstattempt = reset($firstattempt);
$this->assertEquals(1, $firstattempt->attempt);

$quiz->grademethod = QUIZ_ATTEMPTLAST;
$lastattempt = $DB->get_records_sql("
SELECT * FROM {quiz_attempts} quiza WHERE userid = ? AND quiz = ? AND "
. quiz_report_qm_filter_select($quiz), array(123, 456));
$this->assertEquals(1, count($lastattempt));
$lastattempt = reset($lastattempt);
$this->assertEquals(4, $lastattempt->attempt);

$quiz->attempts = 0;
$quiz->grademethod = QUIZ_GRADEHIGHEST;
$bestattempt = $DB->get_records_sql("
SELECT * FROM {quiz_attempts} qa_alias WHERE userid = ? AND quiz = ? AND "
. quiz_report_qm_filter_select($quiz, 'qa_alias'), array(123, 456));
$this->assertEquals(1, count($bestattempt));
$bestattempt = reset($bestattempt);
$this->assertEquals(2, $bestattempt->attempt);
}
}

0 comments on commit 2404605

Please sign in to comment.