ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
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  ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList
53  $question_stage = new ilTestRandomQuestionSetQuestionCollection();
54  foreach ($sourcePoolDefinitionList as $definition) {
55  $questions = $this->getSrcPoolDefRelatedQuestCollection($definition);
56  $question_stage->mergeQuestionCollection($questions);
57  }
58 
59  return $question_stage;
60  }
61 
65  return $this->buildSetQuestionCollection(
66  $definition,
68  );
69  }
70 
72  ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList
74  return $this->getSrcPoolDefListRelatedQuestCombinationCollection($sourcePoolDefinitionList)
75  ->getUniqueQuestionCollection();
76  }
77 
80  ): array {
81  $this->stagingPoolQuestionList->resetQuestionList();
82  $this->stagingPoolQuestionList->setPoolId($definition->getPoolId());
83 
84  if ($this->hasTaxonomyFilter($definition)) {
85  foreach ($definition->getMappedTaxonomyFilter() as $tax_id => $node_ids) {
86  $this->stagingPoolQuestionList->addTaxonomyFilter($tax_id, $node_ids);
87  }
88  }
89 
90  if ($definition->getLifecycleFilter() !== []) {
91  $this->stagingPoolQuestionList->setLifecycleFilter($definition->getLifecycleFilter());
92  }
93 
94  if ($this->hasTypeFilter($definition)) {
95  $this->stagingPoolQuestionList->setTypeFilter($definition->getTypeFilter());
96  }
97 
98  $this->stagingPoolQuestionList->loadQuestions();
99  return $this->stagingPoolQuestionList->getQuestions();
100  }
101 
102  private function buildSetQuestionCollection(
104  array $question_ids
106  $set_question_collection = new ilTestRandomQuestionSetQuestionCollection();
107 
108  foreach ($question_ids as $question_id) {
109  $set_question = new ilTestRandomQuestionSetQuestion();
110  $set_question->setQuestionId($question_id);
111  $set_question->setSourcePoolDefinitionId($definition->getId());
112  $set_question_collection->addQuestion($set_question);
113  }
114 
115  return $set_question_collection;
116  }
117 
118  private function hasTaxonomyFilter(
120  ): bool {
121  if ($definition->getMappedTaxonomyFilter() === []) {
122  return false;
123  }
124  return true;
125  }
126 
127  private function hasTypeFilter(
129  ): bool {
130  if ($definition->getTypeFilter() === []) {
131  return false;
132  }
133 
134  return true;
135  }
136 
137  protected function storeQuestionSet(
138  ilTestSession $test_session,
140  ): void {
141  $position = 0;
142  foreach ($question_set->getQuestions() as $set_question) {
143  $set_question->setSequencePosition($position++);
144  $this->storeQuestion($test_session, $set_question);
145  }
146  }
147 
148  private function storeQuestion(
149  ilTestSession $test_session,
150  ilTestRandomQuestionSetQuestion $set_question
151  ): void {
152  $next_id = $this->db->nextId('tst_test_rnd_qst');
153 
154  $this->db->insert('tst_test_rnd_qst', [
155  'test_random_question_id' => ['integer', $next_id],
156  'active_fi' => ['integer', $test_session->getActiveId()],
157  'question_fi' => ['integer', $set_question->getQuestionId()],
158  'sequence' => ['integer', $set_question->getSequencePosition()],
159  'pass' => ['integer', $test_session->getPass()],
160  'tstamp' => ['integer', time()],
161  'src_pool_def_fi' => ['integer', $set_question->getSourcePoolDefinitionId()]
162  ]);
163  }
164 
167  int $requiredQuestionAmount
169  return $questionStage->getRandomQuestionCollection($requiredQuestionAmount);
170  }
171 
172  protected function handleQuestionOrdering(
174  ): void {
175  if ($this->testOBJ->getShuffleQuestions()) {
176  $question_set->shuffleQuestions();
177  }
178  }
179 
180  // =================================================================================================================
181 
182  final public static function getInstance(
183  ilDBInterface $db,
185  TestLogger $logger,
186  ilObjTest $testOBJ,
187  ilTestRandomQuestionSetConfig $questionSetConfig,
188  ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList,
189  ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList
190  ) {
191  if ($questionSetConfig->isQuestionAmountConfigurationModePerPool()) {
193  $db,
194  $lng,
195  $logger,
196  $testOBJ,
197  $questionSetConfig,
198  $sourcePoolDefinitionList,
199  $stagingPoolQuestionList
200  );
201  }
202 
204  $db,
205  $lng,
206  $logger,
207  $testOBJ,
208  $questionSetConfig,
209  $sourcePoolDefinitionList,
210  $stagingPoolQuestionList
211  );
212  }
213 
214  public function getCheckMessages(): array
215  {
216  return $this->checkMessages;
217  }
218 }
getSrcPoolDefListRelatedQuestUniqueCollection(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
buildSetQuestionCollection(ilTestRandomQuestionSetSourcePoolDefinition $definition, array $question_ids)
storeQuestionSet(ilTestSession $test_session, ilTestRandomQuestionSetQuestionCollection $question_set)
fetchQuestionsFromStageRandomly(ilTestRandomQuestionSetQuestionCollection $questionStage, int $requiredQuestionAmount)
storeQuestion(ilTestSession $test_session, ilTestRandomQuestionSetQuestion $set_question)
static getInstance(ilDBInterface $db, ilLanguage $lng, TestLogger $logger, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
__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:32
performBuild(ilTestSession $testSession)
handleQuestionOrdering(ilTestRandomQuestionSetQuestionCollection $question_set)