ILIAS  trunk Revision v13.0_alpha-62-g3b72d83f2e5
ilTestEvaluationFactory Class Reference
+ Collaboration diagram for ilTestEvaluationFactory:

Public Member Functions

 __construct (protected ilDBInterface $db, protected ilObjTest $test_obj)
 
 getCorrectionsEvaluationData ()
 
 getEvaluationData ()
 
 getAllActivesPasses ()
 
 getFirstVisitForActiveIdAndAttempt (int $active_id, int $attempt)
 

Private Member Functions

 getAccessFilteredActiveIds ()
 
 retrieveEvaluationData (array $active_ids)
 
 buildBasicUserEvaluationDataFromDB (array $row)
 
 buildBasicAttemptEvaluationDataFromDB (array $row)
 
 addVisitingTimeToUserEvalData (ilTestEvaluationUserData $user_data, int $active_id)
 
 addPointsAndQuestionCountToAttempt (ilTestEvaluationPassData $attempt, array $row)
 
 addQuestionToAttempt (ilTestEvaluationPassData $attempt, array $row)
 
 addQuestionsToParticipantPasses (ilTestEvaluationData $evaluation_data)
 
 retrieveQuestionsForParticipantPassesForRandomTests (int $active_id, ilTestEvaluationUserData $user_eval_data, int $question_count)
 
 retrieveQuestionsForParticipantPassesForSequencedTests (int $active_id)
 
 addMarksToParticipants (ilTestEvaluationData $evaluation_data)
 

Detailed Description

Deprecated:
11; Result/EvaluationData will be refined.

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

Constructor & Destructor Documentation

◆ __construct()

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

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

31 {
32 }

Member Function Documentation

◆ addMarksToParticipants()

ilTestEvaluationFactory::addMarksToParticipants ( ilTestEvaluationData  $evaluation_data)
private

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

388 {
389 $mark_schema = $this->test_obj->getMarkSchema();
390
391 foreach ($evaluation_data->getParticipantIds() as $active_id) {
392 $user_eval_data = $evaluation_data->getParticipant($active_id);
393
394 $mark = $mark_schema->getMatchingMark(
395 $user_eval_data->getReachedPointsInPercent()
396 );
397
398 if ($mark === null) {
399 continue;
400 }
401
402 $user_eval_data->setMark($mark);
403 for ($i = 0; $i < $user_eval_data->getPassCount(); $i++) {
404 $pass_data = $user_eval_data->getPass($i);
405 if ($pass_data === null) {
406 continue;
407 }
408 $mark = $mark_schema->getMatchingMark(
409 $pass_data->getReachedPointsInPercent()
410 );
411 if ($mark !== null) {
412 $pass_data->setMark($mark);
413 }
414 }
415 }
416
417 return $evaluation_data;
418 }

References ilTestEvaluationData\getParticipant(), ilTestEvaluationData\getParticipantIds(), ilTestEvaluationUserData\getPass(), ilTestEvaluationUserData\getPassCount(), ilTestEvaluationUserData\getReachedPointsInPercent(), and ilTestEvaluationUserData\setMark().

Referenced by getEvaluationData().

+ 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 220 of file class.ilTestEvaluationFactory.php.

224 if ($row['questioncount'] !== 0) {
225 $attempt->setMaxPoints($row['maxpoints']);
226 $attempt->setQuestionCount($row['questioncount']);
227 return $attempt;
228 }
229
230 list($count, $points) = array_values(
231 $this->test_obj->getQuestionCountAndPointsForPassOfParticipant($row['active_id'], $row['pass'])
232 );
233 $attempt->setMaxPoints($points);
234 $attempt->setQuestionCount($count);
235 return $attempt;
236 }

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

Referenced by getEvaluationData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addQuestionsToParticipantPasses()

ilTestEvaluationFactory::addQuestionsToParticipantPasses ( ilTestEvaluationData  $evaluation_data)
private

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

258 {
259 foreach ($evaluation_data->getParticipantIds() as $active_id) {
260 $user_eval_data = $evaluation_data->getParticipant($active_id);
261 $add_user_questions = $this->test_obj->isRandomTest() ?
263 $active_id,
264 $user_eval_data,
265 $this->test_obj->getQuestionCountWithoutReloading()
266 ) :
268
269 foreach ($add_user_questions as $q) {
270 $user_eval_data->addQuestion(
271 $q['original_id'],
272 $q['question_id'],
273 $q['max_points'],
274 $q['sequence'],
275 $q['pass']
276 );
277 $evaluation_data->addQuestionTitle($q['question_id'], $q['title']);
278 }
279 }
280 return $evaluation_data;
281 }
addQuestionTitle(int $question_id, string $question_title)
retrieveQuestionsForParticipantPassesForRandomTests(int $active_id, ilTestEvaluationUserData $user_eval_data, int $question_count)
retrieveQuestionsForParticipantPassesForSequencedTests(int $active_id)

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

