ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
ilTestEvaluationFactory Class Reference
+ Collaboration diagram for ilTestEvaluationFactory:

Public Member Functions

 __construct (protected ilDBInterface $db, protected ilObjTest $test_obj)
 
 getCorrectionsEvaluationData ()
 
 getEvaluationData ()
 

Protected Member Functions

 getPassScoringSettings ()
 
 isRandomTest ()
 
 getTestQuestionCount ()
 
 getTesttMarkSchema ()
 
 getVisitTimeOfParticipant (int $active_id)
 
 getQuestionCountAndPointsForPassOfParticipant (int $active_id, int $pass)
 
 getAccessFilteredActiveIds ()
 
 queryEvaluationData (array $active_ids)
 
 addQuestionsToParticipantPasses (ilTestEvaluationData $evaluation_data)
 
 getQuestionsForParticipantPassesForRandomTests (int $active_id, ilTestEvaluationUserData $user_eval_data, int $question_count)
 
 getQuestionsForParticipantPassesForSequencedTests (int $active_id)
 
 addMarksToParticipants (ilTestEvaluationData $evaluation_data)
 

Private Member Functions

 buildBasicUserEvaluationDataFromDB (array $row)
 
 buildBasicAttemptEvaluationDataFromDB (array $row)
 
 addVisitingTimeToUserEvalData (ilTestEvaluationUserData $user_data, int $active_id)
 
 addPointsAndQuestionCountToAttempt (ilTestEvaluationPassData $attempt, array $row)
 
 addQuestionToAttempt (ilTestEvaluationPassData $attempt, array $row)
 

Detailed Description

Definition at line 21 of file class.ilTestEvaluationFactory.php.

Constructor & Destructor Documentation

◆ __construct()

ilTestEvaluationFactory::__construct ( protected ilDBInterface  $db,
protected ilObjTest  $test_obj 
)

Definition at line 23 of file class.ilTestEvaluationFactory.php.

26  {
27  }

Member Function Documentation

◆ addMarksToParticipants()

ilTestEvaluationFactory::addMarksToParticipants ( ilTestEvaluationData  $evaluation_data)
protected

Definition at line 408 of file class.ilTestEvaluationFactory.php.

References ilTestEvaluationData\getParticipant(), ilTestEvaluationData\getParticipantIds(), and getTesttMarkSchema().

Referenced by getEvaluationData().

409  {
410  $mark_schema = $this->getTesttMarkSchema();
411 
412  foreach ($evaluation_data->getParticipantIds() as $active_id) {
413  $user_eval_data = $evaluation_data->getParticipant($active_id);
414 
415  $percentage = $user_eval_data->getReachedPointsInPercent();
416  $mark = $mark_schema->getMatchingMark($percentage);
417 
418  if (is_object($mark)) {
419  $user_eval_data->setMark($mark->getShortName());
420  $user_eval_data->setMarkOfficial($mark->getOfficialName());
421 
422  $user_eval_data->setPassed(
423  $mark->getPassed() && $user_eval_data->areObligationsAnswered()
424  );
425  }
426  }
427 
428  return $evaluation_data;
429  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addPointsAndQuestionCountToAttempt()

ilTestEvaluationFactory::addPointsAndQuestionCountToAttempt ( ilTestEvaluationPassData  $attempt,
array  $row 
)
private

Definition at line 235 of file class.ilTestEvaluationFactory.php.

References getQuestionCountAndPointsForPassOfParticipant(), ilTestEvaluationPassData\setMaxPoints(), and ilTestEvaluationPassData\setQuestionCount().

Referenced by getEvaluationData().

239  if ($row['questioncount'] !== 0) {
240  $attempt->setMaxPoints($row['maxpoints']);
241  $attempt->setQuestionCount($row['questioncount']);
242  return $attempt;
243  }
244 
245  list($count, $points) = array_values(
246  $this->getQuestionCountAndPointsForPassOfParticipant($row['active_id'], $row['pass'])
247  );
248  $attempt->setMaxPoints($points);
249  $attempt->setQuestionCount($count);
250  return $attempt;
251  }
getQuestionCountAndPointsForPassOfParticipant(int $active_id, int $pass)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addQuestionsToParticipantPasses()

ilTestEvaluationFactory::addQuestionsToParticipantPasses ( ilTestEvaluationData  $evaluation_data)
protected

Definition at line 272 of file class.ilTestEvaluationFactory.php.

