Improve speed when generating score see BT#

pull/2874/head
Julio 7 years ago
parent 9deeca914b
commit 56c10148b3
  1. 2
      main/admin/questions.php
  2. 2
      main/exercise/annotation_user.php
  3. 18
      main/exercise/exercise.class.php
  4. 2
      main/exercise/hotspot_answers.as.php
  5. 12
      main/exercise/question.class.php
  6. 7
      main/exercise/question_pool.php
  7. 2
      main/exercise/recalculate.php
  8. 8
      main/exercise/upload_exercise.php
  9. 4
      main/inc/ajax/exercise.ajax.php
  10. 6
      main/inc/lib/exercise.lib.php
  11. 41
      plugin/questionoptionsevaluation/QuestionOptionsEvaluationPlugin.php
  12. 5
      plugin/questionoptionsevaluation/evaluation.php
  13. 2
      src/Chamilo/CourseBundle/Component/CourseCopy/Resources/QuizQuestion.php

@ -96,7 +96,7 @@ if ($formSent) {
$question->courseCode = $courseCode; $question->courseCode = $courseCode;
// Creating empty exercise // Creating empty exercise
$exercise = new Exercise($courseId); $exercise = new Exercise($courseId);
$questionObject = Question::read($question->getId(), $courseId); $questionObject = Question::read($question->getId(), $courseInfo);
ob_start(); ob_start();
ExerciseLib::showQuestion( ExerciseLib::showQuestion(

@ -14,7 +14,7 @@ if (empty($courseInfo)) {
return ''; return '';
} }
$objQuestion = Question::read($questionId, $courseId); $objQuestion = Question::read($questionId, $courseInfo);
$documentPath = api_get_path(SYS_COURSE_PATH).$courseInfo['path'].'/document'; $documentPath = api_get_path(SYS_COURSE_PATH).$courseInfo['path'].'/document';
$picturePath = $documentPath.'/images'; $picturePath = $documentPath.'/images';
$pictureSize = getimagesize($picturePath.'/'.$objQuestion->getPictureFilename()); $pictureSize = getimagesize($picturePath.'/'.$objQuestion->getPictureFilename());

@ -216,7 +216,6 @@ class Exercise
} }
$this->force_edit_exercise_in_lp = api_get_configuration_value('force_edit_exercise_in_lp'); $this->force_edit_exercise_in_lp = api_get_configuration_value('force_edit_exercise_in_lp');
$this->edit_exercise_in_lp = true; $this->edit_exercise_in_lp = true;
if ($this->exercise_was_added_in_lp) { if ($this->exercise_was_added_in_lp) {
$this->edit_exercise_in_lp = $this->force_edit_exercise_in_lp == true; $this->edit_exercise_in_lp = $this->force_edit_exercise_in_lp == true;
@ -3318,7 +3317,7 @@ class Exercise
// Creates a temporary Question object // Creates a temporary Question object
$course_id = $this->course_id; $course_id = $this->course_id;
$objQuestionTmp = Question::read($questionId, $course_id); $objQuestionTmp = Question::read($questionId, $this->course);
if ($objQuestionTmp === false) { if ($objQuestionTmp === false) {
return false; return false;
@ -6453,7 +6452,6 @@ class Exercise
$new_question_list = []; $new_question_list = [];
if (!empty($question_list)) { if (!empty($question_list)) {
$media_questions = $this->getMediaList(); $media_questions = $this->getMediaList();
$media_active = $this->mediaIsActivated($media_questions); $media_active = $this->mediaIsActivated($media_questions);
if ($media_active) { if ($media_active) {
@ -7476,7 +7474,7 @@ class Exercise
} else { } else {
// standard test, just add each question score // standard test, just add each question score
foreach ($questionList as $questionId) { foreach ($questionList as $questionId) {
$question = Question::read($questionId, $this->course_id); $question = Question::read($questionId, $this->course);
$out_max_score += $question->weighting; $out_max_score += $question->weighting;
} }
} }
@ -8098,13 +8096,12 @@ class Exercise
*/ */
private function getQuestionOrderedList() private function getQuestionOrderedList()
{ {
$questionList = [];
$TBL_EXERCICE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION); $TBL_EXERCICE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_QUESTION); $TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_QUESTION);
// Getting question_order to verify that the question // Getting question_order to verify that the question
// list is correct and all question_order's were set // list is correct and all question_order's were set
$sql = "SELECT DISTINCT e.question_order $sql = "SELECT DISTINCT count(e.question_order) as count
FROM $TBL_EXERCICE_QUESTION e FROM $TBL_EXERCICE_QUESTION e
INNER JOIN $TBL_QUESTIONS q INNER JOIN $TBL_QUESTIONS q
ON (e.question_id = q.id AND e.c_id = q.c_id) ON (e.question_id = q.id AND e.c_id = q.c_id)
@ -8113,7 +8110,8 @@ class Exercise
e.exercice_id = ".$this->id; e.exercice_id = ".$this->id;
$result = Database::query($sql); $result = Database::query($sql);
$count_question_orders = Database::num_rows($result); $row = Database::fetch_array($result);
$count_question_orders = $row['count'];
// Getting question list from the order (question list drag n drop interface). // Getting question list from the order (question list drag n drop interface).
$sql = "SELECT DISTINCT e.question_id, e.question_order $sql = "SELECT DISTINCT e.question_id, e.question_order
@ -8130,6 +8128,7 @@ class Exercise
// the key of the array is the question position // the key of the array is the question position
$temp_question_list = []; $temp_question_list = [];
$counter = 1; $counter = 1;
$questionList = [];
while ($new_object = Database::fetch_object($result)) { while ($new_object = Database::fetch_object($result)) {
// Correct order. // Correct order.
$questionList[$new_object->question_order] = $new_object->question_id; $questionList[$new_object->question_order] = $new_object->question_id;
@ -8440,6 +8439,8 @@ class Exercise
private function setMediaList($questionList) private function setMediaList($questionList)
{ {
$mediaList = []; $mediaList = [];
/*
* Media feature is not activated in 1.11.x
if (!empty($questionList)) { if (!empty($questionList)) {
foreach ($questionList as $questionId) { foreach ($questionList as $questionId) {
$objQuestionTmp = Question::read($questionId, $this->course_id); $objQuestionTmp = Question::read($questionId, $this->course_id);
@ -8451,7 +8452,8 @@ class Exercise
$mediaList[999][] = $objQuestionTmp->id; $mediaList[999][] = $objQuestionTmp->id;
} }
} }
} }*/
$this->mediaList = $mediaList; $this->mediaList = $mediaList;
} }

@ -50,7 +50,7 @@ if (!api_is_allowed_to_edit(null, true)) {
} }
} }
$objQuestion = Question::read($questionId, $courseId); $objQuestion = Question::read($questionId, $objExercise->course);
$objExercise->read($exerciseId); $objExercise->read($exerciseId);
if (empty($objQuestion) || empty($objExercise)) { if (empty($objQuestion) || empty($objExercise)) {

@ -123,21 +123,19 @@ abstract class Question
* Reads question information from the data base. * Reads question information from the data base.
* *
* @param int $id - question ID * @param int $id - question ID
* @param int $course_id * @param array $course_info
* @param bool $getExerciseList
* *
* @return Question * @return Question
* *
* @author Olivier Brouckaert * @author Olivier Brouckaert
*/ */
public static function read($id, $course_id = null) public static function read($id, $course_info = [], $getExerciseList = true)
{ {
$id = (int) $id; $id = (int) $id;
if (!empty($course_id)) { if (empty($course_info)) {
$course_info = api_get_course_info_by_id($course_id);
} else {
$course_info = api_get_course_info(); $course_info = api_get_course_info();
} }
$course_id = $course_info['real_id']; $course_id = $course_info['real_id'];
if (empty($course_id) || $course_id == -1) { if (empty($course_id) || $course_id == -1) {
@ -171,6 +169,7 @@ abstract class Question
$objQuestion->category = TestCategory::getCategoryForQuestion($id, $course_id); $objQuestion->category = TestCategory::getCategoryForQuestion($id, $course_id);
$objQuestion->code = isset($object->code) ? $object->code : ''; $objQuestion->code = isset($object->code) ? $object->code : '';
if ($getExerciseList) {
$tblQuiz = Database::get_course_table(TABLE_QUIZ_TEST); $tblQuiz = Database::get_course_table(TABLE_QUIZ_TEST);
$sql = "SELECT DISTINCT q.exercice_id $sql = "SELECT DISTINCT q.exercice_id
FROM $TBL_EXERCISE_QUESTION q FROM $TBL_EXERCISE_QUESTION q
@ -189,6 +188,7 @@ abstract class Question
$objQuestion->exerciseList[] = $obj->exercice_id; $objQuestion->exerciseList[] = $obj->exercice_id;
} }
} }
}
return $objQuestion; return $objQuestion;
} }

@ -71,7 +71,7 @@ if ($is_allowedToEdit) {
$current_course = api_get_course_info(); $current_course = api_get_course_info();
$old_question_id = $question_copy; $old_question_id = $question_copy;
// Reading the source question // Reading the source question
$old_question_obj = Question::read($old_question_id, $origin_course_id); $old_question_obj = Question::read($old_question_id, $origin_course_info);
$courseId = $current_course['real_id']; $courseId = $current_course['real_id'];
if ($old_question_obj) { if ($old_question_obj) {
$old_question_obj->updateTitle($old_question_obj->selectTitle().' - '.get_lang('Copy')); $old_question_obj->updateTitle($old_question_obj->selectTitle().' - '.get_lang('Copy'));
@ -141,7 +141,7 @@ if ($is_allowedToEdit) {
$current_course = api_get_course_info(); $current_course = api_get_course_info();
foreach ($question_data as $old_question_id) { foreach ($question_data as $old_question_id) {
//Reading the source question //Reading the source question
$old_question_obj = Question::read($old_question_id, $origin_course_id); $old_question_obj = Question::read($old_question_id, $origin_course_info);
if ($old_question_obj) { if ($old_question_obj) {
$old_question_obj->updateTitle( $old_question_obj->updateTitle(
$old_question_obj->selectTitle().' - '.get_lang('Copy') $old_question_obj->selectTitle().' - '.get_lang('Copy')
@ -1040,7 +1040,8 @@ function get_action_icon_for_question(
*/ */
function get_question_type_for_question($in_selectedcourse, $in_questionid) function get_question_type_for_question($in_selectedcourse, $in_questionid)
{ {
$myObjQuestion = Question::read($in_questionid, $in_selectedcourse); $courseInfo = api_get_course_info_by_id($in_selectedcourse);
$myObjQuestion = Question::read($in_questionid, $courseInfo);
$questionType = null; $questionType = null;
if (!empty($myObjQuestion)) { if (!empty($myObjQuestion)) {
list($typeImg, $typeExpl) = $myObjQuestion->get_type_icon_html(); list($typeImg, $typeExpl) = $myObjQuestion->get_type_icon_html();

@ -62,7 +62,7 @@ if ('true' === $pluginEvaluation->get(QuestionOptionsEvaluationPlugin::SETTING_E
if (!$useEvaluationPlugin) { if (!$useEvaluationPlugin) {
foreach ($questionList as $questionId) { foreach ($questionList as $questionId) {
$question = Question::read($questionId, $courseId); $question = Question::read($questionId, api_get_course_info());
$totalWeight += $question->selectWeighting(); $totalWeight += $question->selectWeighting();
// We're inside *one* question. Go through each possible answer for this question // We're inside *one* question. Go through each possible answer for this question

@ -436,7 +436,7 @@ function lp_upload_quiz_action_handling()
$questionObj = Question::read( $questionObj = Question::read(
$question_id, $question_id,
$courseId $_course
); );
if ($questionObj) { if ($questionObj) {
@ -456,7 +456,7 @@ function lp_upload_quiz_action_handling()
break; break;
case FREE_ANSWER: case FREE_ANSWER:
$globalScore = isset($scoreList[$i]) ? $scoreList[$i] : null; $globalScore = isset($scoreList[$i]) ? $scoreList[$i] : null;
$questionObj = Question::read($question_id, $courseId); $questionObj = Question::read($question_id, $_course);
if ($questionObj) { if ($questionObj) {
$questionObj->updateWeighting($globalScore); $questionObj->updateWeighting($globalScore);
$questionObj->save($exercise); $questionObj->save($exercise);
@ -489,7 +489,7 @@ function lp_upload_quiz_action_handling()
$objAnswer->save(); $objAnswer->save();
$questionObj = Question::read($question_id, $courseId); $questionObj = Question::read($question_id, $_course);
if ($questionObj) { if ($questionObj) {
$questionObj->updateWeighting($globalScore); $questionObj->updateWeighting($globalScore);
$questionObj->save($exercise); $questionObj->save($exercise);
@ -520,7 +520,7 @@ function lp_upload_quiz_action_handling()
$counter++; $counter++;
} }
$objAnswer->save(); $objAnswer->save();
$questionObj = Question::read($question_id, $courseId); $questionObj = Question::read($question_id, $_course);
if ($questionObj) { if ($questionObj) {
$questionObj->updateWeighting($globalScore); $questionObj->updateWeighting($globalScore);
$questionObj->save($exercise); $questionObj->save($exercise);

@ -498,7 +498,7 @@ switch ($action) {
$total_weight = 0; $total_weight = 0;
if ($type == 'simple') { if ($type == 'simple') {
foreach ($question_list as $my_question_id) { foreach ($question_list as $my_question_id) {
$objQuestionTmp = Question::read($my_question_id, $course_id); $objQuestionTmp = Question::read($my_question_id, $objExercise->course);
$total_weight += $objQuestionTmp->selectWeighting(); $total_weight += $objQuestionTmp->selectWeighting();
} }
} }
@ -521,7 +521,7 @@ switch ($action) {
} }
// Creates a temporary Question object // Creates a temporary Question object
$objQuestionTmp = Question::read($my_question_id, $course_id); $objQuestionTmp = Question::read($my_question_id, $objExercise->course);
$myChoiceDegreeCertainty = null; $myChoiceDegreeCertainty = null;
if ($objQuestionTmp->type === MULTIPLE_ANSWER_TRUE_FALSE_DEGREE_CERTAINTY) { if ($objQuestionTmp->type === MULTIPLE_ANSWER_TRUE_FALSE_DEGREE_CERTAINTY) {

@ -56,7 +56,7 @@ class ExerciseLib
// Change false to true in the following line to enable answer hinting // Change false to true in the following line to enable answer hinting
$debug_mark_answer = $show_answers; $debug_mark_answer = $show_answers;
// Reads question information // Reads question information
if (!$objQuestionTmp = Question::read($questionId, $course_id)) { if (!$objQuestionTmp = Question::read($questionId, $course)) {
// Question not found // Question not found
return false; return false;
} }
@ -2545,7 +2545,7 @@ HOTSPOT;
$question_list = explode(',', $exercise_stat_info['data_tracking']); $question_list = explode(',', $exercise_stat_info['data_tracking']);
if (!empty($question_list)) { if (!empty($question_list)) {
foreach ($question_list as $questionId) { foreach ($question_list as $questionId) {
$objQuestionTmp = Question::read($questionId, $course_id); $objQuestionTmp = Question::read($questionId, $objExercise->course);
// We're inside *one* question. Go through each possible answer for this question // We're inside *one* question. Go through each possible answer for this question
$result = $objExercise->manage_answer( $result = $objExercise->manage_answer(
$exeId, $exeId,
@ -4560,7 +4560,7 @@ EOT;
if (!empty($question_list)) { if (!empty($question_list)) {
foreach ($question_list as $questionId) { foreach ($question_list as $questionId) {
// Creates a temporary Question object // Creates a temporary Question object
$objQuestionTmp = Question::read($questionId); $objQuestionTmp = Question::read($questionId, $objExercise->course);
// This variable came from exercise_submit_modal.php // This variable came from exercise_submit_modal.php
ob_start(); ob_start();
$choice = null; $choice = null;

@ -203,12 +203,17 @@ class QuestionOptionsEvaluationPlugin extends Plugin
*/ */
private function recalculateQuestionScore($formula, Exercise $exercise) private function recalculateQuestionScore($formula, Exercise $exercise)
{ {
foreach ($exercise->questionList as $questionId) { $counter = 0;
$question = Question::read($questionId);
$table = Database::get_course_table(TABLE_QUIZ_QUESTION);
$tableAnswer = Database::get_course_table(TABLE_QUIZ_ANSWER);
foreach ($exercise->questionList as $questionId) {
$question = Question::read($questionId, $exercise->course, false);
if (!in_array($question->selectType(), [UNIQUE_ANSWER, MULTIPLE_ANSWER])) { if (!in_array($question->selectType(), [UNIQUE_ANSWER, MULTIPLE_ANSWER])) {
continue; continue;
} }
$counter++;
$questionAnswers = new Answer($questionId, $exercise->course_id, $exercise); $questionAnswers = new Answer($questionId, $exercise->course_id, $exercise);
$counts = array_count_values($questionAnswers->correct); $counts = array_count_values($questionAnswers->correct);
@ -217,7 +222,6 @@ class QuestionOptionsEvaluationPlugin extends Plugin
foreach ($questionAnswers->correct as $i => $correct) { foreach ($questionAnswers->correct as $i => $correct) {
if ($question->selectType() == MULTIPLE_ANSWER || 0 === $formula) { if ($question->selectType() == MULTIPLE_ANSWER || 0 === $formula) {
$weighting[$i] = 1 == $correct ? 1 / $counts[1] : -1 / $counts[0]; $weighting[$i] = 1 == $correct ? 1 / $counts[1] : -1 / $counts[0];
continue; continue;
} }
@ -226,15 +230,16 @@ class QuestionOptionsEvaluationPlugin extends Plugin
} }
} }
$questionAnswers->new_nbrAnswers = $questionAnswers->nbrAnswers; for ($i = 1; $i <= $questionAnswers->nbrAnswers; $i++) {
$questionAnswers->new_answer = $questionAnswers->answer; $weightingValue = $weighting[$i];
$questionAnswers->new_comment = $questionAnswers->comment; if (!isset($questionAnswers->iid[$i])) {
$questionAnswers->new_correct = $questionAnswers->correct; continue;
$questionAnswers->new_weighting = $weighting; }
$questionAnswers->new_position = $questionAnswers->position;
$questionAnswers->new_destination = $questionAnswers->destination; $iid = $questionAnswers->iid[$i];
$questionAnswers->new_hotspot_coordinates = $questionAnswers->hotspot_coordinates; $sql = "UPDATE $tableAnswer SET ponderation = '$weightingValue' WHERE iid = $iid";
$questionAnswers->new_hotspot_type = $questionAnswers->hotspot_type; Database::query($sql);
}
$allowedWeights = array_filter( $allowedWeights = array_filter(
$weighting, $weighting,
@ -243,9 +248,15 @@ class QuestionOptionsEvaluationPlugin extends Plugin
} }
); );
$questionAnswers->save(); //$question->updateWeighting(array_sum($allowedWeights));
$question->updateWeighting(array_sum($allowedWeights)); //$question->save($exercise);
$question->save($exercise);
$params = ['ponderation' => array_sum($allowedWeights)];
Database::update(
$table,
$params,
['iid = ?' => [$question->iid]]
);
} }
} }

@ -16,7 +16,7 @@ if (empty($exerciseId)) {
$exercise = new Exercise(); $exercise = new Exercise();
if (!$exercise->read($exerciseId)) { if (!$exercise->read($exerciseId, false)) {
echo Display::return_message(get_lang('ExerciseNotFound'), 'error'); echo Display::return_message(get_lang('ExerciseNotFound'), 'error');
exit; exit;
@ -48,11 +48,10 @@ $formEvaluation->addButtonSave(get_lang('Save'))->setColumnsSize([4, 7, 1]);
$formEvaluation->addHidden('exercise', $exerciseId); $formEvaluation->addHidden('exercise', $exerciseId);
if ($formEvaluation->validate()) { if ($formEvaluation->validate()) {
$exercise->read($exerciseId, true);
$values = $formEvaluation->exportValues(); $values = $formEvaluation->exportValues();
$formula = isset($values['formula']) ? (int) $values['formula'] : 0; $formula = isset($values['formula']) ? (int) $values['formula'] : 0;
$plugin->saveFormulaForExercise($formula, $exercise); $plugin->saveFormulaForExercise($formula, $exercise);
Display::addFlash( Display::addFlash(
Display::return_message( Display::return_message(
sprintf($plugin->get_lang('FormulaSavedForExerciseX'), $exercise->selectTitle(true)), sprintf($plugin->get_lang('FormulaSavedForExerciseX'), $exercise->selectTitle(true)),

@ -110,7 +110,7 @@ class QuizQuestion extends Resource
$courseId = $courseInfo['real_id']; $courseId = $courseInfo['real_id'];
$courseCode = $courseInfo['code']; $courseCode = $courseInfo['code'];
$questionId = $this->source_id; $questionId = $this->source_id;
$question = \Question::read($questionId, $courseId); $question = \Question::read($questionId, $courseInfo);
$pictureId = $question->getPictureId(); $pictureId = $question->getPictureId();
// Add the picture document in the builder // Add the picture document in the builder
if (!empty($pictureId)) { if (!empty($pictureId)) {

Loading…
Cancel
Save