MDL-43246 question engine: avoid order-by id.

This was breaking with oracle master/master replication. Fortunately all
the places that needed to be changed were private to datalib.php. There
is still some ordering by id there, but only places where we want a
consitent, rather than meaningful, order, so that is OK.

The queries changed by this patch all have subqueries in aggregate
queries that pull out the latest step for a question_attempt. Those
queries used to look for MAX(id) but now they look for
MAX(sequencenumber). This is equivalent (for databases where ids always
increase with time, except for auto-saved steps. In the past,  an
auto-saved step might have been considered latest. Now the latest step
will always be one that has been properly processed. You can aruge that
this change is an improvement. Anyway, it is a moot point. All these
queries are only used in reports which are run on completed attempts,
where there will not be any autosaved data.
This commit is contained in:
Tim Hunt
2014-01-23 15:20:15 +00:00
parent 9378b7b48f
commit 6bce418d28
+16 -15
View File
@@ -390,8 +390,8 @@ SELECT
qas.userid
FROM {$qubaids->from_question_attempts('qa')}
JOIN {question_attempt_steps} qas ON
qas.id = {$this->latest_step_for_qa_subquery()}
JOIN {question_attempt_steps} qas ON qas.questionattemptid = qa.id
AND qas.sequencenumber = {$this->latest_step_for_qa_subquery()}
WHERE
{$qubaids->where()} AND
@@ -428,8 +428,8 @@ SELECT
COUNT(1) AS numattempts
FROM {$qubaids->from_question_attempts('qa')}
JOIN {question_attempt_steps} qas ON
qas.id = {$this->latest_step_for_qa_subquery()}
JOIN {question_attempt_steps} qas ON qas.questionattemptid = qa.id
AND qas.sequencenumber = {$this->latest_step_for_qa_subquery()}
JOIN {question} q ON q.id = qa.questionid
WHERE
@@ -537,8 +537,8 @@ SELECT
1
FROM {$qubaids->from_question_attempts('qa')}
JOIN {question_attempt_steps} qas ON
qas.id = {$this->latest_step_for_qa_subquery()}
JOIN {question_attempt_steps} qas ON qas.questionattemptid = qa.id
AND qas.sequencenumber = {$this->latest_step_for_qa_subquery()}
JOIN {question} q ON q.id = qa.questionid
WHERE
@@ -599,8 +599,8 @@ SELECT
COUNT(1) AS numaveraged
FROM {$qubaids->from_question_attempts('qa')}
JOIN {question_attempt_steps} qas ON
qas.id = {$this->latest_step_for_qa_subquery()}
JOIN {question_attempt_steps} qas ON qas.questionattemptid = qa.id
AND qas.sequencenumber = {$this->latest_step_for_qa_subquery()}
WHERE
{$qubaids->where()}
@@ -914,10 +914,11 @@ ORDER BY
// NULL total into a 0.
return "SELECT COALESCE(SUM(qa.maxmark * qas.fraction), 0)
FROM {question_attempts} qa
JOIN {question_attempt_steps} qas ON qas.id = (
SELECT MAX(summarks_qas.id)
FROM {question_attempt_steps} summarks_qas
WHERE summarks_qas.questionattemptid = qa.id
JOIN {question_attempt_steps} qas ON qas.questionattemptid = qa.id
AND qas.sequencenumber = (
SELECT MAX(summarks_qas.sequencenumber)
FROM {question_attempt_steps} summarks_qas
WHERE summarks_qas.questionattemptid = qa.id
)
WHERE qa.questionusageid = $qubaid
HAVING COUNT(CASE
@@ -958,15 +959,15 @@ ORDER BY
{$alias}qas.userid
FROM {$qubaids->from_question_attempts($alias . 'qa')}
JOIN {question_attempt_steps} {$alias}qas ON
{$alias}qas.id = {$this->latest_step_for_qa_subquery($alias . 'qa.id')}
JOIN {question_attempt_steps} {$alias}qas ON {$alias}qas.questionattemptid = {$alias}qa.id
AND {$alias}qas.sequencenumber = {$this->latest_step_for_qa_subquery($alias . 'qa.id')}
WHERE {$qubaids->where()}
) $alias", $qubaids->from_where_params());
}
protected function latest_step_for_qa_subquery($questionattemptid = 'qa.id') {
return "(
SELECT MAX(id)
SELECT MAX(sequencenumber)
FROM {question_attempt_steps}
WHERE questionattemptid = $questionattemptid
)";