ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
ilTestRandomQuestionSetStagingPoolBuilder Class Reference
+ Collaboration diagram for ilTestRandomQuestionSetStagingPoolBuilder:

Public Member Functions

 __construct (private readonly ilDBInterface $db, private readonly TestLogger $logger, private readonly ilObjTest $test_obj)
 
 rebuild (ilTestRandomQuestionSetSourcePoolDefinitionList $source_pool_definition_list)
 
 reset ()
 

Private Member Functions

 removeMirroredTaxonomies ()
 
 removeStagedQuestions ()
 
 build (ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
 
 stageQuestionsFromSourcePool ($sourcePoolId)
 
 buildCheap (ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
 
 stageQuestionsFromSourcePoolCheap ($sourcePoolId, $questionIdMappingPerPool, $filterIds=null, $typeFilter=null, $lifecycleFilter=null)
 
 mirrorSourcePoolTaxonomies ($sourcePoolId, $questionIdMapping)
 
 applyMappedTaxonomiesKeys (ilTestRandomQuestionSetSourcePoolDefinitionList $source_pool_definition_list, ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxonomies_keys_map, int $source_pool_id)
 

Detailed Description

Constructor & Destructor Documentation

◆ __construct()

ilTestRandomQuestionSetStagingPoolBuilder::__construct ( private readonly ilDBInterface  $db,
private readonly TestLogger  $logger,
private readonly ilObjTest  $test_obj 
)

Definition at line 31 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

35 {
36 }

Member Function Documentation

◆ applyMappedTaxonomiesKeys()

ilTestRandomQuestionSetStagingPoolBuilder::applyMappedTaxonomiesKeys ( ilTestRandomQuestionSetSourcePoolDefinitionList  $source_pool_definition_list,
ilQuestionPoolDuplicatedTaxonomiesKeysMap  $taxonomies_keys_map,
int  $source_pool_id 
)
private

Definition at line 246 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

250 : void {
251 foreach ($source_pool_definition_list as $definition) {
252 if ($definition->getPoolId() === $source_pool_id) {
253 $definition->mapTaxonomyFilter($taxonomies_keys_map);
254 }
255 }
256 }

Referenced by build(), and buildCheap().

+ Here is the caller graph for this function:

◆ build()

ilTestRandomQuestionSetStagingPoolBuilder::build ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

Definition at line 87 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

88 {
89 $involvedSourcePoolIds = $sourcePoolDefinitionList->getInvolvedSourcePoolIds();
90
91 foreach ($involvedSourcePoolIds as $sourcePoolId) {
92 $questionIdMapping = $this->stageQuestionsFromSourcePool($sourcePoolId);
93
94 $taxonomiesKeysMap = $this->mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping);
95
96 $this->applyMappedTaxonomiesKeys($sourcePoolDefinitionList, $taxonomiesKeysMap, $sourcePoolId);
97 }
98 }
applyMappedTaxonomiesKeys(ilTestRandomQuestionSetSourcePoolDefinitionList $source_pool_definition_list, ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxonomies_keys_map, int $source_pool_id)

References applyMappedTaxonomiesKeys(), ilTestRandomQuestionSetSourcePoolDefinitionList\getInvolvedSourcePoolIds(), mirrorSourcePoolTaxonomies(), and stageQuestionsFromSourcePool().

+ Here is the call graph for this function:

◆ buildCheap()

ilTestRandomQuestionSetStagingPoolBuilder::buildCheap ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

127 {
128 // TODO-RND2017: refactor using assQuestionList and wrap with assQuestionListCollection for unioning
129
130 $questionIdMappingPerPool = [];
131
132 // select questions to be copied by the definitions
133 // note: a question pool may appear many times in this list
134
135 /* @var ilTestRandomQuestionSetSourcePoolDefinition $definition */
136 foreach ($sourcePoolDefinitionList as $definition) {
137 $taxFilter = $definition->getOriginalTaxonomyFilter();
138 $typeFilter = $definition->getTypeFilter();
139 $lifecycleFilter = $definition->getLifecycleFilter();
140
141 if (!empty($taxFilter)) {
142 $filterItems = null;
143 foreach ($taxFilter as $taxId => $nodeIds) {
144 $taxItems = [];
145 foreach ($nodeIds as $nodeId) {
147 'qpl',
148 $definition->getPoolId(),
149 'quest',
150 $taxId,
151 $nodeId
152 );
153
154 foreach ($nodeItems as $nodeItem) {
155 $taxItems[] = $nodeItem['item_id'];
156 }
157 }
158
159 $filterItems = isset($filterItems) ? array_intersect($filterItems, array_unique($taxItems)) : array_unique($taxItems);
160 }
161
162 // stage only the questions applying to the tax/type filter
163 // and save the duplication map for later use
164
165 $questionIdMappingPerPool = $this->stageQuestionsFromSourcePoolCheap(
166 $definition->getPoolId(),
167 $questionIdMappingPerPool,
168 array_values($filterItems),
169 $typeFilter,
170 $lifecycleFilter
171 );
172 } else {
173 // stage only the questions applying to the tax/type filter
174 // and save the duplication map for later use
175
176 $questionIdMappingPerPool = $this->stageQuestionsFromSourcePoolCheap(
177 $definition->getPoolId(),
178 $questionIdMappingPerPool,
179 null,
180 $typeFilter,
181 $lifecycleFilter
182 );
183 }
184 }
185
186 // copy the taxonomies to the test and map them
187 foreach ($questionIdMappingPerPool as $sourcePoolId => $questionIdMapping) {
188 $taxonomiesKeysMap = $this->mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping);
189 $this->applyMappedTaxonomiesKeys($sourcePoolDefinitionList, $taxonomiesKeysMap, $sourcePoolId);
190 }
191 }
static getSubTreeItems(string $a_comp, int $a_obj_id, string $a_item_type, int $a_tax_id, $a_node)
Get all assigned items under a node.
stageQuestionsFromSourcePoolCheap($sourcePoolId, $questionIdMappingPerPool, $filterIds=null, $typeFilter=null, $lifecycleFilter=null)

