MDL-15198 "non-standard sql in reportlib.php" fixed this with new sql that does not require a limit clause.

This commit is contained in:
jamiesensei 2008-06-30 11:53:47 +00:00
parent 2867b1161b
commit 334edb71c1
2 changed files with 41 additions and 31 deletions

View File

@ -53,7 +53,9 @@ class quiz_overview_report extends quiz_default_report {
$pageoptions['mode'] = 'overview';
$reporturl = new moodle_url($CFG->wwwroot.'/mod/quiz/report.php', $pageoptions);
$qmsubselect = quiz_report_qm_filter_subselect($quiz); // careful: these are named params in $params!!
$qmsubselect = quiz_report_qm_filter_select($quiz);
/// find out current groups mode
$currentgroup = groups_get_activity_group($cm, true);
@ -183,7 +185,7 @@ class quiz_overview_report extends quiz_default_report {
// Construct the SQL
$fields = $DB->sql_concat('u.id', '\'#\'', 'COALESCE(qa.attempt, \'0\')').' AS uniqueid, '.
($qmsubselect?$qmsubselect.' AS gradedattempt, ':'').
($qmsubselect?"($qmsubselect) AS gradedattempt, ":'').
'qa.uniqueid AS attemptuniqueid, qa.id AS attempt, u.id AS userid, u.idnumber, u.firstname, u.lastname, u.picture, '.
'qa.sumgrades, qa.timefinish, qa.timestart, qa.timefinish - qa.timestart AS duration ';

View File

@ -40,20 +40,18 @@ function quiz_get_newgraded_states($attemptids, $idxattemptq = true, $fields='qs
function quiz_get_average_grade_for_questions($quiz, $userids){
global $CFG, $DB;
$qmfilter = quiz_report_qm_filter_subselect($quiz, 'qa.userid');
$params['quizid'] = $quiz->id;
list($usql, $u_params) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED, 'u0000');
$params += $u_params;
$questionavgssql = "SELECT qs.question, AVG(qs.grade) FROM
{question_sessions} qns,
{quiz_attempts} qa,
{question_states} qs
WHERE qns.attemptid = qa.uniqueid AND " .
($qmfilter?$qmfilter.' AND ':'') . "
qa.quiz = :quizid AND
qa.userid $usql AND
qs.event IN (".QUESTION_EVENTS_GRADED.") AND
qns.newgraded = qs.id GROUP BY qs.question";
$qmfilter = quiz_report_qm_filter_select($quiz);
list($usql, $params) = $DB->get_in_or_equal($userids);
$params[] = $quiz->id;
$questionavgssql = "SELECT qns.questionid, AVG(qs.grade) FROM
{quiz_attempts} qa
LEFT JOIN {question_sessions} qns ON (qns.attemptid = qa.uniqueid)
LEFT JOIN {question_states} qs ON (qns.newgraded = qs.id AND qs.event IN (".QUESTION_EVENTS_GRADED."))
WHERE " .
"($qmfilter) AND " .
"qa.userid $usql AND " .
"qa.quiz = ? ".
"GROUP BY qs.question";
return $DB->get_records_sql_menu($questionavgssql, $params);
}
@ -143,37 +141,47 @@ function quiz_report_load_questions($quiz){
* one attempt that will be graded for each user. Or return
* empty string if all attempts contribute to final grade.
*/
function quiz_report_qm_filter_subselect($quiz, $useridsql = 'u.id', $quizidsql = 'qa.quiz'){
global $CFG;
function quiz_report_qm_filter_select($quiz){
if ($quiz->attempts == 1) {//only one attempt allowed on this quiz
return '';
}
$useridsql = 'qa.userid';
$quizidsql = 'qa.quiz';
$qmfilterattempts = true;
switch ($quiz->grademethod) {
case QUIZ_GRADEHIGHEST :
$qmorderby = 'sumgrades DESC, timestart ASC';
$field1 = 'sumgrades';
$field2 = 'timestart';
$aggregator1 = 'MAX';
$aggregator2 = 'MIN';
$qmselectpossible = true;
break;
case QUIZ_GRADEAVERAGE :
$qmfilterattempts = false;
$qmselectpossible = false;
break;
case QUIZ_ATTEMPTFIRST :
$qmorderby = 'timestart ASC';
$field1 = 'timestart';
$field2 = 'id';
$aggregator1 = 'MIN';
$aggregator2 = 'MIN';
$qmselectpossible = true;
break;
case QUIZ_ATTEMPTLAST :
$qmorderby = 'timestart DESC';
$field1 = 'timestart';
$field2 = 'id';
$aggregator1 = 'MAX';
$aggregator2 = 'MAX';
$qmselectpossible = true;
break;
}
//no new params in this query, it is assumed that quizid will be used somewhere else
//in the main query.
if ($qmfilterattempts){
$qmsubselect = "(SELECT id FROM {quiz_attempts} " .
"WHERE quiz = $quizidsql AND userid = $useridsql " .
"ORDER BY $qmorderby LIMIT 1)=qa.id";
if ($qmselectpossible){
$qmselect = "qa.$field1 = (SELECT $aggregator1(qa2.$field1) FROM {quiz_attempts} qa2 WHERE qa2.quiz = $quizidsql AND qa2.userid = $useridsql) AND " .
"qa.$field2 = (SELECT $aggregator2(qa3.$field2) FROM {quiz_attempts} qa3 WHERE qa3.quiz = $quizidsql AND qa3.userid = $useridsql AND qa3.$field1 = qa.$field1)";
} else {
$qmsubselect = '';
$qmselect = '';
}
return $qmsubselect;
return $qmselect;
}
function quiz_report_grade_bands($bandwidth, $bands, $quizid, $userids=array()){