Merge branch 'wip-MDL-61937-master' of git://github.com/marinaglancy/moodle
[moodle.git] / competency / classes / external / performance_helper.php
CommitLineData
476bf96f
FM
1<?php
2// This file is part of Moodle - http://moodle.org/
3//
4// Moodle is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// Moodle is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
16
17/**
18 * Performance helper.
19 *
20 * @package core_competency
21 * @copyright 2016 Frédéric Massart - FMCorz.net
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23 */
24
25namespace core_competency\external;
26defined('MOODLE_INTERNAL') || die();
27
28use core_competency\competency;
f8a6a533 29use core_competency\competency_framework;
476bf96f
FM
30
31/**
32 * Performance helper class.
33 *
34 * This tool keeps a local cache of certain items, which means that subsequent
35 * calls to get the resource will not query the database. You will want to use
36 * this when many resources could be shared and need to be queried in a loop.
37 *
38 * Note that some of these improvements can only be achieved by knowing the
39 * logic deeper in other modules. For instance we know that a competency's context
40 * is the one of its framework. This tool must be kept in sync with those APIs.
41 *
42 * @package core_competency
43 * @copyright 2016 Frédéric Massart - FMCorz.net
44 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
45 */
46class performance_helper {
47
48 /** @var \context Cache of contexts by framework ID. */
49 protected $frameworkscontexts = [];
50
51 /** @var competency_framework Cache of frameworks by framework ID. */
52 protected $frameworks = [];
53
54 /** @var \grade_scale[] Cache of scales by scale ID. */
55 protected $scales = [];
56
57 /**
58 * Get the context of a competency.
59 *
60 * @param competency $competency The competency.
61 * @return \context
62 */
63 public function get_context_from_competency(competency $competency) {
9c91a959 64 $frameworkid = $competency->get('competencyframeworkid');
476bf96f
FM
65 if (!isset($this->frameworkscontexts[$frameworkid])) {
66 $framework = $this->get_framework_from_competency($competency);
67 $this->frameworkscontexts[$frameworkid] = $framework->get_context();
68 }
69 return $this->frameworkscontexts[$frameworkid];
70 }
71
72 /**
73 * Get the framework of a competency.
74 *
75 * @param competency $competency The competency.
76 * @return competency_framework
77 */
78 public function get_framework_from_competency(competency $competency) {
9c91a959 79 $frameworkid = $competency->get('competencyframeworkid');
476bf96f
FM
80 if (!isset($this->frameworks[$frameworkid])) {
81 $this->frameworks[$frameworkid] = $competency->get_framework();
82 }
83 return $this->frameworks[$frameworkid];
84 }
85
86 /**
87 * Get the scale of a competency.
88 *
89 * /!\ Make sure that this is always kept in sync with:
90 * - core_competency\competency::get_scale()
91 * - core_competency\competency_framework::get_scale()
92 *
93 * @param competency $competency The competency.
94 * @return \grade_scale
95 */
96 public function get_scale_from_competency(competency $competency) {
9c91a959 97 $scaleid = $competency->get('scaleid');
476bf96f
FM
98 if ($scaleid !== null && !isset($this->scales[$scaleid])) {
99 $this->scales[$scaleid] = $competency->get_scale();
100
101 } else if ($scaleid === null) {
102 $framework = $this->get_framework_from_competency($competency);
9c91a959 103 $scaleid = $framework->get('scaleid');
476bf96f
FM
104 if (!isset($this->scales[$scaleid])) {
105 $this->scales[$scaleid] = $framework->get_scale();
106 }
107 }
108
109 return $this->scales[$scaleid];
110 }
111
f8a6a533
FM
112 /**
113 * Ingest a framework to avoid additional fetching.
114 *
115 * @param competency_framework $framework The framework.
116 * @return void
117 */
118 public function ingest_framework(competency_framework $framework) {
119 $id = $framework->get('id');
120 $this->frameworks[$id] = $framework;
121 }
122
476bf96f 123}