@ -3526,37 +3526,32 @@ EOT;
/**
* Get student results (only in completed exercises) stats by question.
*
* @param int $question_id
* @param int $exercise_id
* @param string $course_code
* @param int $session_id
* @param bool $onlyStudent Filter only enrolled students
*
* @return array
* @throws \Doctrine\DBAL\Exception
*/
public static function get_student_stats_by_question(
$question_id,
$exercise_id,
$course_code,
$session_id,
$onlyStudent = false
) {
$track_exercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$track_attempt = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
public static function getStudentStatsByQuestion(
int $questionId,
int $exerciseId,
string $courseCode,
int $sessionId,
bool $onlyStudent = false
): array
{
$trackExercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$trackAttempt = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
$courseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$question_id = (int) $question_i d;
$exercise_id = (int) $exercise_i d;
$course_code = Database::escape_string($course_c ode);
$session_id = (int) $session_i d;
$courseId = api_get_course_int_id($course_c ode);
$questionId = (int) $questionI d;
$exerciseId = (int) $exerciseI d;
$courseCode = Database::escape_string($courseC ode);
$sessionId = (int) $sessionI d;
$courseId = api_get_course_int_id($courseC ode);
$sql = "SELECT MAX(marks) as max, MIN(marks) as min, AVG(marks) as average
FROM $track_e xercises e ";
$sessionCondition = api_get_session_condition($session_i d, true, false, 'e.session_id');
if (true == $onlyStudent) {
FROM $trackE xercises e ";
$sessionCondition = api_get_session_condition($sessionI d, true, false, 'e.session_id');
if ($onlyStudent) {
$courseCondition = '';
if (empty($session_i d)) {
if (empty($sessionI d)) {
$courseCondition = "
INNER JOIN $courseUser c
ON (
@ -3579,14 +3574,14 @@ EOT;
$sql .= $courseCondition;
}
$sql .= "
INNER JOIN $track_a ttempt a
INNER JOIN $trackA ttempt a
ON (
a.exe_id = e.exe_id
)
WHERE
exe_exo_id = $exercise_i d AND
a .c_id = $courseId AND
question_id = $question_i d AND
exe_exo_id = $exerciseI d AND
e .c_id = $courseId AND
question_id = $questionI d AND
e.status = ''
$sessionCondition
LIMIT 1";
@ -3739,35 +3734,28 @@ EOT;
/**
* Get number of answers to hotspot questions.
*
* @param int $answer_id
* @param int $question_id
* @param int $exercise_id
* @param string $courseId
* @param int $session_id
*
* @return int
*/
public static function get_number_students_answer_hotspot_count(
$answer_id,
$question_id,
$exercise_id,
$courseId,
$session_id
) {
$track_exercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$track_hotspot = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
public static function getNumberStudentsAnswerHotspotCount(
int $answerId,
int $questionId,
int $exerciseId,
string $courseCode,
int $sessionId
): int
{
$trackExercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$trackHotspot = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
$courseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$courseTable = Database::get_main_table(TABLE_MAIN_COURSE);
$courseUserSession = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$question_id = (int) $question_i d;
$answer_id = (int) $answer_i d;
$exercise_id = (int) $exercise_i d;
$courseId = (int) $courseId ;
$session_id = (int) $session_i d;
$questionId = (int) $questionI d;
$answerId = (int) $answerI d;
$exerciseId = (int) $exerciseI d;
$courseId = api_get_course_int_id($courseCode) ;
$sessionId = (int) $sessionI d;
if (empty($session_i d)) {
if (empty($sessionI d)) {
$courseCondition = "
INNER JOIN $courseUser cu
ON cu.c_id = c.id AND cu.user_id = exe_user_id";
@ -3779,25 +3767,24 @@ EOT;
$courseConditionWhere = ' AND cu.status = '.SessionEntity::STUDENT;
}
$sessionCondition = api_get_session_condition($session_i d, true, false, 'e.session_id');
$sessionCondition = api_get_session_condition($sessionI d, true, false, 'e.session_id');
$sql = "SELECT DISTINCT exe_user_id
FROM $track_e xercises e
INNER JOIN $track_h otspot a
FROM $trackE xercises e
INNER JOIN $trackH otspot a
ON (a.hotspot_exe_id = e.exe_id)
INNER JOIN $courseTable c
ON (a.c_id = c.id)
$courseCondition
WHERE
exe_exo_id = $exercise_i d AND
exe_exo_id = $exerciseI d AND
a.c_id = $courseId AND
hotspot_answer_id = $answer_i d AND
hotspot_question_id = $question_i d AND
hotspot_answer_id = $answerI d AND
hotspot_question_id = $questionI d AND
hotspot_correct = 1 AND
e.status = ''
$courseConditionWhere
$sessionCondition
";
$result = Database::query($sql);
$return = 0;
if ($result) {
@ -3873,7 +3860,7 @@ EOT;
a.exe_id = e.exe_id
)
INNER JOIN $courseTable c
ON c.id = a .c_id
ON c.id = e .c_id
$courseCondition
WHERE
exe_exo_id = $exercise_id AND
@ -3913,6 +3900,75 @@ EOT;
return $return;
}
/**
* Get the number of times an answer was selected.
*/
public static function getCountOfAnswers(
int $answerId,
int $questionId,
int $exerciseId,
string $courseCode,
int $sessionId,
$questionType = null,
): int
{
$trackExercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$trackAttempt = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
$courseTable = Database::get_main_table(TABLE_MAIN_COURSE);
$courseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$courseUserSession = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$answerId = (int) $answerId;
$questionId = (int) $questionId;
$exerciseId = (int) $exerciseId;
$courseId = api_get_course_int_id($courseCode);
$sessionId = (int) $sessionId;
$return = 0;
$answerCondition = match ($questionType) {
FILL_IN_BLANKS => '',
default => " answer = $answerId AND ",
};
if (empty($sessionId)) {
$courseCondition = "
INNER JOIN $courseUser cu
ON cu.c_id = c.id AND cu.user_id = exe_user_id";
$courseConditionWhere = " AND relation_type < > 2 AND cu.status = ".STUDENT;
} else {
$courseCondition = "
INNER JOIN $courseUserSession cu
ON (cu.c_id = a.c_id AND cu.user_id = e.exe_user_id AND e.session_id = cu.session_id)";
$courseConditionWhere = ' AND cu.status = '.SessionEntity::STUDENT;
}
$sessionCondition = api_get_session_condition($sessionId, true, false, 'e.session_id');
$sql = "SELECT count(a.answer) as total
FROM $trackExercises e
INNER JOIN $trackAttempt a
ON (
a.exe_id = e.exe_id
)
INNER JOIN $courseTable c
ON c.id = e.c_id
$courseCondition
WHERE
exe_exo_id = $exerciseId AND
e.c_id = $courseId AND
$answerCondition
question_id = $questionId AND
e.status = ''
$courseConditionWhere
$sessionCondition
";
$result = Database::query($sql);
if ($result) {
$count = Database::fetch_array($result);
$return = (int) $count['total'];
}
return $return;
}
/**
* @param array $answer
* @param string $user_answer
@ -5444,7 +5500,7 @@ EOT;
return $trackedExercise;
}
public static function getTotalQuestionAnswered($courseId, $exerciseId, $questionId)
public static function getTotalQuestionAnswered($courseId, $exerciseId, $questionId, $onlyStudents = false ): int
{
$courseId = (int) $courseId;
$exerciseId = (int) $exerciseId;
@ -5452,16 +5508,27 @@ EOT;
$attemptTable = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
$trackTable = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$courseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$courseUserJoin = "";
$studentsWhere = "";
if ($onlyStudents) {
$courseUserJoin = "
INNER JOIN $courseUser cu
ON cu.c_id = te.c_id AND cu.user_id = exe_user_id";
$studentsWhere = " AND relation_type < > 2 AND cu.status = ".STUDENT;
}
$sql = "SELECT count(te.exe_id) total
$sql = "SELECT count(distinct ( te.exe_id) ) total
FROM $attemptTable t
INNER JOIN $trackTable te
ON (t.exe_id = te.exe_id)
$courseUserJoin
WHERE
te.c_id = $courseId AND
exe_exo_id = $exerciseId AND
t.question_id = $questionId AND
status != 'incomplete'
te.status != 'incomplete'
$studentsWhere
";
$queryTotal = Database::query($sql);
$totalRow = Database::fetch_array($queryTotal, 'ASSOC');