References $q, ilTestEvaluationData\addQuestionTitle(), ilTestEvaluationData\getParticipant(), ilTestEvaluationData\getParticipantIds(), getQuestionsForParticipantPassesForRandomTests(), getQuestionsForParticipantPassesForSequencedTests(), getTestQuestionCount(), and isRandomTest().

Referenced by getEvaluationData().

273  {
274  $is_random_test = $this->isRandomTest();
275 
276  foreach ($evaluation_data->getParticipantIds() as $active_id) {
277  $user_eval_data = $evaluation_data->getParticipant($active_id);
278 
279  $add_user_questions = $this->isRandomTest() ?
280  $this->getQuestionsForParticipantPassesForRandomTests($active_id, $user_eval_data, $this->getTestQuestionCount()) :
282 
283  foreach ($add_user_questions as $q) {
284 
285  $original_id = $q['original_id'];
286  $question_id = $q['question_id'];
287  $max_points = $q['max_points'];
288  $sequence = $q['sequence'];
289  $pass = $q['pass'];
290  $title = $q['title'];
291 
292  $user_eval_data->addQuestion(
293  $original_id,
294  $question_id,
295  $max_points,
296  $sequence,
297  $pass
298  );
299 
300  $evaluation_data->addQuestionTitle($question_id, $title);
301  }
302  }
303 
304  return $evaluation_data;
305  }
getQuestionsForParticipantPassesForSequencedTests(int $active_id)
getQuestionsForParticipantPassesForRandomTests(int $active_id, ilTestEvaluationUserData $user_eval_data, int $question_count)
$q
Definition: shib_logout.php:21
addQuestionTitle(int $question_id, string $question_title)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addQuestionToAttempt()

ilTestEvaluationFactory::addQuestionToAttempt ( ilTestEvaluationPassData  $attempt,
array  $row 
)
private

Definition at line 253 of file class.ilTestEvaluationFactory.php.

References ilTestEvaluationPassData\addAnsweredQuestion().

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

257  if ($row['question_fi'] === null) {
258  return $attempt;
259  }
260 
261  $attempt->addAnsweredQuestion(
262  $row["question_fi"],
263  $row["qpl_maxpoints"],
264  $row["result_points"],
265  (bool) $row['answered'],
266  null,
267  $row['manual']
268  );
269  return $attempt;
270  }
addAnsweredQuestion(int $question_id, float $max_points, float $reached_points, bool $isAnswered, ?int $sequence=null, int $manual=0)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addVisitingTimeToUserEvalData()

ilTestEvaluationFactory::addVisitingTimeToUserEvalData ( ilTestEvaluationUserData  $user_data,
int  $active_id 
)
private

Definition at line 225 of file class.ilTestEvaluationFactory.php.

References getVisitTimeOfParticipant(), ilTestEvaluationUserData\setFirstVisit(), and ilTestEvaluationUserData\setLastVisit().

Referenced by getEvaluationData().

229  $visitingTime = $this->getVisitTimeOfParticipant($active_id);
230  $user_data->setFirstVisit($visitingTime['firstvisit']);
231  $user_data->setLastVisit($visitingTime['lastvisit']);
232  return $user_data;
233  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ buildBasicAttemptEvaluationDataFromDB()

ilTestEvaluationFactory::buildBasicAttemptEvaluationDataFromDB ( array  $row)
private

Definition at line 211 of file class.ilTestEvaluationFactory.php.

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

212  {
213  $attempt = new \ilTestEvaluationPassData();
214  $attempt->setPass($row['pass']);
215  $attempt->setReachedPoints($row['points']);
216  $attempt->setObligationsAnswered((bool) $row['obligations_answered']);
217  $attempt->setNrOfAnsweredQuestions($row['answeredquestions']);
218  $attempt->setWorkingTime($row['workingtime']);
219  $attempt->setExamId((string) $row['exam_id']);
220  $attempt->setRequestedHintsCount($row['hint_count']);
221  $attempt->setDeductedHintPoints($row['hint_points']);
222  return $attempt;
223  }
+ Here is the caller graph for this function:

◆ buildBasicUserEvaluationDataFromDB()

ilTestEvaluationFactory::buildBasicUserEvaluationDataFromDB ( array  $row)
private

Definition at line 192 of file class.ilTestEvaluationFactory.php.

References getPassScoringSettings().

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

