ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.ilTestRandomQuestionSetSourcePoolDefinitionList.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetNonAvailablePool.php';
12{
18 protected $db = null;
19
25 protected $testOBJ = null;
26
30 private $sourcePoolDefinitions = array();
31
36
40 protected $lostPools = array();
41
45 protected $trashedPools = array();
46
54 {
55 $this->db = $db;
56 $this->testOBJ = $testOBJ;
57 $this->sourcePoolDefinitionFactory = $sourcePoolDefinitionFactory;
58 }
59
60 public function addDefinition(ilTestRandomQuestionSetSourcePoolDefinition $sourcePoolDefinition)
61 {
62 $this->sourcePoolDefinitions[ $sourcePoolDefinition->getId() ] = $sourcePoolDefinition;
63 }
64
66 {
67 $this->lostPools[$lostPool->getId()] = $lostPool;
68 }
69
70 public function isLostPool($poolId)
71 {
72 return isset($this->lostPools[$poolId]);
73 }
74
75 public function hasLostPool()
76 {
77 return (bool) count($this->lostPools);
78 }
79
80 public function getLostPools()
81 {
82 return $this->lostPools;
83 }
84
85 public function getLostPool($poolId)
86 {
87 if ($this->isLostPool($poolId)) {
88 return $this->lostPools[$poolId];
89 }
90
91 return null;
92 }
93
94 public function isTrashedPool($poolId)
95 {
96 return isset($this->trashedPools[$poolId]);
97 }
98
99 public function hasTrashedPool()
100 {
101 return (bool) count($this->trashedPools);
102 }
103
107 public function getTrashedPools()
108 {
109 return $this->trashedPools;
110 }
111
116 {
117 $this->trashedPools = $trashedPools;
118 }
119
120 // hey: fixRandomTestBuildable - provide single definitions, quantities distribution likes to deal with objects
121
122 public function hasDefinition($sourcePoolDefinitionId)
123 {
124 return $this->getDefinition($sourcePoolDefinitionId) !== null;
125 }
126
127 public function getDefinition($sourcePoolDefinitionId)
128 {
129 if (isset($this->sourcePoolDefinitions[$sourcePoolDefinitionId])) {
130 return $this->sourcePoolDefinitions[$sourcePoolDefinitionId];
131 }
132
133 return null;
134 }
135
136 public function getDefinitionBySourcePoolId($sourcePoolId)
137 {
138 foreach ($this as $definition) {
139 if ($definition->getPoolId() != $sourcePoolId) {
140 continue;
141 }
142
143 return $definition;
144 }
145
146 throw new InvalidArgumentException('invalid source pool id given');
147 }
148
149 public function getDefinitionIds()
150 {
151 return array_keys($this->sourcePoolDefinitions);
152 }
153
154 public function getDefinitionCount()
155 {
156 return count($this->sourcePoolDefinitions);
157 }
158 // hey.
159
160 public function loadDefinitions()
161 {
162 $query = "
163 SELECT tst_rnd_quest_set_qpls.*, odat.obj_id pool_id, tree.child
164 FROM tst_rnd_quest_set_qpls
165 LEFT JOIN object_data odat
166 ON odat.obj_id = pool_fi
167 LEFT JOIN object_reference oref
168 ON oref.obj_id = pool_fi
169 LEFT JOIN tree
170 ON tree = %s
171 AND child = oref.ref_id
172 WHERE test_fi = %s
173 ORDER BY sequence_pos ASC
174 ";
175
176 $res = $this->db->queryF($query, array('integer', 'integer'), array(1, $this->testOBJ->getTestId()));
177
178 $handledDefinitions = array();
179 $trashedPools = array();
180
181 while ($row = $this->db->fetchAssoc($res)) {
182 $sourcePoolDefinition = $this->sourcePoolDefinitionFactory->getEmptySourcePoolDefinition();
183 $sourcePoolDefinition->initFromArray($row);
184
185 if (!isset($handledDefinitions[$sourcePoolDefinition->getId()])) {
186 $this->addDefinition($sourcePoolDefinition);
187 $handledDefinitions[$sourcePoolDefinition->getId()] = $sourcePoolDefinition->getId();
188
189 $trashedPool = new ilTestRandomQuestionSetNonAvailablePool();
190 $trashedPool->assignDbRow($row);
191
192 $trashedPool->setUnavailabilityStatus(
194 );
195
196 $trashedPools[$trashedPool->getId()] = $trashedPool;
197 }
198
199 if (!$this->isLostPool($row['pool_id'])) {
200 if (!$row['pool_id']) {
202 $lostPool->assignDbRow($row);
203
204 $lostPool->setUnavailabilityStatus(
206 );
207
208 $this->addLostPool($lostPool);
209
210 if (isset($trashedPools[$lostPool->getId()])) {
211 unset($trashedPools[$lostPool->getId()]);
212 }
213 }
214 }
215
216 if ($row['child']) {
217 unset($trashedPools[$row['pool_id']]);
218 }
219 }
220
222 }
223
224 public function saveDefinitions()
225 {
226 foreach ($this as $sourcePoolDefinition) {
228 $sourcePoolDefinition->saveToDb();
229 }
230 }
231
232 public function cloneDefinitionsForTestId($testId)
233 {
234 $definitionIdMap = array();
235
236 foreach ($this as $definition) {
239 $originalId = $definition->getId();
240 $definition->cloneToDbForTestId($testId);
241 $cloneId = $definition->getId();
242
243 $definitionIdMap[$originalId] = $cloneId;
244 }
245
246 return $definitionIdMap;
247 }
248
249 public function deleteDefinitions()
250 {
251 $query = "DELETE FROM tst_rnd_quest_set_qpls WHERE test_fi = %s";
252 $this->db->manipulateF($query, array('integer'), array($this->testOBJ->getTestId()));
253 }
254
255 public function reindexPositions()
256 {
257 $positionIndex = array();
258
259 foreach ($this as $definition) {
261 $positionIndex[ $definition->getId() ] = $definition->getSequencePosition();
262 }
263
264 asort($positionIndex);
265
266 $i = 1;
267
268 foreach ($positionIndex as $definitionId => $definitionPosition) {
269 $positionIndex[$definitionId] = $i++;
270 }
271
272 foreach ($this as $definition) {
273 $definition->setSequencePosition($positionIndex[$definition->getId()]);
274 }
275 }
276
277 public function getNextPosition()
278 {
279 return (count($this->sourcePoolDefinitions) + 1);
280 }
281
282 public function getInvolvedSourcePoolIds()
283 {
284 $involvedSourcePoolIds = array();
285
286 foreach ($this as $definition) {
288 $involvedSourcePoolIds[ $definition->getPoolId() ] = $definition->getPoolId();
289 }
290
291 return array_values($involvedSourcePoolIds);
292 }
293
294 public function getQuestionAmount()
295 {
296 $questionAmount = 0;
297
298 foreach ($this as $definition) {
300 $questionAmount += $definition->getQuestionAmount();
301 }
302
303 return $questionAmount;
304 }
305
309 public function savedDefinitionsExist()
310 {
311 $query = "SELECT COUNT(*) cnt FROM tst_rnd_quest_set_qpls WHERE test_fi = %s";
312 $res = $this->db->queryF($query, array('integer'), array($this->testOBJ->getTestId()));
313
314 $row = $this->db->fetchAssoc($res);
315
316 return $row['cnt'] > 0;
317 }
318
319 public function hasTaxonomyFilters()
320 {
321 foreach ($this as $definition) {
323 // fau: taxFilter/typeFilter - new check for existing taxonomy filter
324 if (count($definition->getMappedTaxonomyFilter())) {
325 return true;
326 }
327 #if( $definition->getMappedFilterTaxId() && $definition->getMappedFilterTaxNodeId() )
328 #{
329 # return true;
330 #}
331 // fau.
332 }
333
334 return false;
335 }
336
337 // fau: taxFilter/typeFilter - check for existing type filters
338 public function hasTypeFilters()
339 {
340 foreach ($this as $definition) {
341 if (count($definition->getTypeFilter())) {
342 return true;
343 }
344 }
345 return false;
346 }
347 // fau.
348
349 public function areAllUsedPoolsAvailable()
350 {
351 if ($this->hasLostPool()) {
352 return false;
353 }
354
355 if ($this->hasTrashedPool()) {
356 return false;
357 }
358
359 return true;
360 }
361
365 public function rewind()
366 {
367 return reset($this->sourcePoolDefinitions);
368 }
369
373 public function current()
374 {
375 return current($this->sourcePoolDefinitions);
376 }
377
381 public function key()
382 {
383 return key($this->sourcePoolDefinitions);
384 }
385
389 public function next()
390 {
391 return next($this->sourcePoolDefinitions);
392 }
393
397 public function valid()
398 {
399 return key($this->sourcePoolDefinitions) !== null;
400 }
401
402 public function getNonAvailablePools()
403 {
404 //echo get_class($this->getTrashedPools()[0]);
405 return array_merge($this->getTrashedPools(), $this->getLostPools());
406 }
407}
An exception for terminatinating execution or to throw for unit testing.
addDefinition(ilTestRandomQuestionSetSourcePoolDefinition $sourcePoolDefinition)
__construct(ilDBInterface $db, ilObjTest $testOBJ, ilTestRandomQuestionSetSourcePoolDefinitionFactory $sourcePoolDefinitionFactory)
Constructor.
$i
Definition: disco.tpl.php:19
Interface ilDBInterface.
$query
foreach($_POST as $key=> $value) $res