ILIAS  release_7 Revision v7.30-3-g800a261c036
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)
 
 cleanupTestSettings ()
 

Detailed Description

Constructor & Destructor Documentation

◆ __construct()

ilTestRandomQuestionSetStagingPoolBuilder::__construct ( ilDBInterface  $db,
ilObjTest  $testOBJ 
)

Member Function Documentation

◆ build()

ilTestRandomQuestionSetStagingPoolBuilder::build ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

References mirrorSourcePoolTaxonomies(), and stageQuestionsFromSourcePool().

91  {
92  $involvedSourcePoolIds = $sourcePoolDefinitionList->getInvolvedSourcePoolIds();
93 
94  foreach ($involvedSourcePoolIds as $sourcePoolId) {
95  $questionIdMapping = $this->stageQuestionsFromSourcePool($sourcePoolId);
96 
97  $taxonomiesKeysMap = $this->mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping);
98 
99  $this->applyMappedTaxonomiesKeys($sourcePoolDefinitionList, $taxonomiesKeysMap, $sourcePoolId);
100  }
101  }
+ Here is the call graph for this function:

◆ buildCheap()

ilTestRandomQuestionSetStagingPoolBuilder::buildCheap ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)
private

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

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

Referenced by rebuild().

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

◆ cleanupTestSettings()

ilTestRandomQuestionSetStagingPoolBuilder::cleanupTestSettings ( )
private

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

Referenced by reset().

278  {
279  $this->testOBJ->setResultFilterTaxIds(array());
280  $this->testOBJ->saveToDb(true);
281  }
+ Here is the caller graph for this function:

◆ mirrorSourcePoolTaxonomies()

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

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

Referenced by build(), and buildCheap().

237  {
238  $duplicator = new ilQuestionPoolTaxonomiesDuplicator();
239 
240  $duplicator->setSourceObjId($sourcePoolId);
241  $duplicator->setSourceObjType('qpl');
242  $duplicator->setTargetObjId($this->testOBJ->getId());
243  $duplicator->setTargetObjType($this->testOBJ->getType());
244  $duplicator->setQuestionIdMapping($questionIdMapping);
245 
246  $duplicator->duplicate($duplicator->getAllTaxonomiesForSourceObject());
247 
248  return $duplicator->getDuplicatedTaxonomiesKeysMap();
249  }
+ Here is the caller graph for this function:

◆ rebuild()

ilTestRandomQuestionSetStagingPoolBuilder::rebuild ( ilTestRandomQuestionSetSourcePoolDefinitionList  $sourcePoolDefinitionList)

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

References buildCheap(), and reset().