Referenced by getEvaluationData().

+ 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 238 of file class.ilTestEvaluationFactory.php.

242 if ($row['question_fi'] === null) {
243 return $attempt;
244 }
245
246 $attempt->addAnsweredQuestion(
247 $row["question_fi"],
248 $row["qpl_maxpoints"],
249 $row["result_points"],
250 (bool) $row['answered'],
251 null,
252 $row['manual']
253 );
254 return $attempt;
255 }
addAnsweredQuestion(int $question_id, float $max_points, float $reached_points, bool $is_answered, ?int $sequence=null, int $manual=0)

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

+ Here is the caller graph for this function:

◆ addVisitingTimeToUserEvalData()

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

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

214 $visiting_time = $this->test_obj->getVisitingTimeOfParticipant($active_id);
215 $user_data->setFirstVisit($visiting_time['first_access']);
216 $user_data->setLastVisit($visiting_time['last_access']);
217 return $user_data;
218 }
setFirstVisit(?\DateTimeImmutable $time)
setLastVisit(?\DateTimeImmutable $time)

Referenced by getEvaluationData().

+ Here is the caller graph for this function:

◆ buildBasicAttemptEvaluationDataFromDB()

ilTestEvaluationFactory::buildBasicAttemptEvaluationDataFromDB ( array  $row)
private

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

200 {
201 $attempt = new \ilTestEvaluationPassData();
202 $attempt->setPass($row['pass']);
203 $attempt->setReachedPoints($row['points']);
204 $attempt->setNrOfAnsweredQuestions($row['answeredquestions']);
205 $attempt->setWorkingTime($row['workingtime']);
206 $attempt->setExamId((string) $row['exam_id']);
207 return $attempt;
208 }

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

+ Here is the caller graph for this function:

◆ buildBasicUserEvaluationDataFromDB()

ilTestEvaluationFactory::buildBasicUserEvaluationDataFromDB ( array  $row)
private

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

181 {
182 $user_data = new ilTestEvaluationUserData($this->test_obj->getPassScoring());
183
184 $user_data->setName(
185 $this->test_obj->buildName($row['usr_id'], $row['firstname'], $row['lastname'])
186 );
187
188 if ($row['login'] !== null) {
189 $user_data->setLogin($row['login']);
190 }
191 if ($row['usr_id'] !== null) {
192 $user_data->setUserID($row['usr_id']);
193 }
194 $user_data->setSubmitted((bool) $row['submitted']);
195 $user_data->setLastFinishedPass($row['last_finished_pass']);
196 return $user_data;
197 }

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

+ Here is the caller graph for this function:

◆ getAccessFilteredActiveIds()

ilTestEvaluationFactory::getAccessFilteredActiveIds ( )
private
Returns
list<int>

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

37 : array
38 {
39 if (($participants_list = $this->test_obj->getAccessFilteredParticipantList()) !== null) {
40 return $participants_list->getAllActiveIds();
41 }
42 return array_keys($this->test_obj->getTestParticipants());
43 }

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

+ Here is the caller graph for this function:

◆ getAllActivesPasses()

ilTestEvaluationFactory::getAllActivesPasses ( )

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

420 : array
421 {
422 $query = '
423 SELECT active_fi, pass
424 FROM tst_active actives
425 INNER JOIN tst_pass_result passes
426 ON active_fi = active_id
427 WHERE test_fi = %s
428 ';
429
430 $res = $this->db->queryF($query, ['integer'], [$this->test_obj->getTestId()]);
431
432 $passes = [];
433 while ($row = $this->db->fetchAssoc($res)) {
434 if (!isset($passes[$row['active_fi']])) {
435 $passes[$row['active_fi']] = [];
436 }
437
438 $passes[$row['active_fi']][] = $row['pass'];
439 }
440
441 return $passes;
442 }
foreach($_POST as $key=> $value) $res

References $res.

◆ getCorrectionsEvaluationData()

ilTestEvaluationFactory::getCorrectionsEvaluationData ( )

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

98 {
99 $participants = [];
100 $current_user = null;
101 $current_attempt = null;
102
103 foreach ($this->retrieveEvaluationData($this->getAccessFilteredActiveIds()) as $row) {
104 if ($row['pass'] === null) {
105 continue;
106 }
107
108 $active_id = $row['active_id'];
109 $pass = $row['pass'];
110
111 if ($current_user !== $active_id) {
112 $current_user = $active_id;
113 $current_attempt = null;
114 $user_eval_data = $this->buildBasicUserEvaluationDataFromDB($row);
115 }
116
117 if ($current_attempt !== $pass) {
118 $current_attempt = $pass;
119 $attempt = $this->buildBasicAttemptEvaluationDataFromDB($row);
120 }
121
122 if (!isset($attempt)) {
123 continue;
124 }
125
126 $attempt = $this->addQuestionToAttempt($attempt, $row);
127 $user_eval_data->addPass($pass, $attempt);
128 $participants[$active_id] = $user_eval_data;
129 }
130 return new ilTestEvaluationData($participants);
131 }
addQuestionToAttempt(ilTestEvaluationPassData $attempt, array $row)

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

