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}