ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilTestRandomQuestionSetPoolDeriver.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
28 {
29  protected ilDBInterface $db;
31  protected ilObjTest $testOBJ;
33 
38 
42  protected $ownerId;
43 
48 
49  public function __construct(ilDBInterface $ilDB, ilComponentRepository $component_repository, ilObjTest $testOBJ)
50  {
51  $this->db = $ilDB;
52  $this->component_repository = $component_repository;
53  $this->testOBJ = $testOBJ;
54  $this->poolFactory = new ilQuestionPoolFactory();
55  }
56 
60  public function getTargetContainerRef(): int
61  {
63  }
64 
69  {
70  $this->targetContainerRef = $targetContainerRef;
71  }
72 
76  public function getOwnerId(): int
77  {
78  return $this->ownerId;
79  }
80 
84  public function setOwnerId($ownerId)
85  {
86  $this->ownerId = $ownerId;
87  }
88 
93  {
95  }
96 
101  {
102  $this->sourcePoolDefinitionList = $sourcePoolDefinitionList;
103  }
104 
105  protected function getQuestionsForPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool): array
106  {
108  $this->db,
109  $this->component_repository
110  );
111 
112  $questionList->setTestObjId($this->testOBJ->getId());
113  $questionList->setTestId($this->testOBJ->getTestId());
114  $questionList->setPoolId($nonAvailablePool->getId());
115 
116  $questionList->loadQuestions();
117 
118  $questions = array();
119  $list = $questionList->getQuestions();
120  foreach ($list as $questionId) {
121  $questions[] = assQuestion::instantiateQuestion($questionId);
122  }
123 
124  return $questions;
125  }
126 
128  {
129  $pool = $this->poolFactory->createNewInstance($this->getTargetContainerRef());
130 
131  if (strlen($nonAvailablePool->getTitle())) {
132  $pool->setTitle($nonAvailablePool->getTitle());
133  $pool->update();
134  }
135 
136  return $pool;
137  }
138 
139  protected function copyQuestionsToPool(ilObjQuestionPool $pool, $questions): array
140  {
141  $poolQidByTestQidMap = array();
142 
143  foreach ($questions as $questionOBJ) {
144  /* @var assQuestion $questionOBJ */
145 
146  $testQuestionId = $questionOBJ->getId();
147  $poolQuestionId = $questionOBJ->duplicate(false, '', '', $this->getOwnerId(), $pool->getId());
148 
149  $poolQidByTestQidMap[$testQuestionId] = $poolQuestionId;
150  }
151 
152  return $poolQidByTestQidMap;
153  }
154 
155  protected function updateTestQuestionStage($poolQidByTestQidMap)
156  {
157  foreach ($poolQidByTestQidMap as $testQid => $poolQid) {
159  assQuestion::saveOriginalId($testQid, $poolQid);
160  }
161  }
162 
163  protected function filterForQuestionRelatedTaxonomies($taxonomyIds, $relatedQuestionIds): array
164  {
165  $filteredTaxIds = array();
166 
167  foreach ($taxonomyIds as $taxonomyId) {
168  $taxNodeAssignment = new ilTaxNodeAssignment(
169  $this->testOBJ->getType(),
170  $this->testOBJ->getId(),
171  'quest',
172  $taxonomyId
173  );
174 
175  foreach ($relatedQuestionIds as $questionId) {
176  $assignedTaxNodes = $taxNodeAssignment->getAssignmentsOfItem($questionId);
177 
178  if (count($assignedTaxNodes)) {
179  $filteredTaxIds[] = $taxonomyId;
180  break;
181  }
182  }
183  }
184 
185  return $filteredTaxIds;
186  }
187 
188  protected function duplicateTaxonomies($poolQidByTestQidMap, ilObjQuestionPool $pool): ilQuestionPoolDuplicatedTaxonomiesKeysMap
189  {
190  $taxDuplicator = new ilQuestionPoolTaxonomiesDuplicator();
191  $taxDuplicator->setSourceObjId($this->testOBJ->getId());
192  $taxDuplicator->setSourceObjType($this->testOBJ->getType());
193  $taxDuplicator->setTargetObjId($pool->getId());
194  $taxDuplicator->setTargetObjType($pool->getType());
195  $taxDuplicator->setQuestionIdMapping($poolQidByTestQidMap);
196 
197  $taxDuplicator->duplicate($this->filterForQuestionRelatedTaxonomies(
198  $taxDuplicator->getAllTaxonomiesForSourceObject(),
199  array_keys($poolQidByTestQidMap)
200  ));
201 
202  return $taxDuplicator->getDuplicatedTaxonomiesKeysMap();
203  }
204 
207  array $mapped_taxonomy_filter
208  ): array {
209  $original_taxonomy_filter = [];
210  foreach ($mapped_taxonomy_filter as $test_taxonomy_id => $test_tax_nodes) {
211  $pool_taxonomy_id = $taxKeysMap->getMappedTaxonomyId($test_taxonomy_id);
212  if ($pool_taxonomy_id === null) {
213  continue;
214  }
215  $original_taxonomy_filter[$pool_taxonomy_id] = [];
216 
217  foreach ($test_tax_nodes as $test_tax_node) {
218  $pool_tax_node = $taxKeysMap->getMappedTaxNodeId((int) $test_tax_node);
219  if ($pool_tax_node !== null) {
220  $original_taxonomy_filter[$pool_taxonomy_id][] = $pool_tax_node;
221  }
222  }
223  }
224 
225  return $original_taxonomy_filter;
226  }
227 
228  protected function updateRelatedSourcePoolDefinitions(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $derivedPoolId, $nonAvailablePoolId)
229  {
230  foreach ($this->getSourcePoolDefinitionList() as $definition) {
231  if ($definition->getPoolId() != $nonAvailablePoolId) {
232  continue;
233  }
234 
235  $definition->setPoolId($derivedPoolId);
236 
237  $definition->setOriginalTaxonomyFilter($this->buildOriginalTaxonomyFilterForDerivedPool(
238  $taxKeysMap,
239  $definition->getMappedTaxonomyFilter()
240  ));
241 
242  $definition->saveToDb();
243  }
244  }
245 
251  {
252  $pool = $this->createNewPool($nonAvailablePool);
253  $questions = $this->getQuestionsForPool($nonAvailablePool);
254 
255  $poolQidByTestQidMap = $this->copyQuestionsToPool($pool, $questions);
256 
257  $this->updateTestQuestionStage($poolQidByTestQidMap);
258 
259  $duplicatedTaxKeysMap = $this->duplicateTaxonomies($poolQidByTestQidMap, $pool);
260 
261  $this->updateRelatedSourcePoolDefinitions($duplicatedTaxKeysMap, $pool->getId(), $nonAvailablePool->getId());
262 
263  return $pool;
264  }
265 }
Readable part of repository interface to ilComponentDataDB.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
copyQuestionsToPool(ilObjQuestionPool $pool, $questions)
derive(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
setTitle(string $title)
static resetOriginalId(int $questionId)
static instantiateQuestion(int $question_id)
duplicateTaxonomies($poolQidByTestQidMap, ilObjQuestionPool $pool)
getQuestionsForPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
__construct(ilDBInterface $ilDB, ilComponentRepository $component_repository, ilObjTest $testOBJ)
static saveOriginalId(int $questionId, int $originalId)
getAssignmentsOfItem(int $a_item_id)
Get assignments for item.
buildOriginalTaxonomyFilterForDerivedPool(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, array $mapped_taxonomy_filter)
updateRelatedSourcePoolDefinitions(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $derivedPoolId, $nonAvailablePoolId)
createNewPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
filterForQuestionRelatedTaxonomies($taxonomyIds, $relatedQuestionIds)