35  {
36  $this->reset();
37 
38  // fau: taxFilter/typeFilter - copy only the needed questions, and copy every question only once
39  // TODO-RND2017: remove non cheap methods and rename cheap ones
40  #$this->build($sourcePoolDefinitionList);
41  $this->buildCheap($sourcePoolDefinitionList);
42  // fau.
43  }
buildCheap(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
+ Here is the call graph for this function:

◆ removeMirroredTaxonomies()

ilTestRandomQuestionSetStagingPoolBuilder::removeMirroredTaxonomies ( )
private

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

References ilObjTaxonomy\getUsageOfObject().

Referenced by reset().

55  {
56  $taxonomyIds = ilObjTaxonomy::getUsageOfObject($this->testOBJ->getId());
57 
58  foreach ($taxonomyIds as $taxId) {
59  $taxonomy = new ilObjTaxonomy($taxId);
60  $taxonomy->delete();
61  }
62  }
static getUsageOfObject($a_obj_id, $a_include_titles=false)
Get usage of object.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ removeStagedQuestions()

ilTestRandomQuestionSetStagingPoolBuilder::removeStagedQuestions ( )
private

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

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

Referenced by reset().

65  {
66  $query = 'SELECT * FROM tst_rnd_cpy WHERE tst_fi = %s';
67  $res = $this->db->queryF(
68  $query,
69  array('integer'),
70  array($this->testOBJ->getTestId())
71  );
72 
73  while ($row = $this->db->fetchAssoc($res)) {
74  $question = assQuestion::_instanciateQuestion($row['qst_fi']);
75 
76  if ($question instanceof assQuestion) {
77  $question->delete($row['qst_fi']);
78  } else {
79  global $DIC; /* @var ILIAS\DI\Container $DIC */
80  $DIC['ilLog']->warning(
81  "could not delete staged random question (ref={$this->testOBJ->getRefId()} / qst={$row['qst_fi']})"
82  );
83  }
84  }
85 
86  $query = "DELETE FROM tst_rnd_cpy WHERE tst_fi = %s";
87  $this->db->manipulateF($query, array('integer'), array($this->testOBJ->getTestId()));
88  }
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
Abstract basic class which is to be extended by the concrete assessment question type classes...
foreach($_POST as $key=> $value) $res
global $DIC
Definition: goto.php:24
$query
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ reset()

ilTestRandomQuestionSetStagingPoolBuilder::reset ( )

◆ stageQuestionsFromSourcePool()

ilTestRandomQuestionSetStagingPoolBuilder::stageQuestionsFromSourcePool (   $sourcePoolId)
private

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

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

Referenced by build().

104  {
105  $questionIdMapping = array();
106 
107  $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
108  $res = $this->db->queryF($query, array('integer', 'text'), array($sourcePoolId, 1));
109 
110  while ($row = $this->db->fetchAssoc($res)) {
111  $question = assQuestion::_instanciateQuestion($row['question_id']);
112  $duplicateId = $question->duplicate(true, null, null, null, $this->testOBJ->getId());
113 
114  $nextId = $this->db->nextId('tst_rnd_cpy');
115  $this->db->insert('tst_rnd_cpy', array(
116  'copy_id' => array('integer', $nextId),
117  'tst_fi' => array('integer', $this->testOBJ->getTestId()),
118  'qst_fi' => array('integer', $duplicateId),
119  'qpl_fi' => array('integer', $sourcePoolId)
120  ));
121 
122  $questionIdMapping[ $row['question_id'] ] = $duplicateId;
123  }
124 
125  return $questionIdMapping;
126  }
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
foreach($_POST as $key=> $value) $res
$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 198 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

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

Referenced by buildCheap().

199  {
200  $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
201  if (!empty($filterIds)) {
202  $query .= ' AND ' . $this->db->in('question_id', $filterIds, false, 'integer');
203  }
204  if (!empty($typeFilter)) {
205  $query .= ' AND ' . $this->db->in('question_type_fi', $typeFilter, false, 'integer');
206  }
207  if (!empty($lifecycleFilter)) {
208  $query .= ' AND ' . $this->db->in('lifecycle', $lifecycleFilter, false, 'text');
209  }
210  $res = $this->db->queryF($query, array('integer', 'text'), array($sourcePoolId, 1));
211 
212  while ($row = $this->db->fetchAssoc($res)) {
213  if (!isset($questionIdMappingPerPool[$sourcePoolId])) {
214  $questionIdMappingPerPool[$sourcePoolId] = array();
215  }
216  if (!isset($questionIdMappingPerPool[$sourcePoolId][ $row['question_id'] ])) {
217  $question = assQuestion::_instantiateQuestion($row['question_id']);
218  $duplicateId = $question->duplicate(true, null, null, null, $this->testOBJ->getId());
219 
220  $nextId = $this->db->nextId('tst_rnd_cpy');
221  $this->db->insert('tst_rnd_cpy', array(
222  'copy_id' => array('integer', $nextId),
223  'tst_fi' => array('integer', $this->testOBJ->getTestId()),
224  'qst_fi' => array('integer', $duplicateId),
225  'qpl_fi' => array('integer', $sourcePoolId)
226  ));
227 
228  $questionIdMappingPerPool[$sourcePoolId][ $row['question_id'] ] = $duplicateId;
229  }
230  }
231 
232  return $questionIdMappingPerPool;
233  }
foreach($_POST as $key=> $value) $res
$query
static _instantiateQuestion($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 19 of file class.ilTestRandomQuestionSetStagingPoolBuilder.php.

Referenced by __construct().

◆ $testOBJ

ilTestRandomQuestionSetStagingPoolBuilder::$testOBJ = null

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

Referenced by __construct().


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