1<?php
2/**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 *
8 */
9namespace Piwik\Columns;
10
11use Piwik\Piwik;
12use Piwik\Plugin\ArchivedMetric;
13use Piwik\Plugin\ComputedMetric;
14
15
16/**
17 * A factory to create metrics from a dimension.
18 *
19 * @api since Piwik 3.2.0
20 */
21class DimensionMetricFactory
22{
23    /**
24     * @var Dimension
25     */
26    private $dimension = null;
27
28    /**
29     * Generates a new dimension metric factory.
30     * @param Dimension $dimension A dimension instance the created metrics should be based on.
31     */
32    public function __construct(Dimension $dimension)
33    {
34        $this->dimension = $dimension;
35    }
36
37    /**
38     * @return ArchivedMetric
39     */
40    public function createCustomMetric($metricName, $readableName, $aggregation, $documentation = '')
41    {
42        if (!$this->dimension->getDbTableName() || !$this->dimension->getColumnName()) {
43            throw new \Exception(sprintf('Cannot make metric from dimension %s because DB table or column missing', $this->dimension->getId()));
44        }
45
46        $metric = new ArchivedMetric($this->dimension, $aggregation);
47        $metric->setType($this->dimension->getType());
48        $metric->setName($metricName);
49        $metric->setTranslatedName($readableName);
50        $metric->setDocumentation($documentation);
51        $metric->setCategory($this->dimension->getCategoryId());
52
53        return $metric;
54    }
55
56    /**
57     * @return \Piwik\Plugin\ComputedMetric
58     */
59    public function createComputedMetric($metricName1, $metricName2, $aggregation)
60    {
61        // We cannot use reuse ComputedMetricFactory here as it would result in an endless loop since ComputedMetricFactory
62        // requires a MetricsList which is just being built here...
63        $metric = new ComputedMetric($metricName1, $metricName2, $aggregation);
64        $metric->setCategory($this->dimension->getCategoryId());
65        return $metric;
66    }
67
68    /**
69     * @return ArchivedMetric
70     */
71    public function createMetric($aggregation)
72    {
73        $dimension = $this->dimension;
74
75        if (!$dimension->getNamePlural()) {
76            throw new \Exception(sprintf('No metric can be created for this dimension %s automatically because no $namePlural is set.', $dimension->getId()));
77        }
78
79        $prefix = '';
80        $translatedName = $dimension->getNamePlural();
81
82        $documentation = '';
83
84        switch ($aggregation) {
85            case ArchivedMetric::AGGREGATION_COUNT;
86                $prefix = ArchivedMetric::AGGREGATION_COUNT_PREFIX;
87                $translatedName = $dimension->getNamePlural();
88                $documentation = Piwik::translate('General_ComputedMetricCountDocumentation', $dimension->getNamePlural());
89                break;
90            case ArchivedMetric::AGGREGATION_SUM;
91                $prefix = ArchivedMetric::AGGREGATION_SUM_PREFIX;
92                $translatedName = Piwik::translate('General_ComputedMetricSum', $dimension->getNamePlural());
93                $documentation  = Piwik::translate('General_ComputedMetricSumDocumentation', $dimension->getNamePlural());
94                break;
95            case ArchivedMetric::AGGREGATION_MAX;
96                $prefix = ArchivedMetric::AGGREGATION_MAX_PREFIX;
97                $translatedName = Piwik::translate('General_ComputedMetricMax', $dimension->getNamePlural());
98                $documentation  = Piwik::translate('General_ComputedMetricMaxDocumentation', $dimension->getNamePlural());
99                break;
100            case ArchivedMetric::AGGREGATION_MIN;
101                $prefix = ArchivedMetric::AGGREGATION_MIN_PREFIX;
102                $translatedName = Piwik::translate('General_ComputedMetricMin', $dimension->getNamePlural());
103                $documentation  = Piwik::translate('General_ComputedMetricMinDocumentation', $dimension->getNamePlural());
104                break;
105            case ArchivedMetric::AGGREGATION_UNIQUE;
106                $prefix = ArchivedMetric::AGGREGATION_UNIQUE_PREFIX;
107                $translatedName = Piwik::translate('General_ComputedMetricUniqueCount', $dimension->getNamePlural());
108                $documentation  = Piwik::translate('General_ComputedMetricUniqueCountDocumentation', $dimension->getNamePlural());
109                break;
110            case ArchivedMetric::AGGREGATION_COUNT_WITH_NUMERIC_VALUE;
111                $prefix = ArchivedMetric::AGGREGATION_COUNT_WITH_NUMERIC_VALUE_PREFIX;
112                $translatedName = Piwik::translate('General_ComputedMetricCountWithValue', $dimension->getName());
113                $documentation  = Piwik::translate('General_ComputedMetricCountWithValueDocumentation', $dimension->getName());
114                break;
115        }
116
117        $metricId = strtolower($dimension->getMetricId());
118
119        return $this->createCustomMetric($prefix . $metricId, $translatedName, $aggregation, $documentation);
120    }
121}