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
|
<?php
/**
* Piwik - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugin\Dimension;
use Piwik\Piwik;
/**
* Provides metadata about dimensions for the LogDataPurger class.
*/
class DimensionMetadataProvider
{
/**
* Overrids for the result of the getActionReferenceColumnsByTable() method. Exists so Piwik
* instances can be monkey patched, in case there are idaction columns that this class does not
* naturally discover.
*
* @var array
*/
private $actionReferenceColumnsOverride;
public function __construct(array $actionReferenceColumnsOverride = array())
{
$this->actionReferenceColumnsOverride = $actionReferenceColumnsOverride;
}
/**
* Returns a list of idaction column names organized by table name. Uses dimension metadata
* to find idaction columns dynamically.
*
* Note: It is not currently possible to use the Piwik platform to add idaction columns to tables
* other than log_link_visit_action (w/o doing something unsupported), so idaction columns in
* other tables are hard coded.
*
* @return array[]
*/
public function getActionReferenceColumnsByTable()
{
$result = array(
'log_link_visit_action' => array('idaction_url',
'idaction_url_ref',
'idaction_name_ref'
),
'log_conversion' => array('idaction_url'),
'log_visit' => array('visit_exit_idaction_url',
'visit_exit_idaction_name',
'visit_entry_idaction_url',
'visit_entry_idaction_name'),
'log_conversion_item' => array('idaction_sku',
'idaction_name',
'idaction_category',
'idaction_category2',
'idaction_category3',
'idaction_category4',
'idaction_category5')
);
$dimensionIdActionColumns = $this->getVisitActionTableActionReferences();
$result['log_link_visit_action'] = array_unique(
array_merge($result['log_link_visit_action'], $dimensionIdActionColumns));
foreach ($this->actionReferenceColumnsOverride as $table => $columns) {
if (empty($result[$table])) {
$result[$table] = $columns;
} else {
$result[$table] = array_unique(array_merge($result[$table], $columns));
}
}
/**
* Triggered when detecting which log_action entries to keep. Any log tables that use the log_action
* table to reference text via an ID should add their table info so no actions that are still in use
* will be accidentally deleted.
*
* **Example**
*
* Piwik::addAction('Db.getActionReferenceColumnsByTable', function(&$result) {
* $tableNameUnprefixed = 'log_example';
* $columnNameThatReferencesIdActionInLogActionTable = 'idaction_example';
* $result[$tableNameUnprefixed] = array($columnNameThatReferencesIdActionInLogActionTable);
* });
* @param array $result
*/
Piwik::postEvent('Db.getActionReferenceColumnsByTable', array(&$result));
return $result;
}
private function getVisitActionTableActionReferences()
{
$idactionColumns = array();
foreach (ActionDimension::getAllDimensions() as $actionDimension) {
if ($this->isActionReference($actionDimension)) {
$idactionColumns[] = $actionDimension->getColumnName();
}
}
return $idactionColumns;
}
/**
* Returns `true` if the column for this dimension is a reference to the `log_action` table (ie, an "idaction column"),
* `false` if otherwise.
*
* @return bool
*/
private function isActionReference(ActionDimension $dimension)
{
try {
$dimension->getActionId();
return true;
} catch (\Exception $ex) {
return false;
}
}
}
|