1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetBuilder.php';
5
6/**
7 * @author		Björn Heyser <bheyser@databay.de>
8 * @version		$Id$
9 *
10 * @package     Modules/Test
11 */
12class ilTestRandomQuestionSetBuilderWithAmountPerPool extends ilTestRandomQuestionSetBuilder
13{
14    // hey: fixRandomTestBuildable - improvment of improved pass build check
15    /**
16     * @return bool
17     */
18    public function checkBuildableNewer()
19    {
20        global $DIC; /* @var ILIAS\DI\Container $DIC */
21        $lng = $DIC['lng'];
22
23        $isBuildable = true;
24
25        require_once 'Modules/Test/classes/class.ilTestRandomQuestionsQuantitiesDistribution.php';
26        $quantitiesDistribution = new ilTestRandomQuestionsQuantitiesDistribution($this);
27        $quantitiesDistribution->setSourcePoolDefinitionList($this->sourcePoolDefinitionList);
28        $quantitiesDistribution->initialise();
29
30        // perhaps not every with every BUT every with any next ??!
31        // perhaps exactly like this !!? I dont know :-)
32        // it should be about vice versa rule conflict reporting
33
34        foreach ($this->sourcePoolDefinitionList as $definition) {
35            /** @var ilTestRandomQuestionSetSourcePoolDefinition $definition */
36
37            $quantityCalculation = $quantitiesDistribution->calculateQuantities($definition);
38
39            if ($quantityCalculation->isRequiredAmountGuaranteedAvailable()) {
40                continue;
41            }
42
43            $isBuildable = false;
44
45            $this->checkMessages[] = $quantityCalculation->getDistributionReport($lng);
46        }
47
48        return $isBuildable;
49    }
50    // hey.
51
52    /**
53     * @return bool
54     */
55    public function checkBuildable()
56    {
57        // hey: fixRandomTestBuildable - improved the buildable check improvement
58        return $this->checkBuildableNewer();
59        // hey.
60
61        $questionStage = $this->getSrcPoolDefListRelatedQuestUniqueCollection($this->sourcePoolDefinitionList);
62
63        if ($questionStage->isSmallerThan($this->sourcePoolDefinitionList->getQuestionAmount())) {
64            return false;
65        }
66
67        return true;
68    }
69
70    public function performBuild(ilTestSession $testSession)
71    {
72        $questionSet = new ilTestRandomQuestionSetQuestionCollection();
73
74        foreach ($this->sourcePoolDefinitionList as $definition) {
75            /** @var ilTestRandomQuestionSetSourcePoolDefinition $definition */
76
77            $requiredQuestionAmount = $definition->getQuestionAmount();
78
79            $potentialQuestionStage = $this->getSrcPoolDefRelatedQuestCollection($definition);
80
81            $actualQuestionStage = $potentialQuestionStage->getRelativeComplementCollection($questionSet);
82
83            if ($actualQuestionStage->isGreaterThan($requiredQuestionAmount)) {
84                $questions = $this->fetchQuestionsFromStageRandomly($actualQuestionStage, $requiredQuestionAmount);
85            } else {
86                // fau: fixRandomTestBuildable - log missing questions for a random test rule
87                if ($actualQuestionStage->isSmallerThan($requiredQuestionAmount)) {
88                    global $DIC;
89                    $ilDB = $DIC['ilDB'];
90                    $ilLog = $DIC['ilLog'];
91                    if (!isset($translator)) {
92                        require_once("./Modules/Test/classes/class.ilTestTaxonomyFilterLabelTranslater.php");
93                        $translator = new ilTestTaxonomyFilterLabelTranslater($ilDB);
94                        $translator->loadLabels($this->sourcePoolDefinitionList);
95                    }
96                    $ilLog->write("RANDOM TEST: missing questions for: "
97                        . implode(" - ", array($definition->getPoolTitle(), $translator->getTaxonomyFilterLabel($definition->getMappedTaxonomyFilter()))));
98                }
99                // fau.
100                $questions = $actualQuestionStage;
101            }
102
103            $questionSet->mergeQuestionCollection($questions);
104        }
105
106        $requiredQuestionAmount = $this->sourcePoolDefinitionList->getQuestionAmount();
107
108        if ($questionSet->isSmallerThan($requiredQuestionAmount)) {
109            $missingQuestionCount = $questionSet->getMissingCount($requiredQuestionAmount);
110            // fau: fixRandomTestBuildable - avoid already chosen questions being used as fillers
111            $potentialQuestionStage = $this->getSrcPoolDefListRelatedQuestUniqueCollection($this->sourcePoolDefinitionList);
112            $actualQuestionStage = $potentialQuestionStage->getRelativeComplementCollection($questionSet);
113            $questions = $this->fetchQuestionsFromStageRandomly($actualQuestionStage, $missingQuestionCount);
114            // fau.
115            $questionSet->mergeQuestionCollection($questions);
116        }
117
118        $this->handleQuestionOrdering($questionSet);
119
120        $this->storeQuestionSet($testSession, $questionSet);
121    }
122}
123