References applyMappedTaxonomiesKeys(), ilObjTaxonomy\getSubTreeItems(), mirrorSourcePoolTaxonomies(), and stageQuestionsFromSourcePoolCheap().

Referenced by rebuild().

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

◆ mirrorSourcePoolTaxonomies()

ilTestRandomQuestionSetStagingPoolBuilder::mirrorSourcePoolTaxonomies (   $sourcePoolId,
  $questionIdMapping 
)
private

Definition at line 231 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

232 {
233 $duplicator = new ilQuestionPoolTaxonomiesDuplicator();
234
235 $duplicator->setSourceObjId($sourcePoolId);
236 $duplicator->setSourceObjType('qpl');
237 $duplicator->setTargetObjId($this->test_obj->getId());
238 $duplicator->setTargetObjType($this->test_obj->getType());
239 $duplicator->setQuestionIdMapping($questionIdMapping);
240
241 $duplicator->duplicate($duplicator->getAllTaxonomiesForSourceObject());
242
243 return $duplicator->getDuplicatedTaxonomiesKeysMap();
244 }

Referenced by build(), and buildCheap().

+ Here is the caller graph for this function:

◆ rebuild()

ilTestRandomQuestionSetStagingPoolBuilder::rebuild ( ilTestRandomQuestionSetSourcePoolDefinitionList  $source_pool_definition_list)

Definition at line 40 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

40 : void
41 {
42 $this->reset();
43 $this->buildCheap($source_pool_definition_list);
44 }
buildCheap(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)

References buildCheap(), and reset().

+ Here is the call graph for this function:

◆ removeMirroredTaxonomies()

ilTestRandomQuestionSetStagingPoolBuilder::removeMirroredTaxonomies ( )
private

Definition at line 52 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