+ Here is the call graph for this function:

◆ getEvaluationData()

ilTestEvaluationFactory::getEvaluationData ( )

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

134 {
135 $eval_data_rows = $this->retrieveEvaluationData($this->getAccessFilteredActiveIds());
136 $participants = [];
137 $current_user = null;
138 $current_attempt = null;
139
140 foreach ($eval_data_rows as $row) {
141 if ($row['pass'] === null) {
142 continue;
143 }
144
145 if ($current_user !== $row['active_id']) {
146 $current_user = $row['active_id'];
147 $current_attempt = null;
148 $user_eval_data = $this->addVisitingTimeToUserEvalData(
150 $row['active_id']
151 );
152 }
153
154 if ($row['pass'] !== null && $current_attempt !== $row['pass']) {
155 $current_attempt = $row['pass'];
156 $attempt = $this->addPointsAndQuestionCountToAttempt(
158 $row
159 );
160
161 $start_time = $this->getFirstVisitForActiveIdAndAttempt($row['active_id'], $current_attempt);
162 if ($start_time !== null) {
163 $attempt->setStartTime($start_time);
164 }
165 $attempt->setStatusOfAttempt(
166 StatusOfAttempt::build($current_attempt, $row['last_finished_pass'], $row['finalized_by'])
167 );
168 }
169
170 $user_eval_data->addPass($row['pass'], $this->addQuestionToAttempt($attempt, $row));
171 $participants[$row['active_id']] = $user_eval_data;
172 }
173
174 $evaluation_data = $this->addQuestionsToParticipantPasses(
175 new ilTestEvaluationData($participants)
176 );
177 return $this->addMarksToParticipants($evaluation_data);
178 }
addQuestionsToParticipantPasses(ilTestEvaluationData $evaluation_data)
addMarksToParticipants(ilTestEvaluationData $evaluation_data)
getFirstVisitForActiveIdAndAttempt(int $active_id, int $attempt)
addVisitingTimeToUserEvalData(ilTestEvaluationUserData $user_data, int $active_id)
addPointsAndQuestionCountToAttempt(ilTestEvaluationPassData $attempt, array $row)

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

+ Here is the call graph for this function:

◆ getFirstVisitForActiveIdAndAttempt()

ilTestEvaluationFactory::getFirstVisitForActiveIdAndAttempt ( int  $active_id,
int  $attempt 
)

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

444 : ?string
445 {
446 $times = $this->db->fetchAssoc(
447 $this->db->queryF(
448 'SELECT MIN(started) AS first_access '
449 . 'FROM tst_times WHERE active_fi = %s AND pass = %s',
450 ['integer', 'integer'],
451 [$active_id, $attempt]
452 )
453 );
454
455 return $times['first_access'];
456 }

Referenced by getEvaluationData().

+ Here is the caller graph for this function:

◆ retrieveEvaluationData()

ilTestEvaluationFactory::retrieveEvaluationData ( array  $active_ids)
private
Parameters
list<int>$active_ids

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

48 : \Generator
49 {
50 $query = '
51 SELECT tst_test_result.question_fi,
52 tst_test_result.points result_points,
53 tst_test_result.answered,
54 tst_test_result.manual,
55
56 qpl_questions.original_id,
57 qpl_questions.title questiontitle,
58 qpl_questions.points qpl_maxpoints,
59
60 tst_active.active_id,
61 tst_active.submitted,
62 tst_active.last_finished_pass,
63 tst_pass_result.*,
64
65 usr_data.usr_id,
66 usr_data.firstname,
67 usr_data.lastname,
68 usr_data.title,
69 usr_data.login
70
71 FROM tst_active
72
73 LEFT JOIN tst_pass_result ON tst_active.active_id = tst_pass_result.active_fi
74 LEFT JOIN tst_test_result ON tst_active.active_id = tst_test_result.active_fi AND tst_test_result.pass = tst_pass_result.pass
75 LEFT JOIN qpl_questions ON qpl_questions.question_id = tst_test_result.question_fi
76 LEFT JOIN usr_data ON tst_active.user_fi = usr_data.usr_id
77
78 WHERE tst_active.test_fi = %s
79 AND %s
80
81 ORDER BY tst_active.active_id ASC, tst_pass_result.pass ASC, tst_test_result.tstamp DESC
82 ';
83
84 $ret = [];
85 $result = $this->db->query(
86 sprintf(
87 $query,
88 $this->db->quote($this->test_obj->getTestId(), 'integer'),
89 $this->db->in('tst_active.active_id', $active_ids, false, 'integer'),
90 )
91 );
92 while ($row = $this->db->fetchAssoc($result)) {
93 yield $row;
94 }
95 }

