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
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://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;
}
}
}
|