ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilTestRandomQuestionsQuantitiesDistribution.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
28 {
33 
38 
39 
40  public function __construct(
41  private ilDBInterface $db,
42  private ilTestRandomSourcePoolDefinitionQuestionCollectionProvider $question_collection_provider,
43  private ilTestRandomQuestionSetSourcePoolDefinitionList $source_pool_definition_list
44  ) {
45  }
46 
48  {
49  $any_test_object = new ilObjTest();
50  $non_required_db = $this->db;
51  $non_used_factory = new ilTestRandomQuestionSetSourcePoolDefinitionFactory($non_required_db, $any_test_object);
52  return new ilTestRandomQuestionSetSourcePoolDefinitionList($non_required_db, $any_test_object, $non_used_factory);
53  }
54 
56  {
58  }
59 
61  {
63  }
64 
66  {
68  }
69 
71  {
72  $this->quest_related_src_pool_def_register = [];
73  }
74 
75  protected function registerQuestRelatedSrcPoolDef(
76  int $question_id,
78  ): void {
79  if (!array_key_exists($question_id, $this->quest_related_src_pool_def_register)) {
80  $this->quest_related_src_pool_def_register[$question_id] = $this->buildSourcePoolDefinitionListInstance();
81  }
82 
83  $this->quest_related_src_pool_def_register[$question_id]->addDefinition($definition);
84  }
85 
87  {
88  if (isset($this->quest_related_src_pool_def_register[$question_id])) {
89  return $this->quest_related_src_pool_def_register[$question_id];
90  }
91 
92  return null;
93  }
94 
96  {
97  $this->src_pool_def_related_quest_register = [];
98  }
99 
100  protected function registerSrcPoolDefRelatedQuest(
101  int $definition_id,
102  ilTestRandomQuestionSetQuestion $random_set_question
103  ): void {
104  if (!isset($this->src_pool_def_related_quest_register[$definition_id])) {
105  $this->src_pool_def_related_quest_register[$definition_id] = $this->buildRandomQuestionCollectionInstance();
106  }
107 
108  $this->src_pool_def_related_quest_register[$definition_id]->addQuestion($random_set_question);
109  }
110 
112  {
113  if (isset($this->src_pool_def_related_quest_register[$definition_id])) {
114  return $this->src_pool_def_related_quest_register[$definition_id];
115  }
116 
118  }
119 
120  protected function initialiseRegisters(): void
121  {
122  foreach ($this->getSrcPoolDefQuestionCombinationCollection() as $random_question) {
123  $source_pool_definition = $this->source_pool_definition_list->getDefinition(
124  $random_question->getSourcePoolDefinitionId()
125  );
126 
128  $random_question->getSourcePoolDefinitionId(),
129  $random_question
130  );
131 
132  if ($source_pool_definition && $random_question->getQuestionId()) {
134  $random_question->getQuestionId(),
135  $source_pool_definition
136  );
137  }
138  }
139  }
140 
141  protected function resetRegisters(): void
142  {
145  }
146 
148  {
149  return $this->question_collection_provider->getSrcPoolDefListRelatedQuestCombinationCollection(
150  $this->source_pool_definition_list
151  );
152  }
153 
155  {
156  $exclusive_qst_collection = $this->buildRandomQuestionCollectionInstance();
157  foreach ($this->getSrcPoolDefRelatedQuestionCollection($definition_id) as $question) {
158  if ($this->isQuestionUsedByMultipleSrcPoolDefinitions($question)) {
159  continue;
160  }
161 
162  $exclusive_qst_collection->addQuestion($question);
163  }
164  return $exclusive_qst_collection;
165  }
166 
168  {
169  return $this->getSrcPoolDefRelatedQuestionCollection($definition_id)
170  ->getRelativeComplementCollection(
171  $this->getExclusiveQuestionCollection($definition_id)
172  );
173  }
174 
176  int $this_definition_id,
177  int $that_definition_id
179  $this_def_related_shared_qst_collection = $this->getSharedQuestionCollection($this_definition_id);
180  $that_def_related_shared_qst_collection = $this->getSharedQuestionCollection($that_definition_id);
181 
182  return $this_def_related_shared_qst_collection->getIntersectionCollection(
183  $that_def_related_shared_qst_collection
184  );
185  }
186 
192  ): array {
193  $intersectionQstCollectionsByDefId = [];
194 
195  $sharedQuestionCollection = $this->getSharedQuestionCollection($definition->getId());
196  foreach ($sharedQuestionCollection as $sharedQuestion) {
197  $relatedSrcPoolDefList = $this->getQuestRelatedSrcPoolDefinitionList($sharedQuestion->getQuestionId());
198  foreach ($relatedSrcPoolDefList as $otherDefinition) {
199  if ($otherDefinition->getId() == $definition->getId()) {
200  continue;
201  }
202 
203  if (isset($intersectionQstCollectionsByDefId[$otherDefinition->getId()])) {
204  continue;
205  }
206 
207  $intersectionQuestionCollection = $this->getIntersectionQuestionCollection(
208  $definition->getId(),
209  $otherDefinition->getId()
210  );
211 
212  $intersectionQstCollectionsByDefId[$otherDefinition->getId()] = $intersectionQuestionCollection;
213  }
214  }
215 
216  return $intersectionQstCollectionsByDefId;
217  }
218 
222  $qstCollectionSubsetApplicationList = $this->buildQuestionCollectionSubsetApplicationListInstance();
223 
224  $intersectionQstCollectionByDefIdMap = $this->getIntersectionQstCollectionByDefinitionMap($definition);
225  foreach ($intersectionQstCollectionByDefIdMap as $otherDefinitionId => $intersectionCollection) {
226  /* @var ilTestRandomQuestionSetQuestionCollection $intersectionCollection */
227 
228  $qstCollectionSubsetApplication = $this->buildQuestionCollectionSubsetApplicationInstance();
229  $qstCollectionSubsetApplication->setQuestions($intersectionCollection->getQuestions());
230  $qstCollectionSubsetApplication->setApplicantId($otherDefinitionId);
231 
232  $qstCollectionSubsetApplication->setRequiredAmount(
233  $this->source_pool_definition_list->getDefinition($otherDefinitionId)->getQuestionAmount()
234  );
235 
236  $qstCollectionSubsetApplicationList->addCollectionSubsetApplication($qstCollectionSubsetApplication);
237  }
238 
239  return $qstCollectionSubsetApplicationList;
240  }
241 
245  $intersectionSharingDefinitionList = $this->buildSourcePoolDefinitionListInstance();
246 
247  $sharedQuestionCollection = $this->getSharedQuestionCollection($definition->getId());
248  foreach ($sharedQuestionCollection as $sharedQuestion) {
249  $relatedSrcPoolDefList = $this->getQuestRelatedSrcPoolDefinitionList($sharedQuestion->getQuestionId());
250  foreach ($relatedSrcPoolDefList as $otherDefinition) {
251  if ($otherDefinition->getId() == $definition->getId()) {
252  continue;
253  }
254 
255  if ($intersectionSharingDefinitionList->hasDefinition($otherDefinition->getId())) {
256  continue;
257  }
258 
259  $intersectionSharingDefinitionList->addDefinition($otherDefinition);
260  }
261  }
262 
263  return $intersectionSharingDefinitionList;
264  }
265 
267  {
268  /* @var ilTestRandomQuestionSetSourcePoolDefinitionList $qstRelatedSrcPoolDefList */
269  $qstRelatedSrcPoolDefList = $this->quest_related_src_pool_def_register[$question->getQuestionId()];
270  return $qstRelatedSrcPoolDefList->getDefinitionCount() > 1;
271  }
272 
274  {
275  return $this->getSrcPoolDefRelatedQuestionCollection($definition->getId())->getQuestionAmount();
276  }
277 
279  {
280  return $this->getExclusiveQuestionCollection($definition->getId())->getQuestionAmount();
281  }
282 
284  {
285  $intersectionSubsetApplicationList = $this->getIntersectionQuestionCollectionSubsetApplicationList($definition);
286 
287  foreach ($this->getSharedQuestionCollection($definition->getId()) as $sharedQuestion) {
288  $intersectionSubsetApplicationList->handleQuestionRequest($sharedQuestion);
289  }
290 
291  return $intersectionSubsetApplicationList->getNonReservedQuestionAmount();
292  }
293 
295  {
296  $exclusiveQstCollection = $this->getExclusiveQuestionCollection($definition->getId());
297  $missingExclsuiveQstCount = $exclusiveQstCollection->getMissingCount($definition->getQuestionAmount());
298  return $missingExclsuiveQstCount;
299  }
300 
302  {
303  return $this->getRequiredSharedQuestionAmount($definition) > 0;
304  }
305 
306 
307  public function initialise()
308  {
309  $this->initialiseRegisters();
310  }
311 
312  public function reset()
313  {
314  $this->resetRegisters();
315  }
316 
317  public function calculateQuantities(
320  $quantity_calculation = new ilTestRandomQuestionsSrcPoolDefinitionQuantitiesCalculation($definition);
321  $quantity_calculation->setOverallQuestionAmount($this->getSrcPoolDefRelatedQuestionAmount($definition));
322  $quantity_calculation->setExclusiveQuestionAmount($this->getExclusiveQuestionAmount($definition));
323  $quantity_calculation->setAvailableSharedQuestionAmount($this->getAvailableSharedQuestionAmount($definition));
324 
325  $quantity_calculation->setIntersectionQuantitySharingDefinitionList(
326  $this->getIntersectionSharingDefinitionList($definition)
327  );
328 
329  return $quantity_calculation;
330  }
331 }
getIntersectionQuestionCollectionSubsetApplicationList(ilTestRandomQuestionSetSourcePoolDefinition $definition)
getIntersectionQstCollectionByDefinitionMap(ilTestRandomQuestionSetSourcePoolDefinition $definition)
__construct(private ilDBInterface $db, private ilTestRandomSourcePoolDefinitionQuestionCollectionProvider $question_collection_provider, private ilTestRandomQuestionSetSourcePoolDefinitionList $source_pool_definition_list)
getRequiredSharedQuestionAmount(ilTestRandomQuestionSetSourcePoolDefinition $definition)
getIntersectionSharingDefinitionList(ilTestRandomQuestionSetSourcePoolDefinition $definition)
requiresSharedQuestions(ilTestRandomQuestionSetSourcePoolDefinition $definition)
getAvailableSharedQuestionAmount(ilTestRandomQuestionSetSourcePoolDefinition $definition)
isQuestionUsedByMultipleSrcPoolDefinitions(ilTestRandomQuestionSetQuestion $question)
calculateQuantities(ilTestRandomQuestionSetSourcePoolDefinition $definition)
getExclusiveQuestionAmount(ilTestRandomQuestionSetSourcePoolDefinition $definition)
getSrcPoolDefRelatedQuestionAmount(ilTestRandomQuestionSetSourcePoolDefinition $definition)
registerSrcPoolDefRelatedQuest(int $definition_id, ilTestRandomQuestionSetQuestion $random_set_question)
getIntersectionQuestionCollection(int $this_definition_id, int $that_definition_id)
registerQuestRelatedSrcPoolDef(int $question_id, ilTestRandomQuestionSetSourcePoolDefinition $definition)