public function load_latest_steps($attempts) { $qubaids = array(); foreach ($attempts as $attempt) { $qubaids[] = $attempt->uniqueid; } $dm = new question_engine_data_mapper(); $qubaidcondition = new qubaid_list($qubaids); $slots = array_filter(explode(',', $attempt->layout)); $lateststeps = $dm->load_questions_usages_latest_steps($qubaidcondition, $slots); $this->lateststeps = array(); foreach ($lateststeps as $step) { $this->lateststeps[$step->questionusageid][$step->slot] = $step; } }
protected function dotest_load_questions_usages_latest_steps() { $rawstates = $this->dm->load_questions_usages_latest_steps($this->bothusages, $this->allslots); $states = array(); foreach ($rawstates as $state) { $states[$state->questionusageid][$state->slot] = $state; foreach (get_object_vars($state) as $name => $notused) { if (!in_array($name, array('questionid', 'maxmark', 'sequencenumber', 'state'))) { unset($state->$name); } } } $state = $states[$this->usageids[0]][$this->allslots[0]]; $this->assertEquals((object) array( 'questionid' => $this->sa->id, 'maxmark' => '5.0000000', 'sequencenumber' => 2, 'state' => (string) question_state::$gradedright, ), $state); $state = $states[$this->usageids[0]][$this->allslots[1]]; $this->assertEquals((object) array( 'questionid' => $this->essay->id, 'maxmark' => '10.0000000', 'sequencenumber' => 2, 'state' => (string) question_state::$needsgrading, ), $state); $state = $states[$this->usageids[1]][$this->allslots[0]]; $this->assertEquals((object) array( 'questionid' => $this->sa->id, 'maxmark' => '5.0000000', 'sequencenumber' => 2, 'state' => (string) question_state::$gradedwrong, ), $state); $state = $states[$this->usageids[1]][$this->allslots[1]]; $this->assertEquals((object) array( 'questionid' => $this->essay->id, 'maxmark' => '10.0000000', 'sequencenumber' => 1, 'state' => (string) question_state::$gaveup, ), $state); }
/** * This test is executed by {@link test_reporting_queries()}. */ protected function dotest_load_questions_usages_latest_steps() { $rawstates = $this->dm->load_questions_usages_latest_steps($this->bothusages, $this->allslots, 'qa.id AS questionattemptid, qa.questionusageid, qa.slot, ' . 'qa.questionid, qa.maxmark, qas.sequencenumber, qas.state'); $states = array(); foreach ($rawstates as $state) { $states[$state->questionusageid][$state->slot] = $state; unset($state->questionattemptid); unset($state->questionusageid); unset($state->slot); } $state = $states[$this->usageids[0]][$this->allslots[0]]; $this->assertEquals((object) array('questionid' => $this->sa->id, 'maxmark' => '5.0000000', 'sequencenumber' => 2, 'state' => (string) question_state::$gradedright), $state); $state = $states[$this->usageids[0]][$this->allslots[1]]; $this->assertEquals((object) array('questionid' => $this->essay->id, 'maxmark' => '10.0000000', 'sequencenumber' => 2, 'state' => (string) question_state::$needsgrading), $state); $state = $states[$this->usageids[1]][$this->allslots[0]]; $this->assertEquals((object) array('questionid' => $this->sa->id, 'maxmark' => '5.0000000', 'sequencenumber' => 2, 'state' => (string) question_state::$gradedwrong), $state); $state = $states[$this->usageids[1]][$this->allslots[1]]; $this->assertEquals((object) array('questionid' => $this->essay->id, 'maxmark' => '10.0000000', 'sequencenumber' => 1, 'state' => (string) question_state::$gaveup), $state); }
/** * Load information about the latest state of selected questions in selected attempts. * * The results are returned as an two dimensional array $qubaid => $slot => $dataobject * * @param qubaid_condition $qubaids used to restrict which usages are included * in the query. See {@link qubaid_condition}. * @return array of records. See the SQL in this function to see the fields available. */ protected function load_question_latest_steps(qubaid_condition $qubaids) { $dm = new question_engine_data_mapper(); $latesstepdata = $dm->load_questions_usages_latest_steps( $qubaids, array_keys($this->questions)); $lateststeps = array(); foreach ($latesstepdata as $step) { $lateststeps[$step->questionusageid][$step->slot] = $step; } return $lateststeps; }
/** * Get the latest step data from the db, from which we will calculate stats. * * @param \qubaid_condition $qubaids Which question usages to get the latest steps for? * @return array with two items * - $lateststeps array of latest step data for the question usages * - $summarks array of total marks for each usage, indexed by usage id */ protected function get_latest_steps($qubaids) { $dm = new \question_engine_data_mapper(); $fields = " qas.id,\n qa.questionusageid,\n qa.questionid,\n qa.variant,\n qa.slot,\n qa.maxmark,\n qas.fraction * qa.maxmark as mark"; $lateststeps = $dm->load_questions_usages_latest_steps($qubaids, $this->stats->get_all_slots(), $fields); $summarks = array(); if ($lateststeps) { foreach ($lateststeps as $step) { if (!isset($summarks[$step->questionusageid])) { $summarks[$step->questionusageid] = 0; } $summarks[$step->questionusageid] += $step->mark; } } return array($lateststeps, $summarks); }
/** * @param $qubaids \qubaid_condition * @return array with three items * - $lateststeps array of latest step data for the question usages * - $summarks array of total marks for each usage, indexed by usage id * - $summarksavg the average of the total marks over all the usages */ protected function get_latest_steps($qubaids) { $dm = new \question_engine_data_mapper(); $fields = " qas.id,\n qa.questionusageid,\n qa.questionid,\n qa.slot,\n qa.maxmark,\n qas.fraction * qa.maxmark as mark"; $lateststeps = $dm->load_questions_usages_latest_steps($qubaids, array_keys($this->questionstats), $fields); $summarks = array(); if ($lateststeps) { foreach ($lateststeps as $step) { if (!isset($summarks[$step->questionusageid])) { $summarks[$step->questionusageid] = 0; } $summarks[$step->questionusageid] += $step->mark; } $summarksavg = array_sum($summarks) / count($summarks); } else { $summarksavg = null; } return array($lateststeps, $summarks, $summarksavg); }