ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilAssQuestionUserSolutionAdopter.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4
12{
17
22
27
31 protected static $preparedDeleteResultRecordStatement = null;
32
36 protected static $preparedSelectResultRecordStatement = null;
37
41 protected static $preparedInsertResultRecordStatement = null;
42
46 protected $db;
47
52
56 protected $userId;
57
61 protected $activeId;
62
66 protected $targetPass;
67
71 protected $questionIds;
72
78 public function __construct(ilDBInterface $db, ilSetting $assSettings, $isAssessmentLogEnabled)
79 {
80 $this->db = $db;
81
82 $this->userId = null;
83 $this->activeId = null;
84 $this->targetPass = null;
85 $this->questionIds = array();
86
87 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
88 $this->processLockerFactory = new ilAssQuestionProcessLockerFactory($assSettings, $db);
89 $this->processLockerFactory->setAssessmentLogEnabled($isAssessmentLogEnabled);
90 }
91
95 public function getUserId()
96 {
97 return $this->userId;
98 }
99
103 public function setUserId($userId)
104 {
105 $this->userId = $userId;
106 }
107
111 public function getActiveId()
112 {
113 return $this->activeId;
114 }
115
119 public function setActiveId($activeId)
120 {
121 $this->activeId = $activeId;
122 }
123
127 public function getTargetPass()
128 {
129 return $this->targetPass;
130 }
131
135 public function setTargetPass($targetPass)
136 {
137 $this->targetPass = $targetPass;
138 }
139
143 public function getQuestionIds()
144 {
145 return $this->questionIds;
146 }
147
152 {
153 $this->questionIds = $questionIds;
154 }
155
156 public function perform()
157 {
158 $this->processLockerFactory->setUserId($this->getUserId());
159
160 foreach($this->getQuestionIds() as $questionId)
161 {
162 $this->processLockerFactory->setQuestionId($questionId);
163 $processLocker = $this->processLockerFactory->getLocker();
164
165 $processLocker->executeUserTestResultUpdateLockOperation(function() use ($questionId) {
166
167 $this->adoptQuestionAnswer($questionId);
168
169 });
170 }
171 }
172
173 protected function adoptQuestionAnswer($questionId)
174 {
175 $this->resetTargetSolution($questionId);
176 $this->resetTargetResult($questionId);
177
178 $sourcePass = $this->adoptSourceSolution($questionId);
179
180 if( $sourcePass !== null )
181 {
182 $this->adoptSourceResult($questionId, $sourcePass);
183 }
184 }
185
186 protected function resetTargetSolution($questionId)
187 {
188 $this->db->execute(
190 array($this->getActiveId(), $questionId, $this->getTargetPass())
191 );
192 }
193
194 protected function resetTargetResult($questionId)
195 {
196 $this->db->execute(
198 array($this->getActiveId(), $questionId, $this->getTargetPass())
199 );
200 }
201
202 protected function adoptSourceSolution($questionId)
203 {
204 $res = $this->db->execute(
206 array($this->getActiveId(), $questionId, $this->getTargetPass())
207 );
208
209 $sourcePass = null;
210
211 while($row = $this->db->fetchAssoc($res))
212 {
213 if($sourcePass === null)
214 {
215 $sourcePass = $row['pass'];
216 }
217 elseif($row['pass'] < $sourcePass)
218 {
219 break;
220 }
221
222 $solutionId = $this->db->nextId('tst_solutions');
223
224 $this->db->execute($this->getPreparedInsertSolutionRecordStatement(), array(
225 $solutionId, $this->getActiveId(), $questionId, $this->getTargetPass(), time(),
226 $row['points'], $row['value1'], $row['value2']
227 ));
228 }
229
230 return $sourcePass;
231 }
232
233 protected function adoptSourceResult($questionId, $sourcePass)
234 {
235 $res = $this->db->execute(
237 array($this->getActiveId(), $questionId, $sourcePass)
238 );
239
240 $row = $this->db->fetchAssoc($res);
241
242 $resultId = $this->db->nextId('tst_test_result');
243
244 $this->db->execute($this->getPreparedInsertResultRecordStatement(), array(
245 $resultId, $this->getActiveId(), $questionId, $this->getTargetPass(), time(),
246 $row['points'], $row['manual'], $row['hint_count'], $row['hint_points'], $row['answered']
247 ));
248 }
249
251 {
252 if( self::$preparedDeleteSolutionRecordsStatement === null )
253 {
254 self::$preparedDeleteSolutionRecordsStatement = $this->db->prepareManip(
255 "DELETE FROM tst_solutions WHERE active_fi = ? AND question_fi = ? AND pass = ?",
256 array('integer', 'integer', 'integer')
257 );
258 }
259
261 }
262
264 {
265 if( self::$preparedSelectSolutionRecordsStatement === null )
266 {
267 $query = "
268 SELECT pass, points, value1, value2 FROM tst_solutions
269 WHERE active_fi = ? AND question_fi = ? AND pass < ? ORDER BY pass DESC
270 ";
271
272 self::$preparedSelectSolutionRecordsStatement = $this->db->prepare(
273 $query, array('integer', 'integer', 'integer')
274 );
275 }
276
278 }
279
281 {
282 if( self::$preparedInsertSolutionRecordStatement === null )
283 {
284 $query = "
285 INSERT INTO tst_solutions (
286 solution_id, active_fi, question_fi, pass, tstamp, points, value1, value2
287 ) VALUES (
288 ?, ?, ?, ?, ?, ?, ?, ?
289 )
290 ";
291
292 self::$preparedInsertSolutionRecordStatement = $this->db->prepareManip(
293 $query, array('integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'text', 'text')
294 );
295 }
296
298 }
299
301 {
302 if( self::$preparedDeleteResultRecordStatement === null )
303 {
304 self::$preparedDeleteResultRecordStatement = $this->db->prepareManip(
305 "DELETE FROM tst_test_result WHERE active_fi = ? AND question_fi = ? AND pass = ?",
306 array('integer', 'integer', 'integer')
307 );
308 }
309
311 }
312
314 {
315 if( self::$preparedSelectResultRecordStatement === null )
316 {
317 $query = "
318 SELECT points, manual, hint_count, hint_points, answered FROM tst_test_result
319 WHERE active_fi = ? AND question_fi = ? AND pass = ?
320 ";
321
322 self::$preparedSelectResultRecordStatement = $this->db->prepare(
323 $query, array('integer', 'integer', 'integer')
324 );
325 }
326
328 }
329
331 {
332 if( self::$preparedInsertResultRecordStatement === null )
333 {
334 $query = "
335 INSERT INTO tst_test_result (
336 test_result_id, active_fi, question_fi, pass, tstamp,
337 points, manual, hint_count, hint_points, answered
338 ) VALUES (
339 ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
340 )
341 ";
342
343 self::$preparedInsertResultRecordStatement = $this->db->prepareManip(
344 $query, array('integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer')
345 );
346 }
347
349 }
350}
An exception for terminatinating execution or to throw for unit testing.
__construct(ilDBInterface $db, ilSetting $assSettings, $isAssessmentLogEnabled)
ILIAS Setting Class.
Interface ilDBInterface.