ILIAS  release_8 Revision v8.19-1-g4e8f2f9140c
All Data Structures Namespaces Files Functions Variables Modules Pages
ilTestRandomQuestionSetStagingPoolBuilder Class Reference
+ Collaboration diagram for ilTestRandomQuestionSetStagingPoolBuilder:

Public Member Functions

 __construct (ilDBInterface $db, ilObjTest $testOBJ)
 
 rebuild (ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
 
 reset ()
 

Data Fields

 $db = null
 
 $testOBJ = null
 

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 ( ilDBInterface  $db,
ilObjTest  $testOBJ 
)

Member Function Documentation

◆ build()

ilTestRandomQuestionSetStagingPoolBuilder::build ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

References mirrorSourcePoolTaxonomies(), and stageQuestionsFromSourcePool().

99  {
100  $involvedSourcePoolIds = $sourcePoolDefinitionList->getInvolvedSourcePoolIds();
101 
102  foreach ($involvedSourcePoolIds as $sourcePoolId) {
103  $questionIdMapping = $this->stageQuestionsFromSourcePool($sourcePoolId);
104 
105  $taxonomiesKeysMap = $this->mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping);
106 
107  $this->applyMappedTaxonomiesKeys($sourcePoolDefinitionList, $taxonomiesKeysMap, $sourcePoolId);
108  }
109  }
+ Here is the call graph for this function:

◆ buildCheap()

ilTestRandomQuestionSetStagingPoolBuilder::buildCheap ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

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

Referenced by rebuild().

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

Referenced by build(), and buildCheap().

245  {
246  $duplicator = new ilQuestionPoolTaxonomiesDuplicator();
247 
248  $duplicator->setSourceObjId($sourcePoolId);
249  $duplicator->setSourceObjType('qpl');
250  $duplicator->setTargetObjId($this->testOBJ->getId());
251  $duplicator->setTargetObjType($this->testOBJ->getType());
252  $duplicator->setQuestionIdMapping($questionIdMapping);
253 
254  $duplicator->duplicate($duplicator->getAllTaxonomiesForSourceObject());
255 
256  return $duplicator->getDuplicatedTaxonomiesKeysMap();
257  }
+ Here is the caller graph for this function:

◆ rebuild()

ilTestRandomQuestionSetStagingPoolBuilder::rebuild ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)

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

References buildCheap(), and reset().