Referenced by getCorrectionsEvaluationData(), and getEvaluationData().

+ Here is the caller graph for this function:

◆ retrieveQuestionsForParticipantPassesForRandomTests()

ilTestEvaluationFactory::retrieveQuestionsForParticipantPassesForRandomTests ( int  $active_id,
ilTestEvaluationUserData  $user_eval_data,
int  $question_count 
)
private

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

287 : array {
288 $ret = [];
289 for ($testpass = 0; $testpass <= $user_eval_data->getLastPass(); $testpass++) {
290 $this->db->setLimit($question_count, 0);
291 $query = '
292 SELECT tst_test_rnd_qst.sequence, tst_test_rnd_qst.question_fi, qpl_questions.original_id,
293 tst_test_rnd_qst.pass, qpl_questions.points, qpl_questions.title
294 FROM tst_test_rnd_qst, qpl_questions
295 WHERE tst_test_rnd_qst.question_fi = qpl_questions.question_id
296 AND tst_test_rnd_qst.pass = %s
297 AND tst_test_rnd_qst.active_fi = %s ORDER BY tst_test_rnd_qst.sequence
298 ';
299
300 $result = $this->db->queryF(
301 $query,
302 ['integer','integer'],
303 [$testpass, $active_id]
304 );
305
306 if ($result->numRows()) {
307 while ($row = $this->db->fetchAssoc($result)) {
308 $tpass = array_key_exists('pass', $row) ? $row['pass'] : 0;
309
310 if (
311 !isset($row['question_fi'], $row['points'], $row['sequence']) ||
312 !is_numeric($row['question_fi']) || !is_numeric($row['points']) || !is_numeric($row['sequence'])
313 ) {
314 continue;
315 }
316
317 $ret[] = [
318 'original_id' => (int) $row['original_id'],
319 'question_id' => (int) $row['question_fi'],
320 'max_points' => (float) $row['points'],
321 'sequence' => (int) $row['sequence'],
322 'pass' => $tpass,
323 'title' => $row['title']
324 ];
325 }
326 }
327 }
328 return $ret;
329 }

References ILIAS\Repository\int().

+ Here is the call graph for this function:

◆ retrieveQuestionsForParticipantPassesForSequencedTests()

ilTestEvaluationFactory::retrieveQuestionsForParticipantPassesForSequencedTests ( int  $active_id)
private

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

333 : array {
334 $ret = [];
335
336 $query = '
337 SELECT tst_test_question.sequence, tst_test_question.question_fi,
338 qpl_questions.points, qpl_questions.title, qpl_questions.original_id
339 FROM tst_test_question, tst_active, qpl_questions
340 WHERE tst_test_question.question_fi = qpl_questions.question_id
341 AND tst_active.active_id = %s
342 AND tst_active.test_fi = tst_test_question.test_fi
343 ORDER BY tst_test_question.sequence
344 ';
345
346 $result = $this->db->queryF(
347 $query,
348 ['integer'],
349 [$active_id]
350 );
351
352 if ($result->numRows()) {
353 $questionsbysequence = [];
354 while ($row = $this->db->fetchAssoc($result)) {
355 $questionsbysequence[$row['sequence']] = $row;
356 }
357
358 $seqresult = $this->db->queryF(
359 'SELECT * FROM tst_sequence WHERE active_fi = %s',
360 ['integer'],
361 [$active_id]
362 );
363
364 while ($seqrow = $this->db->fetchAssoc($seqresult)) {
365 $questionsequence = unserialize($seqrow["sequence"], ['allowed_classes' => false]);
366 if (!is_array($questionsequence)) {
367 continue;
368 }
369 foreach ($questionsequence as $sidx => $seq) {
370 if (!isset($questionsbysequence[$seq])) {
371 continue;
372 }
373 $ret[] = [
374 'original_id' => $questionsbysequence[$seq]['original_id'] ?? 0,
375 'question_id' => $questionsbysequence[$seq]['question_fi'],
376 'max_points' => $questionsbysequence[$seq]['points'],
377 'sequence' => $sidx + 1,
378 'pass' => $seqrow['pass'],
379 'title' => $questionsbysequence[$seq]["title"]
380 ];
381 }
382 }
383 }
384 return $ret;
385 }

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