ILIAS  trunk Revision v11.0_alpha-1753-gb21ca8c4367
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
class.ilTestRandomQuestionSetBuilder.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
30 {
31  protected $checkMessages = [];
32 
33  protected function __construct(
34  protected ilDBInterface $db,
35  protected ilLanguage $lng,
36  protected TestLogger $logger,
37  protected ilObjTest $testOBJ,
38  protected ilTestRandomQuestionSetConfig $questionSetConfig,
39  protected ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList,
40  protected ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList
41  ) {
42  $this->stagingPoolQuestionList->setTestObjId($this->testOBJ->getId());
43  $this->stagingPoolQuestionList->setTestId($this->testOBJ->getTestId());
44  }
45 
46  abstract public function checkBuildable();
47 
48  abstract public function performBuild(ilTestSession $testSession);
49 
51  {
52  $questionStage = new ilTestRandomQuestionSetQuestionCollection();
53 
54  foreach ($sourcePoolDefinitionList as $definition) {
55  $questions = $this->getSrcPoolDefRelatedQuestCollection($definition);
56  $questionStage->mergeQuestionCollection($questions);
57  }
58 
59  return $questionStage;
60  }
61 
67  {
68  $questionIds = $this->getQuestionIdsForSourcePoolDefinitionIds($definition);
69  $questionStage = $this->buildSetQuestionCollection($definition, $questionIds);
70 
71  return $questionStage;
72  }
73 
74  // hey: fixRandomTestBuildable - rename/public-access to be aware for building interface
80  {
81  $combinationCollection = $this->getSrcPoolDefListRelatedQuestCombinationCollection($sourcePoolDefinitionList);
82  return $combinationCollection->getUniqueQuestionCollection();
83  }
84  // hey.
85 
87  {
88  $this->stagingPoolQuestionList->resetQuestionList();
89 
90  $this->stagingPoolQuestionList->setPoolId($definition->getPoolId());
91 
92  if ($this->hasTaxonomyFilter($definition)) {
93  foreach ($definition->getMappedTaxonomyFilter() as $taxId => $nodeIds) {
94  $this->stagingPoolQuestionList->addTaxonomyFilter($taxId, $nodeIds);
95  }
96  }
97 
98  if (count($definition->getLifecycleFilter())) {
99  $this->stagingPoolQuestionList->setLifecycleFilter($definition->getLifecycleFilter());
100  }
101 
102  // fau: taxFilter/typeFilter - use type filter
103  if ($this->hasTypeFilter($definition)) {
104  $this->stagingPoolQuestionList->setTypeFilter($definition->getTypeFilter());
105  }
106  // fau.
107 
108  $this->stagingPoolQuestionList->loadQuestions();
109 
110  return $this->stagingPoolQuestionList->getQuestions();
111  }
112 
114  {
115  $setQuestionCollection = new ilTestRandomQuestionSetQuestionCollection();
116 
117  foreach ($questionIds as $questionId) {
118  $setQuestion = new ilTestRandomQuestionSetQuestion();
119 
120  $setQuestion->setQuestionId($questionId);
121  $setQuestion->setSourcePoolDefinitionId($definition->getId());
122 
123  $setQuestionCollection->addQuestion($setQuestion);
124  }
125 
126  return $setQuestionCollection;
127  }
128 
130  {
131  if (!count($definition->getMappedTaxonomyFilter())) {
132  return false;
133  }
134  return true;
135  }
136 
137  // fau: typeFilter - check for existing type filter
138  private function hasTypeFilter(ilTestRandomQuestionSetSourcePoolDefinition $definition): bool
139  {
140  if (count($definition->getTypeFilter())) {
141  return true;
142  }
143 
144  return false;
145  }
146  // fau.
147 
148  protected function storeQuestionSet(ilTestSession $testSession, $questionSet)
149  {
150  $position = 0;
151 
152  foreach ($questionSet->getQuestions() as $setQuestion) {
153  /* @var ilTestRandomQuestionSetQuestion $setQuestion */
154 
155  $setQuestion->setSequencePosition($position++);
156 
157  $this->storeQuestion($testSession, $setQuestion);
158  }
159  }
160 
161  private function storeQuestion(ilTestSession $testSession, ilTestRandomQuestionSetQuestion $setQuestion)
162  {
163  $nextId = $this->db->nextId('tst_test_rnd_qst');
164 
165  $this->db->insert('tst_test_rnd_qst', [
166  'test_random_question_id' => ['integer', $nextId],
167  'active_fi' => ['integer', $testSession->getActiveId()],
168  'question_fi' => ['integer', $setQuestion->getQuestionId()],
169  'sequence' => ['integer', $setQuestion->getSequencePosition()],
170  'pass' => ['integer', $testSession->getPass()],
171  'tstamp' => ['integer', time()],
172  'src_pool_def_fi' => ['integer', $setQuestion->getSourcePoolDefinitionId()]
173  ]);
174  }
175 
177  {
178  $questionSet = $questionStage->getRandomQuestionCollection($requiredQuestionAmount);
179 
180  return $questionSet;
181  }
182 
184  {
185  if ($this->testOBJ->getShuffleQuestions()) {
186  $questionSet->shuffleQuestions();
187  }
188  }
189 
190  // =================================================================================================================
191 
192  final public static function getInstance(
193  ilDBInterface $db,
195  TestLogger $logger,
196  ilObjTest $testOBJ,
197  ilTestRandomQuestionSetConfig $questionSetConfig,
198  ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList,
199  ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList
200  ) {
201  if ($questionSetConfig->isQuestionAmountConfigurationModePerPool()) {
203  $db,
204  $lng,
205  $logger,
206  $testOBJ,
207  $questionSetConfig,
208  $sourcePoolDefinitionList,
209  $stagingPoolQuestionList
210  );
211  }
212 
214  $db,
215  $lng,
216  $logger,
217  $testOBJ,
218  $questionSetConfig,
219  $sourcePoolDefinitionList,
220  $stagingPoolQuestionList
221  );
222  }
223 
224  //fau: fixRandomTestBuildable - function to get messages
228  public function getCheckMessages(): array
229  {
230  return $this->checkMessages;
231  }
232  // fau.
233 }
getSrcPoolDefListRelatedQuestUniqueCollection(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
static getInstance(ilDBInterface $db, ilLanguage $lng, TestLogger $logger, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
handleQuestionOrdering(ilTestRandomQuestionSetQuestionCollection $questionSet)
buildSetQuestionCollection(ilTestRandomQuestionSetSourcePoolDefinition $definition, $questionIds)
__construct(protected ilDBInterface $db, protected ilLanguage $lng, protected TestLogger $logger, protected ilObjTest $testOBJ, protected ilTestRandomQuestionSetConfig $questionSetConfig, protected ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, protected ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
getQuestionIdsForSourcePoolDefinitionIds(ilTestRandomQuestionSetSourcePoolDefinition $definition)
hasTypeFilter(ilTestRandomQuestionSetSourcePoolDefinition $definition)
getSrcPoolDefRelatedQuestCollection(ilTestRandomQuestionSetSourcePoolDefinition $definition)
hasTaxonomyFilter(ilTestRandomQuestionSetSourcePoolDefinition $definition)
getSrcPoolDefListRelatedQuestCombinationCollection(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
global $lng
Definition: privfeed.php:31
fetchQuestionsFromStageRandomly(ilTestRandomQuestionSetQuestionCollection $questionStage, $requiredQuestionAmount)
performBuild(ilTestSession $testSession)
storeQuestionSet(ilTestSession $testSession, $questionSet)
storeQuestion(ilTestSession $testSession, ilTestRandomQuestionSetQuestion $setQuestion)