blob: 82ea86065ef7b86f5ea530bd72186efaff65542f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Segment;
use Piwik\Cache;
use Piwik\CacheId;
use Piwik\Columns\Dimension;
use Piwik\Columns\DimensionSegmentFactory;
use Piwik\Piwik;
use Piwik\Plugin\Segment;
/**
* Manages the global list of segments that can be used.
*
* Segments are added automatically by dimensions as well as through the {@hook Segment.addSegments} event.
* Observers for this event should call the {@link addSegment()} method to add segments or use any of the other
* methods to remove segments.
*
* @api since Piwik 4.0.0
*/
class SegmentsList
{
/**
* List of segments
*
* @var Segment[]
*/
private $segments = array();
private $segmentsByNameCache = array();
/**
* @param Segment $segment
*/
public function addSegment(Segment $segment)
{
$this->segments[] = $segment;
$this->segmentsByNameCache = array();
}
/**
* Get all available segments.
*
* @return Segment[]
*/
public function getSegments()
{
return $this->segments;
}
/**
* Removes one or more segments from the segments list.
*
* @param string $segmentCategory The segment category id. Can be a translation token eg 'General_Visits'
* see {@link Segment::getCategoryId()}.
* @param string|false $segmentExpression The segment expression name to remove eg 'pageUrl'.
* If not supplied, all segments within that category will be removed.
*/
public function remove($segmentCategory, $segmentExpression = false)
{
foreach ($this->segments as $index => $segment) {
if ($segment->getCategoryId() === $segmentCategory) {
if (!$segmentExpression || $segment->getSegment() === $segmentExpression) {
unset($this->segments[$index]);
$this->segmentsByNameCache = array();
}
}
}
}
/**
* @param string $segmentExpression Name of the segment expression. eg `pageUrl`
* @return Segment|null
*/
public function getSegment($segmentExpression)
{
if (empty($this->segmentsByNameCache)) {
foreach ($this->segments as $index => $segment) {
$this->segmentsByNameCache[$segment->getSegment()] = $segment;
}
}
if (!empty($this->segmentsByNameCache[$segmentExpression])) {
return $this->segmentsByNameCache[$segmentExpression];
}
return null;
}
/**
* Get all metrics defined in the Piwik platform.
* @ignore
* @return static
*/
public static function get()
{
$cache = Cache::getTransientCache();
$cacheKey = CacheId::siteAware('SegmentsList');
if ($cache->contains($cacheKey)) {
return $cache->fetch($cacheKey);
}
$list = new static;
/**
* Triggered to add custom segment definitions.
*
* **Example**
*
* public function addSegments(&$segments)
* {
* $segment = new Segment();
* $segment->setSegment('my_segment_name');
* $segment->setType(Segment::TYPE_DIMENSION);
* $segment->setName('My Segment Name');
* $segment->setSqlSegment('log_table.my_segment_name');
* $segments[] = $segment;
* }
*
* @param SegmentsList $list An instance of the SegmentsList. You can add segments to the list this way.
*/
Piwik::postEvent('Segment.addSegments', array($list));
foreach (Dimension::getAllDimensions() as $dimension) {
$dimension->configureSegments($list, new DimensionSegmentFactory($dimension));
}
$cache->save($cacheKey, $list);
return $list;
}
}
|