ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilTestRandomQuestionSetBuilderWithAmountPerPool.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
28 {
29  public function checkBuildable(): bool
30  {
31  $quantities_distribution = new ilTestRandomQuestionsQuantitiesDistribution(
32  $this->db,
33  $this,
34  $this->sourcePoolDefinitionList
35  );
36  $quantities_distribution->initialise();
37 
38  $is_buildable = true;
39  foreach ($this->sourcePoolDefinitionList as $definition) {
40  $quantity_calculation = $quantities_distribution->calculateQuantities($definition);
41  if ($quantity_calculation->isRequiredAmountGuaranteedAvailable()) {
42  continue;
43  }
44  $is_buildable = false;
45  $this->checkMessages[] = $quantity_calculation->getDistributionReport($this->lng);
46  }
47 
48  return $is_buildable;
49  }
50 
51  public function performBuild(ilTestSession $test_session): void
52  {
53  $question_set = new ilTestRandomQuestionSetQuestionCollection();
54 
55  foreach ($this->sourcePoolDefinitionList as $definition) {
56  $required_question_amount = $definition->getQuestionAmount();
57 
58  $actual_question_stage = $this->getSrcPoolDefRelatedQuestCollection($definition)
59  ->getRelativeComplementCollection($question_set);
60 
61  if ($actual_question_stage->isGreaterThan($required_question_amount)) {
62  $questions = $this->fetchQuestionsFromStageRandomly($actual_question_stage, $required_question_amount);
63  } else {
64  // fau: fixRandomTestBuildable - log missing questions for a random test rule
65  if ($actual_question_stage->isSmallerThan($required_question_amount)) {
66  if (!isset($translator)) {
67  $translator = new ilTestQuestionFilterLabelTranslator($this->db, $this->lng);
68  $translator->loadLabels($this->sourcePoolDefinitionList);
69  }
70  $this->logger->info("RANDOM TEST: missing questions for: "
71  . implode(" - ", [$definition->getPoolTitle(), $translator->getTaxonomyFilterLabel($definition->getMappedTaxonomyFilter())]));
72  }
73  // fau.
74  $questions = $actual_question_stage;
75  }
76 
77  $question_set->mergeQuestionCollection($questions);
78  }
79 
80  $required_question_amount = $this->sourcePoolDefinitionList->getQuestionAmount();
81  if ($question_set->isSmallerThan($required_question_amount)) {
82  $question_set->mergeQuestionCollection(
84  $this->getSrcPoolDefListRelatedQuestUniqueCollection($this->sourcePoolDefinitionList)
85  ->getRelativeComplementCollection($question_set),
86  $question_set->getMissingCount($required_question_amount)
87  )
88  );
89  }
90 
91  $this->handleQuestionOrdering($question_set);
92 
93  $this->storeQuestionSet($test_session, $question_set);
94  }
95 }
getSrcPoolDefListRelatedQuestUniqueCollection(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
storeQuestionSet(ilTestSession $test_session, ilTestRandomQuestionSetQuestionCollection $question_set)
fetchQuestionsFromStageRandomly(ilTestRandomQuestionSetQuestionCollection $questionStage, int $requiredQuestionAmount)
getSrcPoolDefRelatedQuestCollection(ilTestRandomQuestionSetSourcePoolDefinition $definition)
handleQuestionOrdering(ilTestRandomQuestionSetQuestionCollection $question_set)