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

Public Member Functions

 __construct (private ilDBInterface $db, private ilLogger $log, private 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)
 

Detailed Description

Constructor & Destructor Documentation

◆ __construct()

ilTestRandomQuestionSetStagingPoolBuilder::__construct ( private ilDBInterface  $db,
private ilLogger  $log,
private ilObjTest  $test_obj 
)

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

33  {
34  }

Member Function Documentation

◆ build()

ilTestRandomQuestionSetStagingPoolBuilder::build ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

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

86  {
87  $involvedSourcePoolIds = $sourcePoolDefinitionList->getInvolvedSourcePoolIds();
88 
89  foreach ($involvedSourcePoolIds as $sourcePoolId) {
90  $questionIdMapping = $this->stageQuestionsFromSourcePool($sourcePoolId);
91 
92  $taxonomiesKeysMap = $this->mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping);
93 
94  $this->applyMappedTaxonomiesKeys($sourcePoolDefinitionList, $taxonomiesKeysMap, $sourcePoolId);
95  }
96  }
+ Here is the call graph for this function:

◆ buildCheap()

ilTestRandomQuestionSetStagingPoolBuilder::buildCheap ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

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

Referenced by rebuild().

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

Referenced by build(), and buildCheap().

230  {
231  $duplicator = new ilQuestionPoolTaxonomiesDuplicator();
232 
233  $duplicator->setSourceObjId($sourcePoolId);
234  $duplicator->setSourceObjType('qpl');
235  $duplicator->setTargetObjId($this->test_obj->getId());
236  $duplicator->setTargetObjType($this->test_obj->getType());
237  $duplicator->setQuestionIdMapping($questionIdMapping);
238 
239  $duplicator->duplicate($duplicator->getAllTaxonomiesForSourceObject());
240 
241  return $duplicator->getDuplicatedTaxonomiesKeysMap();
242  }
+ Here is the caller graph for this function:

◆ rebuild()

ilTestRandomQuestionSetStagingPoolBuilder::rebuild ( ilTestRandomQuestionSetSourcePoolDefinitionList  $source_pool_definition_list)

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

References buildCheap(), and reset().

38  : void
39  {
40  $this->reset();
41  $this->buildCheap($source_pool_definition_list);
42  }
buildCheap(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
+ Here is the call graph for this function:

◆ removeMirroredTaxonomies()

ilTestRandomQuestionSetStagingPoolBuilder::removeMirroredTaxonomies ( )
private

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

References ilObjTaxonomy\getUsageOfObject().

Referenced by reset().

51  {
52  $taxonomyIds = ilObjTaxonomy::getUsageOfObject($this->test_obj->getId());
53 
54  foreach ($taxonomyIds as $taxId) {
55  $taxonomy = new ilObjTaxonomy($taxId);
56  $taxonomy->delete();
57  }
58  }
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)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ removeStagedQuestions()

ilTestRandomQuestionSetStagingPoolBuilder::removeStagedQuestions ( )
private

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

References $res, and assQuestion\instantiateQuestion().

Referenced by reset().

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

◆ reset()

ilTestRandomQuestionSetStagingPoolBuilder::reset ( )

Definition at line 44 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 98 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

References $res, and assQuestion\instantiateQuestion().

Referenced by build().

98  : array
99  {
100  $questionIdMapping = array();
101 
102  $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
103  $res = $this->db->queryF($query, array('integer', 'text'), array($sourcePoolId, 1));
104 
105  while ($row = $this->db->fetchAssoc($res)) {
106  $question = assQuestion::instantiateQuestion($row['question_id']);
107  $duplicateId = $question->duplicate(true, '', '', -1, $this->test_obj->getId());
108 
109  $nextId = $this->db->nextId('tst_rnd_cpy');
110  $this->db->insert('tst_rnd_cpy', array(
111  'copy_id' => array('integer', $nextId),
112  'tst_fi' => array('integer', $this->test_obj->getTestId()),
113  'qst_fi' => array('integer', $duplicateId),
114  'qpl_fi' => array('integer', $sourcePoolId)
115  ));
116 
117  $questionIdMapping[ $row['question_id'] ] = $duplicateId;
118  }
119 
120  return $questionIdMapping;
121  }
$res
Definition: ltiservices.php:69
static instantiateQuestion(int $question_id)
+ 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 191 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

References $res, and assQuestion\instantiateQuestion().

Referenced by buildCheap().

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