46  {
47  $this->reset();
48 
49  // fau: taxFilter/typeFilter - copy only the needed questions, and copy every question only once
50  // TODO-RND2017: remove non cheap methods and rename cheap ones
51  #$this->build($sourcePoolDefinitionList);
52  $this->buildCheap($sourcePoolDefinitionList);
53  // fau.
54  }
buildCheap(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
+ Here is the call graph for this function:

◆ removeMirroredTaxonomies()

ilTestRandomQuestionSetStagingPoolBuilder::removeMirroredTaxonomies ( )
private

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

References ilObjTaxonomy\getUsageOfObject().

Referenced by reset().

63  {
64  $taxonomyIds = ilObjTaxonomy::getUsageOfObject($this->testOBJ->getId());
65 
66  foreach ($taxonomyIds as $taxId) {
67  $taxonomy = new ilObjTaxonomy($taxId);
68  $taxonomy->delete();
69  }
70  }
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 72 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

References $DIC, $query, $res, and assQuestion\instantiateQuestion().

Referenced by reset().

73  {
74  $query = 'SELECT * FROM tst_rnd_cpy WHERE tst_fi = %s';
75  $res = $this->db->queryF(
76  $query,
77  array('integer'),
78  array($this->testOBJ->getTestId())
79  );
80 
81  while ($row = $this->db->fetchAssoc($res)) {
82  try {
83  $question = assQuestion::instantiateQuestion($row['qst_fi']);
84  } catch (InvalidArgumentException $ex) {
85  global $DIC; /* @var ILIAS\DI\Container $DIC */
86  $DIC['ilLog']->warning(
87  "could not delete staged random question (ref={$this->testOBJ->getRefId()} / qst={$row['qst_fi']})"
88  );
89  return;
90  }
91  $question->delete($row['qst_fi']);
92  }
93 
94  $query = "DELETE FROM tst_rnd_cpy WHERE tst_fi = %s";
95  $this->db->manipulateF($query, array('integer'), array($this->testOBJ->getTestId()));
96  }
$res
Definition: ltiservices.php:69
global $DIC
Definition: feed.php:28
static instantiateQuestion(int $question_id)
$query
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ reset()

ilTestRandomQuestionSetStagingPoolBuilder::reset ( )

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

References $query, $res, and assQuestion\instantiateQuestion().

Referenced by build().

111  : array
112  {
113  $questionIdMapping = array();
114 
115  $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
116  $res = $this->db->queryF($query, array('integer', 'text'), array($sourcePoolId, 1));
117 
118  while ($row = $this->db->fetchAssoc($res)) {
119  $question = assQuestion::instantiateQuestion($row['question_id']);
120  $duplicateId = $question->duplicate(true, null, null, null, $this->testOBJ->getId());
121 
122  $nextId = $this->db->nextId('tst_rnd_cpy');
123  $this->db->insert('tst_rnd_cpy', array(
124  'copy_id' => array('integer', $nextId),
125  'tst_fi' => array('integer', $this->testOBJ->getTestId()),
126  'qst_fi' => array('integer', $duplicateId),
127  'qpl_fi' => array('integer', $sourcePoolId)
128  ));
129 
130  $questionIdMapping[ $row['question_id'] ] = $duplicateId;
131  }
132 
133  return $questionIdMapping;
134  }
$res
Definition: ltiservices.php:69
static instantiateQuestion(int $question_id)
$query
+ 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 206 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

References $query, $res, and assQuestion\_instantiateQuestion().

Referenced by buildCheap().

207  {
208  $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
209  if (!empty($filterIds)) {
210  $query .= ' AND ' . $this->db->in('question_id', $filterIds, false, 'integer');
211  }
212  if (!empty($typeFilter)) {
213  $query .= ' AND ' . $this->db->in('question_type_fi', $typeFilter, false, 'integer');
214  }
215  if (!empty($lifecycleFilter)) {
216  $query .= ' AND ' . $this->db->in('lifecycle', $lifecycleFilter, false, 'text');
217  }
218  $res = $this->db->queryF($query, array('integer', 'text'), array($sourcePoolId, 1));
219 
220  while ($row = $this->db->fetchAssoc($res)) {
221  if (!isset($questionIdMappingPerPool[$sourcePoolId])) {
222  $questionIdMappingPerPool[$sourcePoolId] = array();
223  }
224  if (!isset($questionIdMappingPerPool[$sourcePoolId][ $row['question_id'] ])) {
225  $question = assQuestion::_instantiateQuestion($row['question_id']);
226  $duplicateId = $question->duplicate(true, '', '', '', $this->testOBJ->getId());
227 
228  $nextId = $this->db->nextId('tst_rnd_cpy');
229  $this->db->insert('tst_rnd_cpy', array(
230  'copy_id' => array('integer', $nextId),
231  'tst_fi' => array('integer', $this->testOBJ->getTestId()),
232  'qst_fi' => array('integer', $duplicateId),
233  'qpl_fi' => array('integer', $sourcePoolId)
234  ));
235 
236  $questionIdMappingPerPool[$sourcePoolId][ $row['question_id'] ] = $duplicateId;
237  }
238  }
239 
240  return $questionIdMappingPerPool;
241  }
$res
Definition: ltiservices.php:69
$query
static _instantiateQuestion(int $question_id)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Field Documentation

◆ $db

ilTestRandomQuestionSetStagingPoolBuilder::$db = null

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

Referenced by __construct().

◆ $testOBJ

ilTestRandomQuestionSetStagingPoolBuilder::$testOBJ = null

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

Referenced by __construct().


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