53 {
54 $taxonomyIds = ilObjTaxonomy::getUsageOfObject($this->test_obj->getId());
55
56 foreach ($taxonomyIds as $taxId) {
57 $taxonomy = new ilObjTaxonomy($taxId);
58 $taxonomy->delete();
59 }
60 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getUsageOfObject(int $a_obj_id, bool $a_include_titles=false)

References ilObjTaxonomy\getUsageOfObject().

Referenced by reset().

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

◆ removeStagedQuestions()

ilTestRandomQuestionSetStagingPoolBuilder::removeStagedQuestions ( )
private

Definition at line 62 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

63 {
64 $query = 'SELECT * FROM tst_rnd_cpy WHERE tst_fi = %s';
65 $res = $this->db->queryF(
66 $query,
67 ['integer'],
68 [$this->test_obj->getTestId()]
69 );
70
71 while ($row = $this->db->fetchAssoc($res)) {
72 try {
73 $question = assQuestion::instantiateQuestion($row['qst_fi']);
74 } catch (InvalidArgumentException $ex) {
75 $this->logger->warning(
76 "could not delete staged random question (ref={$this->test_obj->getRefId()} / qst={$row['qst_fi']})"
77 );
78 return;
79 }
80 $question->delete($row['qst_fi']);
81 }
82
83 $query = "DELETE FROM tst_rnd_cpy WHERE tst_fi = %s";
84 $this->db->manipulateF($query, ['integer'], [$this->test_obj->getTestId()]);
85 }
static instantiateQuestion(int $question_id)
$res
Definition: ltiservices.php:69

References $res, assQuestion\instantiateQuestion(), and ILIAS\Repository\logger().

Referenced by reset().

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

◆ reset()

ilTestRandomQuestionSetStagingPoolBuilder::reset ( )

Definition at line 46 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

References removeMirroredTaxonomies(), and removeStagedQuestions().

Referenced by rebuild().

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

◆ stageQuestionsFromSourcePool()

ilTestRandomQuestionSetStagingPoolBuilder::stageQuestionsFromSourcePool (   $sourcePoolId)
private

Definition at line 100 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

100 : array
101 {
102 $questionIdMapping = [];
103
104 $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
105 $res = $this->db->queryF($query, ['integer', 'text'], [$sourcePoolId, 1]);
106
107 while ($row = $this->db->fetchAssoc($res)) {
108 $question = assQuestion::instantiateQuestion($row['question_id']);
109 $duplicateId = $question->duplicate(true, '', '', -1, $this->test_obj->getId());
110
111 $nextId = $this->db->nextId('tst_rnd_cpy');
112 $this->db->insert('tst_rnd_cpy', [
113 'copy_id' => ['integer', $nextId],
114 'tst_fi' => ['integer', $this->test_obj->getTestId()],
115 'qst_fi' => ['integer', $duplicateId],
116 'qpl_fi' => ['integer', $sourcePoolId]
117 ]);
118
119 $questionIdMapping[ $row['question_id'] ] = $duplicateId;
120 }
121
122 return $questionIdMapping;
123 }

References $res, and assQuestion\instantiateQuestion().

Referenced by build().

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

◆ stageQuestionsFromSourcePoolCheap()

ilTestRandomQuestionSetStagingPoolBuilder::stageQuestionsFromSourcePoolCheap (   $sourcePoolId,
  $questionIdMappingPerPool,
  $filterIds = null,
  $typeFilter = null,
  $lifecycleFilter = null 
)
private

Definition at line 193 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

194 {
195 $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
196 if (!empty($filterIds)) {
197 $query .= ' AND ' . $this->db->in('question_id', $filterIds, false, 'integer');
198 }
199 if (!empty($typeFilter)) {
200 $query .= ' AND ' . $this->db->in('question_type_fi', $typeFilter, false, 'integer');
201 }
202 if (!empty($lifecycleFilter)) {
203 $query .= ' AND ' . $this->db->in('lifecycle', $lifecycleFilter, false, 'text');
204 }
205 $res = $this->db->queryF($query, ['integer', 'text'], [$sourcePoolId, 1]);
206
207 while ($row = $this->db->fetchAssoc($res)) {
208 if (!isset($questionIdMappingPerPool[$sourcePoolId])) {
209 $questionIdMappingPerPool[$sourcePoolId] = [];
210 }
211 if (!isset($questionIdMappingPerPool[$sourcePoolId][ $row['question_id'] ])) {
212 $question = assQuestion::instantiateQuestion($row['question_id']);
213 $duplicateId = $question->duplicate(true, '', '', -1, $this->test_obj->getId());
214
215 $nextId = $this->db->nextId('tst_rnd_cpy');
216 $this->db->insert('tst_rnd_cpy', [
217 'copy_id' => ['integer', $nextId],
218 'tst_fi' => ['integer', $this->test_obj->getTestId()],
219 'qst_fi' => ['integer', $duplicateId],
220 'qpl_fi' => ['integer', $sourcePoolId]
221 ]);
222
223 $questionIdMappingPerPool[$sourcePoolId][ $row['question_id'] ] = $duplicateId;
224 }
225 }
226
227 return $questionIdMappingPerPool;
228 }

References $res, and assQuestion\instantiateQuestion().

Referenced by buildCheap().

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

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