ILIAS  trunk Revision v11.0_alpha-1744-gb0451eebef4
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
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.

Referenced by build(), and buildCheap().

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  }
+ Here is the caller graph for this function:

◆ build()

ilTestRandomQuestionSetStagingPoolBuilder::build ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

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

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)
+ Here is the call graph for this function:

◆ buildCheap()

ilTestRandomQuestionSetStagingPoolBuilder::buildCheap ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

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

Referenced by rebuild().

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) {
146  $nodeItems = ilObjTaxonomy::getSubTreeItems(
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)
applyMappedTaxonomiesKeys(ilTestRandomQuestionSetSourcePoolDefinitionList $source_pool_definition_list, ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxonomies_keys_map, int $source_pool_id)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return 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 231 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

Referenced by build(), and buildCheap().

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  }
+ 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.

References buildCheap(), and reset().

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

◆ removeMirroredTaxonomies()

ilTestRandomQuestionSetStagingPoolBuilder::removeMirroredTaxonomies ( )
private

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

References ilObjTaxonomy\getUsageOfObject().

Referenced by reset().

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)
+ 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.

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

Referenced by reset().

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  }
$res
Definition: ltiservices.php:66
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 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.

References $res, and assQuestion\instantiateQuestion().

Referenced by build().

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  }
$res
Definition: ltiservices.php:66
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 193 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

References $res, and assQuestion\instantiateQuestion().

Referenced by buildCheap().

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  }
$res
Definition: ltiservices.php:66
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: