Improve question pool performance

pull/2827/head
Julio Montoya 7 years ago
parent 3f1a59978b
commit fd4d8d2eca
  1. 1
      main/exercise/admin.php
  2. 27
      main/exercise/exercise.class.php
  3. 35
      main/exercise/question_pool.php

@ -169,7 +169,6 @@ if (!is_object($objExercise)) {
// saves the object into the session // saves the object into the session
Session::write('objExercise', $objExercise); Session::write('objExercise', $objExercise);
} }
// Exercise can be edited in their course. // Exercise can be edited in their course.
if ($objExercise->sessionId != $sessionId) { if ($objExercise->sessionId != $sessionId) {
api_not_allowed(true); api_not_allowed(true);

@ -1170,6 +1170,33 @@ class Exercise
return $inList; return $inList;
} }
/**
* If current exercise has a question
*
* @param int $questionId
*
* @return int
*/
public function hasQuestion($questionId)
{
$questionId = (int) $questionId;
$TBL_EXERCICE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_QUESTION);
$sql = "SELECT q.id
FROM $TBL_EXERCICE_QUESTION e
INNER JOIN $TBL_QUESTIONS q
ON (e.question_id = q.id AND e.c_id = q.c_id)
WHERE
q.id = $questionId AND
e.c_id = {$this->course_id} AND
e.exercice_id = ".$this->id;
$result = Database::query($sql);
return Database::num_rows($result) > 0;
}
/** /**
* changes the exercise title. * changes the exercise title.
* *

@ -48,7 +48,7 @@ $_course = api_get_course_info();
if (empty($objExercise) && !empty($fromExercise)) { if (empty($objExercise) && !empty($fromExercise)) {
$objExercise = new Exercise(); $objExercise = new Exercise();
$objExercise->read($fromExercise); $objExercise->read($fromExercise, false);
} }
$nameTools = get_lang('QuestionPool'); $nameTools = get_lang('QuestionPool');
@ -402,8 +402,6 @@ $question_list = Question::get_question_type_list();
$new_question_list = []; $new_question_list = [];
$new_question_list['-1'] = get_lang('All'); $new_question_list['-1'] = get_lang('All');
if (!empty($_course)) { if (!empty($_course)) {
$objExercise = new Exercise();
$objExercise->read($fromExercise);
foreach ($question_list as $key => $item) { foreach ($question_list as $key => $item) {
if ($objExercise->feedback_type == EXERCISE_FEEDBACK_TYPE_DIRECT) { if ($objExercise->feedback_type == EXERCISE_FEEDBACK_TYPE_DIRECT) {
if (!in_array($key, [HOT_SPOT_DELINEATION, UNIQUE_ANSWER])) { if (!in_array($key, [HOT_SPOT_DELINEATION, UNIQUE_ANSWER])) {
@ -705,10 +703,9 @@ $pagination->renderer = function ($data) use ($url) {
if ($data['pageCount'] > 1) { if ($data['pageCount'] > 1) {
$render = '<ul class="pagination">'; $render = '<ul class="pagination">';
for ($i = 1; $i <= $data['pageCount']; $i++) { for ($i = 1; $i <= $data['pageCount']; $i++) {
$page = (int) $i; $pageContent = '<li><a href="'.$url.'&page='.$i.'">'.$i.'</a></li>';
$pageContent = '<li><a href="'.$url.'&page='.$page.'">'.$page.'</a></li>'; if ($data['current'] == $i) {
if ($data['current'] == $page) { $pageContent = '<li class="active"><a href="#" >'.$i.'</a></li>';
$pageContent = '<li class="active"><a href="#" >'.$page.'</a></li>';
} }
$render .= $pageContent; $render .= $pageContent;
} }
@ -791,7 +788,6 @@ if (is_array($mainQuestionList)) {
if (empty($question_type)) { if (empty($question_type)) {
continue; continue;
} }
$sessionId = isset($question['session_id']) ? $question['session_id'] : null; $sessionId = isset($question['session_id']) ? $question['session_id'] : null;
$exerciseName = isset($question['exercise_name']) ? '<br />('.$question['exercise_id'].') ' : null; $exerciseName = isset($question['exercise_name']) ? '<br />('.$question['exercise_id'].') ' : null;
$row[] = getLinkForQuestion( $row[] = getLinkForQuestion(
@ -803,6 +799,7 @@ if (is_array($mainQuestionList)) {
$sessionId, $sessionId,
$question['exerciseId'] $question['exerciseId']
).$exerciseName; ).$exerciseName;
$row[] = $question_type; $row[] = $question_type;
$row[] = TestCategory::getCategoryNameForQuestion($question['id'], $selected_course); $row[] = TestCategory::getCategoryNameForQuestion($question['id'], $selected_course);
$row[] = $question['level']; $row[] = $question['level'];
@ -817,7 +814,9 @@ if (is_array($mainQuestionList)) {
$exerciseLevel, $exerciseLevel,
$answerType, $answerType,
$session_id, $session_id,
$question['exerciseId'] $question['exerciseId'],
$objExercise
).'&nbsp;'. ).'&nbsp;'.
get_action_icon_for_question( get_action_icon_for_question(
$actionIcon2, $actionIcon2,
@ -830,7 +829,8 @@ if (is_array($mainQuestionList)) {
$exerciseLevel, $exerciseLevel,
$answerType, $answerType,
$session_id, $session_id,
$question['exerciseId'] $question['exerciseId'],
$objExercise
); );
$data[] = $row; $data[] = $row;
} }
@ -982,7 +982,8 @@ function get_action_icon_for_question(
$in_exerciseLevel, $in_exerciseLevel,
$in_answerType, $in_answerType,
$in_session_id, $in_session_id,
$in_exercise_id $in_exercise_id,
Exercise $myObjEx
) { ) {
$limitTeacherAccess = api_get_configuration_value('limit_exercise_teacher_access'); $limitTeacherAccess = api_get_configuration_value('limit_exercise_teacher_access');
$getParams = "&selected_course=$in_selected_course&courseCategoryId=$in_courseCategoryId&exerciseId=$in_exercise_id&exerciseLevel=$in_exerciseLevel&answerType=$in_answerType&session_id=$in_session_id"; $getParams = "&selected_course=$in_selected_course&courseCategoryId=$in_courseCategoryId&exerciseId=$in_exercise_id&exerciseLevel=$in_exerciseLevel&answerType=$in_answerType&session_id=$in_session_id";
@ -1009,20 +1010,16 @@ function get_action_icon_for_question(
); );
break; break;
case 'add': case 'add':
// add if question is not already in test $res = '-';
$myObjEx = new Exercise(); if (!$myObjEx->hasQuestion($in_questionid)) {
$myObjEx->read($from_exercise);
$res = "-";
if (!$myObjEx->isInList($in_questionid)) {
$res = "<a href='".api_get_self()."?". $res = "<a href='".api_get_self()."?".
api_get_cidreq().$getParams."&recup=$in_questionid&fromExercise=$from_exercise'>"; api_get_cidreq().$getParams."&recup=$in_questionid&fromExercise=$from_exercise'>";
$res .= Display::return_icon("view_more_stats.gif", get_lang('InsertALinkToThisQuestionInTheExercise')); $res .= Display::return_icon('view_more_stats.gif', get_lang('InsertALinkToThisQuestionInTheExercise'));
$res .= "</a>"; $res .= "</a>";
} }
unset($myObjEx);
break; break;
case 'clone': case 'clone':
$url = api_get_self()."?".api_get_cidreq().$getParams. $url = api_get_self().'?'.api_get_cidreq().$getParams.
"&question_copy=$in_questionid&course_id=$in_selected_course&fromExercise=$from_exercise"; "&question_copy=$in_questionid&course_id=$in_selected_course&fromExercise=$from_exercise";
$res = Display::url( $res = Display::url(
Display::return_icon('cd.png', get_lang('ReUseACopyInCurrentTest')), Display::return_icon('cd.png', get_lang('ReUseACopyInCurrentTest')),

Loading…
Cancel
Save