193  {
194  $user_data = new ilTestEvaluationUserData($this->getPassScoringSettings());
195 
196  $user_data->setName(
197  $this->test_obj->buildName($row['usr_id'], $row['firstname'], $row['lastname'])
198  );
199 
200  if ($row['login'] !== null) {
201  $user_data->setLogin($row['login']);
202  }
203  if ($row['usr_id'] !== null) {
204  $user_data->setUserID($row['usr_id']);
205  }
206  $user_data->setSubmitted((bool) $row['submitted']);
207  $user_data->setLastFinishedPass($row['last_finished_pass']);
208  return $user_data;
209  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getAccessFilteredActiveIds()

ilTestEvaluationFactory::getAccessFilteredActiveIds ( )
protected
Returns
int[]

Definition at line 64 of file class.ilTestEvaluationFactory.php.

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

64  : array
65  {
66  if (($participants_list = $this->test_obj->getAccessFilteredParticipantList()) !== null) {
67  return $participants_list->getAllActiveIds();
68  }
69  $participants = $this->test_obj->getTestParticipants();
70  return array_keys($participants);
71  }
+ Here is the caller graph for this function:

◆ getCorrectionsEvaluationData()

ilTestEvaluationFactory::getCorrectionsEvaluationData ( )

Definition at line 126 of file class.ilTestEvaluationFactory.php.

References addQuestionToAttempt(), buildBasicAttemptEvaluationDataFromDB(), buildBasicUserEvaluationDataFromDB(), getAccessFilteredActiveIds(), and queryEvaluationData().

127  {
128  $eval_data_rows = $this->queryEvaluationData($this->getAccessFilteredActiveIds());
129  $participants = [];
130  $current_user = null;
131  $current_attempt = null;
132 
133  foreach ($eval_data_rows as $row) {
134  if ($current_user !== $row['active_id']) {
135  $current_user = $row['active_id'];
136  $current_attempt = null;
137  $user_eval_data = $this->buildBasicUserEvaluationDataFromDB($row);
138  }
139 
140  if ($current_attempt !== $row['pass']) {
141  $current_attempt = $row['pass'];
142  $attempt = $this->buildBasicAttemptEvaluationDataFromDB($row);
143  }
144 
145  $attempt = $this->addQuestionToAttempt($attempt, $row);
146  $user_eval_data->addPass($row['pass'], $attempt);
147  $participants[$row['active_id']] = $user_eval_data;
148  }
149  return new ilTestEvaluationData($participants);
150  }
addQuestionToAttempt(ilTestEvaluationPassData $attempt, array $row)
+ Here is the call graph for this function:

◆ getEvaluationData()

ilTestEvaluationFactory::getEvaluationData ( )

Definition at line 152 of file class.ilTestEvaluationFactory.php.

References addMarksToParticipants(), addPointsAndQuestionCountToAttempt(), addQuestionsToParticipantPasses(), addQuestionToAttempt(), addVisitingTimeToUserEvalData(), buildBasicAttemptEvaluationDataFromDB(), buildBasicUserEvaluationDataFromDB(), getAccessFilteredActiveIds(), and queryEvaluationData().

153  {
154  $eval_data_rows = $this->queryEvaluationData($this->getAccessFilteredActiveIds());
155  $participants = [];
156  $current_user = null;
157  $current_attempt = null;
158 
159  foreach ($eval_data_rows as $row) {
160  if($row['pass'] === null) {
161  continue;
162  }
163 
164  if ($current_user !== $row['active_id']) {
165  $current_user = $row['active_id'];
166  $current_attempt = null;
167  $user_eval_data = $this->addVisitingTimeToUserEvalData(
169  $row['active_id']
170  );
171  }
172 
173  if ($current_attempt !== $row['pass']) {
174  $current_attempt = $row['pass'];
175  $attempt = $this->addPointsAndQuestionCountToAttempt(
177  $row
178  );
179  }
180 
181  $attempt = $this->addQuestionToAttempt($attempt, $row);
182  $user_eval_data->addPass($row['pass'], $attempt);
183  $participants[$row['active_id']] = $user_eval_data;
184  }
185 
186  $evaluation_data = $this->addQuestionsToParticipantPasses(
187  new ilTestEvaluationData($participants)
188  );
189  return $this->addMarksToParticipants($evaluation_data);
190  }
addPointsAndQuestionCountToAttempt(ilTestEvaluationPassData $attempt, array $row)
addQuestionsToParticipantPasses(ilTestEvaluationData $evaluation_data)
addVisitingTimeToUserEvalData(ilTestEvaluationUserData $user_data, int $active_id)
addMarksToParticipants(ilTestEvaluationData $evaluation_data)
addQuestionToAttempt(ilTestEvaluationPassData $attempt, array $row)
+ Here is the call graph for this function:

◆ getPassScoringSettings()

ilTestEvaluationFactory::getPassScoringSettings ( )
protected

Definition at line 29 of file class.ilTestEvaluationFactory.php.

Referenced by buildBasicUserEvaluationDataFromDB().

29  : int
30  {
31  return $this->test_obj->getPassScoring();
32  }
+ Here is the caller graph for this function:

◆ getQuestionCountAndPointsForPassOfParticipant()

ilTestEvaluationFactory::getQuestionCountAndPointsForPassOfParticipant ( int  $active_id,
int  $pass 
)
protected

Definition at line 54 of file class.ilTestEvaluationFactory.php.

References ilObjTest\_getQuestionCountAndPointsForPassOfParticipant().

Referenced by addPointsAndQuestionCountToAttempt().

57  : array {
59  }
static _getQuestionCountAndPointsForPassOfParticipant($active_id, $pass)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getQuestionsForParticipantPassesForRandomTests()

ilTestEvaluationFactory::getQuestionsForParticipantPassesForRandomTests ( int  $active_id,
ilTestEvaluationUserData  $user_eval_data,
int  $question_count 
)
protected

Definition at line 307 of file class.ilTestEvaluationFactory.php.

References ilTestEvaluationUserData\getLastPass(), and ILIAS\Repository\int().

Referenced by addQuestionsToParticipantPasses().

311  : array {
312  $ret = [];
313  for ($testpass = 0; $testpass <= $user_eval_data->getLastPass(); $testpass++) {
314  $this->db->setLimit($question_count, 0);
315  $query = "
316  SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, qpl_questions.original_id,
317  tst_test_rnd_qst.pass, qpl_questions.points, qpl_questions.title
318  FROM tst_test_rnd_qst, qpl_questions
319  WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id
320  AND tst_test_rnd_qst.pass = %s
321  AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence
322  ";
323 
324  $result = $this->db->queryF(
325  $query,
326  ['integer','integer'],
327  [$testpass, $active_id]
328  );
329 
330  if ($result->numRows()) {
331  while ($row = $this->db->fetchAssoc($result)) {
332  $tpass = array_key_exists("pass", $row) ? $row["pass"] : 0;
333 
334  if (
335  !isset($row["question_fi"], $row["points"], $row["sequence"]) ||
336  !is_numeric($row["question_fi"]) || !is_numeric($row["points"]) || !is_numeric($row["sequence"])
337  ) {
338  continue;
339  }
340 
341  $ret[] = [
342  'original_id' => (int) $row["original_id"],
343  'question_id' => (int) $row["question_fi"],
344  'max_points' => (float) $row["points"],
345  'sequence' => (int) $row["sequence"],
346  'pass' => $tpass,
347  'title' => $row["title"]
348  ];
349  }
350  }
351  }
352  return $ret;
353  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getQuestionsForParticipantPassesForSequencedTests()

ilTestEvaluationFactory::getQuestionsForParticipantPassesForSequencedTests ( int  $active_id)
protected

Definition at line 355 of file class.ilTestEvaluationFactory.php.

Referenced by addQuestionsToParticipantPasses().

357  : array {
358  $ret = [];
359 
360  $query = "
361  SELECT tst_test_question.sequence, tst_test_question.question_fi,
362  qpl_questions.points, qpl_questions.title, qpl_questions.original_id
363  FROM tst_test_question, tst_active, qpl_questions
364  WHERE tst_test_question.question_fi = qpl_questions.question_id
365  AND tst_active.active_id = %s
366  AND tst_active.test_fi = tst_test_question.test_fi
367  ORDER BY tst_test_question.sequence
368  ";
369 
370  $result = $this->db->queryF(
371  $query,
372  ['integer'],
373  [$active_id]
374  );
375 
376  if ($result->numRows()) {
377  $questionsbysequence = [];
378  while ($row = $this->db->fetchAssoc($result)) {
379  $questionsbysequence[$row['sequence']] = $row;
380  }
381 
382  $seqresult = $this->db->queryF(
383  "SELECT * FROM tst_sequence WHERE active_fi = %s",
384  ['integer'],
385  [$active_id]
386  );
387 
388  while ($seqrow = $this->db->fetchAssoc($seqresult)) {
389  $questionsequence = unserialize($seqrow['sequence']);
390  foreach ($questionsequence as $sidx => $seq) {
391  if (!isset($questionsbysequence[$seq])) {
392  continue;
393  }
394  $ret[] = [
395  'original_id' => $questionsbysequence[$seq]['original_id'] ?? 0,
396  'question_id' => $questionsbysequence[$seq]['question_fi'],
397  'max_points' => $questionsbysequence[$seq]['points'],
398  'sequence' => $sidx + 1,
399  'pass' => $seqrow['pass'],
400  'title' => $questionsbysequence[$seq]["title"]
401  ];
402  }
403  }
404  }
405  return $ret;
406  }
+ Here is the caller graph for this function:

◆ getTestQuestionCount()

ilTestEvaluationFactory::getTestQuestionCount ( )
protected

Definition at line 39 of file class.ilTestEvaluationFactory.php.

Referenced by addQuestionsToParticipantPasses().

39  : int
40  {
41  return $this->test_obj->getQuestionCountWithoutReloading();
42  }
+ Here is the caller graph for this function:

◆ getTesttMarkSchema()

ilTestEvaluationFactory::getTesttMarkSchema ( )
protected

Definition at line 44 of file class.ilTestEvaluationFactory.php.

Referenced by addMarksToParticipants().

45  {
46  return $this->test_obj->getMarkSchema();
47  }
A class defining mark schemas for assessment test objects.
+ Here is the caller graph for this function:

◆ getVisitTimeOfParticipant()

ilTestEvaluationFactory::getVisitTimeOfParticipant ( int  $active_id)
protected

Definition at line 49 of file class.ilTestEvaluationFactory.php.

Referenced by addVisitingTimeToUserEvalData().

49  : array
50  {
51  return $this->test_obj->getVisitTimeOfParticipant($active_id);
52  }
+ Here is the caller graph for this function:

◆ isRandomTest()

ilTestEvaluationFactory::isRandomTest ( )
protected

Definition at line 34 of file class.ilTestEvaluationFactory.php.

Referenced by addQuestionsToParticipantPasses().

34  : bool
35  {
36  return $this->test_obj->isRandomTest();
37  }
+ Here is the caller graph for this function:

◆ queryEvaluationData()

ilTestEvaluationFactory::queryEvaluationData ( array  $active_ids)
protected
Parameters
int[]$active_ids

Definition at line 76 of file class.ilTestEvaluationFactory.php.

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

76  : array
77  {
78  $query = '
79  SELECT tst_test_result.question_fi,
80  tst_test_result.points result_points,
81  tst_test_result.answered,
82  tst_test_result.manual,
83 
84  qpl_questions.original_id,
85  qpl_questions.title questiontitle,
86  qpl_questions.points qpl_maxpoints,
87 
88  tst_active.active_id,
89  tst_active.submitted,
90  tst_active.last_finished_pass,
91  tst_pass_result.*,
92 
93  usr_data.usr_id,
94  usr_data.firstname,
95  usr_data.lastname,
96  usr_data.title,
97  usr_data.login
98 
99  FROM tst_active
100 
101  LEFT JOIN tst_pass_result ON tst_active.active_id = tst_pass_result.active_fi
102  LEFT JOIN tst_test_result ON tst_active.active_id = tst_test_result.active_fi AND tst_test_result.pass = tst_pass_result.pass
103  LEFT JOIN qpl_questions ON qpl_questions.question_id = tst_test_result.question_fi
104  LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id
105 
106  WHERE tst_active.test_fi = %s
107  AND %s
108 
109  ORDER BY tst_active.active_id ASC, tst_pass_result.pass ASC, tst_test_result.tstamp DESC
110  ';
111 
112  $result = $this->db->query(
113  sprintf(
114  $query,
115  $this->db->quote($this->test_obj->getTestId(), 'integer'),
116  $this->db->in('tst_active.active_id', $active_ids, false, 'integer'),
117  )
118  );
119  $ret = [];
120  while ($row = $this->db->fetchAssoc($result)) {
121  $ret[] = $row;
122  }
123  return $ret;
124  }
+ Here is the caller graph for this function:

The documentation for this class was generated from the following file: