Skip to content
Extraits de code Groupes Projets
Valider c34bbad1 rédigé par mattab's avatar mattab
Parcourir les fichiers

refs #472 Adding secondaryDimension parameter to the Events API + Tests

parent ccbd9ccf
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -9,8 +9,8 @@
namespace Piwik\Plugins\Events;
use Piwik\Archive;
use Piwik\DataTable\Row;
use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Metrics;
use Piwik\Piwik;
......@@ -22,16 +22,28 @@ use Piwik\Piwik;
*/
class API extends \Piwik\Plugin\API
{
protected $mappingApiToApiLoadsubtables = array(
'getCategory' => 'getActionFromCategoryId',
'getAction' => 'getNameFromActionId',
'getName' => 'getActionFromNameId',
protected $defaultMappingApiToSecondaryDimension = array(
'getCategory' => 'eventAction',
'getAction' => 'eventName',
'getName' => 'eventAction',
);
protected $mappingApiToRecord = array(
'getCategory' => Archiver::EVENTS_CATEGORY_ACTION_RECORD_NAME,
'getAction' => Archiver::EVENTS_ACTION_NAME_RECORD_NAME,
'getName' => Archiver::EVENTS_NAME_ACTION_RECORD_NAME,
'getCategory' =>
array(
'eventAction' => Archiver::EVENTS_CATEGORY_ACTION_RECORD_NAME,
'eventName' => Archiver::EVENTS_CATEGORY_NAME_RECORD_NAME,
),
'getAction' =>
array(
'eventName' => Archiver::EVENTS_ACTION_NAME_RECORD_NAME,
'eventCategory' => Archiver::EVENTS_ACTION_CATEGORY_RECORD_NAME,
),
'getName' =>
array(
'eventAction' => Archiver::EVENTS_NAME_ACTION_RECORD_NAME,
'eventCategory' => Archiver::EVENTS_NAME_CATEGORY_RECORD_NAME,
),
'getActionFromCategoryId' => Archiver::EVENTS_CATEGORY_ACTION_RECORD_NAME,
'getNameFromCategoryId' => Archiver::EVENTS_CATEGORY_NAME_RECORD_NAME,
'getCategoryFromActionId' => Archiver::EVENTS_ACTION_CATEGORY_RECORD_NAME,
......@@ -43,84 +55,131 @@ class API extends \Piwik\Plugin\API
/**
* @ignore
*/
public function getSubtableAction($apiMethod)
public function getActionToLoadSubtables($apiMethod)
{
return $this->mappingApiToApiLoadsubtables[$apiMethod];
$secondaryDimension = $this->getDefaultSecondaryDimension($apiMethod);
$recordName = $this->getRecordNameForAction($apiMethod, $secondaryDimension);
return array_search( $recordName, $this->mappingApiToRecord );
}
protected function getRecordNameForAction($apiMethod)
protected function getDefaultSecondaryDimension($apiMethod)
{
return $this->mappingApiToRecord[$apiMethod];
if(isset($this->defaultMappingApiToSecondaryDimension[$apiMethod])) {
return $this->defaultMappingApiToSecondaryDimension[$apiMethod];
}
return false;
}
protected function getDataTable($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null)
protected function getRecordNameForAction($apiMethod, $secondaryDimension = false)
{
Piwik::checkUserHasViewAccess($idSite);
$dataTable = Archive::getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded, $idSubtable);
$dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS));
$dataTable->queueFilter('ReplaceColumnNames');
$dataTable->queueFilter('ReplaceSummaryRowLabel');
$dataTable->filter(function (DataTable $table) {
$row = $table->getRowFromLabel(Archiver::EVENT_NAME_NOT_SET);
if($row) {
$row->setColumn('label', Piwik::translate(Archiver::EVENT_NAME_NOT_SET));
if (empty($secondaryDimension)) {
$record = $this->mappingApiToRecord[$apiMethod];
if(!is_array($record)) {
return $record;
}
});
$secondaryDimension = $this->getDefaultSecondaryDimension($apiMethod);
}
// add processed metric avg_event_value
$dataTable->queueFilter('ColumnCallbackAddColumnQuotient',
array('avg_event_value',
'sum_event_value',
'nb_events_with_value',
$precision = 2,
$shouldSkipRows = true)
);
return $this->mappingApiToRecord[$apiMethod][$secondaryDimension];
}
protected function checkSecondaryDimension($apiMethod, $secondaryDimension)
{
if (empty($secondaryDimension)) {
return;
}
$isSecondaryDimensionValid =
isset($this->mappingApiToRecord[$apiMethod])
&& isset($this->mappingApiToRecord[$apiMethod][$secondaryDimension]);
if (!$isSecondaryDimensionValid) {
throw new \Exception(
"Secondary dimension '$secondaryDimension' is not valid for the API $apiMethod. ".
"Use one of: " . implode(", ", array_keys($this->mappingApiToRecord[$apiMethod]))
);
}
}
protected function getDataTable($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null, $secondaryDimension = false)
{
Piwik::checkUserHasViewAccess($idSite);
$this->checkSecondaryDimension($name, $secondaryDimension);
$recordName = $this->getRecordNameForAction($name, $secondaryDimension);
$dataTable = Archive::getDataTableFromArchive($recordName, $idSite, $period, $date, $segment, $expanded, $idSubtable);
$this->filterDataTable($dataTable);
return $dataTable;
}
public function getCategory($idSite, $period, $date, $segment = false, $expanded = false)
public function getCategory($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
}
public function getAction($idSite, $period, $date, $segment = false, $expanded = false)
public function getAction($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
}
public function getName($idSite, $period, $date, $segment = false, $expanded = false)
public function getName($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
}
public function getActionFromCategoryId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getNameFromCategoryId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getCategoryFromActionId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getNameFromActionId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getActionFromNameId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getCategoryFromNameId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable($this->getRecordNameForAction(__FUNCTION__), $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
/**
* @param DataTable $dataTable
*/
protected function filterDataTable($dataTable)
{
$dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS));
$dataTable->queueFilter('ReplaceColumnNames');
$dataTable->queueFilter('ReplaceSummaryRowLabel');
$dataTable->filter(function (DataTable $table) {
$row = $table->getRowFromLabel(Archiver::EVENT_NAME_NOT_SET);
if ($row) {
$row->setColumn('label', Piwik::translate('General_NotDefined', Piwik::translate('Events_EventName')));
}
});
// add processed metric avg_event_value
$dataTable->queueFilter('ColumnCallbackAddColumnQuotient',
array('avg_event_value',
'sum_event_value',
'nb_events_with_value',
$precision = 2,
$shouldSkipRows = true)
);
}
}
\ No newline at end of file
......@@ -68,7 +68,7 @@ class Archiver extends \Piwik\Plugin\Archiver
const EVENTS_ACTION_NAME_RECORD_NAME = 'Events_action_name';
const EVENTS_NAME_ACTION_RECORD_NAME = 'Events_name_action';
const EVENTS_NAME_CATEGORY_RECORD_NAME = 'Events_name_category';
const EVENT_NAME_NOT_SET = 'Events_NameNotSet';
const EVENT_NAME_NOT_SET = 'Piwik_EventNameNotSet';
/**
* @var DataArray[]
......@@ -86,12 +86,12 @@ class Archiver extends \Piwik\Plugin\Archiver
protected function getRecordToDimensions()
{
return array(
self::EVENTS_CATEGORY_ACTION_RECORD_NAME => array("event_category", "event_action"),
self::EVENTS_CATEGORY_NAME_RECORD_NAME => array("event_category", "event_name"),
self::EVENTS_ACTION_NAME_RECORD_NAME => array("event_action", "event_name"),
self::EVENTS_ACTION_CATEGORY_RECORD_NAME => array("event_action", "event_category"),
self::EVENTS_NAME_ACTION_RECORD_NAME => array("event_name", "event_action"),
self::EVENTS_NAME_CATEGORY_RECORD_NAME => array("event_name", "event_category"),
self::EVENTS_CATEGORY_ACTION_RECORD_NAME => array("eventCategory", "eventAction"),
self::EVENTS_CATEGORY_NAME_RECORD_NAME => array("eventCategory", "eventName"),
self::EVENTS_ACTION_NAME_RECORD_NAME => array("eventAction", "eventName"),
self::EVENTS_ACTION_CATEGORY_RECORD_NAME => array("eventAction", "eventCategory"),
self::EVENTS_NAME_ACTION_RECORD_NAME => array("eventName", "eventAction"),
self::EVENTS_NAME_CATEGORY_RECORD_NAME => array("eventName", "eventCategory"),
);
}
......@@ -116,9 +116,9 @@ class Archiver extends \Piwik\Plugin\Archiver
protected function aggregateDayEvents()
{
$select = "
log_action_event_category.name as event_category,
log_action_event_action.name as event_action,
log_action_event_name.name as event_name,
log_action_event_category.name as eventCategory,
log_action_event_action.name as eventAction,
log_action_event_name.name as eventName,
count(distinct log_link_visit_action.idvisit) as `" . Metrics::INDEX_NB_VISITS . "`,
count(distinct log_link_visit_action.idvisitor) as `" . Metrics::INDEX_NB_UNIQ_VISITORS . "`,
......@@ -171,7 +171,7 @@ class Archiver extends \Piwik\Plugin\Archiver
if ($rankingQueryLimit > 0) {
$rankingQuery = new RankingQuery($rankingQueryLimit);
$rankingQuery->setOthersLabel(DataTable::LABEL_SUMMARY_ROW);
$rankingQuery->addLabelColumn(array('event_category', 'event_action', 'event_name'));
$rankingQuery->addLabelColumn(array('eventCategory', 'eventAction', 'eventName'));
$rankingQuery->addColumn(array(Metrics::INDEX_NB_UNIQ_VISITORS));
$rankingQuery->addColumn(array(Metrics::INDEX_EVENT_NB_HITS, Metrics::INDEX_NB_VISITS, Metrics::INDEX_EVENT_NB_HITS_WITH_VALUE), 'sum');
$rankingQuery->addColumn(Metrics::INDEX_EVENT_SUM_EVENT_VALUE, 'sum');
......@@ -242,7 +242,7 @@ class Archiver extends \Piwik\Plugin\Archiver
$mainLabel = $row[$mainDimension];
// Event name is optional
if ($mainDimension == 'event_name'
if ($mainDimension == 'eventName'
&& empty($mainLabel)) {
$mainLabel = self::EVENT_NAME_NOT_SET;
}
......
......@@ -151,7 +151,7 @@ class Events extends \Piwik\Plugin
'metrics' => $metrics,
'metricsDocumentation' => $documentation,
'processedMetrics' => false,
'actionToLoadSubTables' => API::getInstance()->getSubtableAction($action),
'actionToLoadSubTables' => API::getInstance()->getActionToLoadSubtables($action),
'order' => $order++
);
......@@ -220,7 +220,7 @@ class Events extends \Piwik\Plugin
$view->config->addTranslation('label', $this->getColumnTranslation($apiMethod));
$view->config->addTranslations($this->getMetricTranslations());
$view->config->columns_to_display = array('label', 'nb_events', 'sum_event_value');
$view->config->subtable_controller_action = API::getInstance()->getSubtableAction($apiMethod);
$view->config->subtable_controller_action = API::getInstance()->getActionToLoadSubtables($apiMethod);
// Creates the tooltip message for Event Value column
$tooltipCallback = function ($hits, $min, $max, $avg) {
......
......@@ -21,7 +21,6 @@
"MaxValueDocumentation": "The maximum value for this event",
"AvgValueDocumentation": "The average of all values for this event",
"EventsWithValueDocumentation": "Number of events where an Event value was set",
"NameNotSet": "(Event Name not set)",
"EventValueTooltip": "Total Event value is the sum of %s events values %s between minimum of %s and maximum of %s.",
"AvgEventValue": "Average Event value is: %s",
"TopEvents": "Top Events",
......
......@@ -58,14 +58,6 @@ class Test_Piwik_Integration_CustomEvents extends IntegrationTestCase
'setDateLastN' => false,
'testSuffix' => '')),
array($apiEventAndAction, array(
'idSite' => $idSite1,
'date' => $dateTime,
'periods' => $dayPeriod,
'segment' => "events>0",
'setDateLastN' => false,
'testSuffix' => '')
),
array($apiEventAndAction, array(
'idSite' => $idSite1,
'date' => $dateTime,
......@@ -115,6 +107,22 @@ class Test_Piwik_Integration_CustomEvents extends IntegrationTestCase
'testSuffix' => '_' . $api . '_lastN')
);
}
// Test secondary dimensions
$secondaryDimensions = array('eventCategory', 'eventAction', 'eventName');
foreach($secondaryDimensions as $secondaryDimension) {
$result[] = array(array('Events'), array(
'idSite' => $idSite1,
'date' => $dateTime,
'periods' => $periods,
'otherRequestParameters' => array(
'secondaryDimension' => $secondaryDimension
),
'setDateLastN' => false,
'testSuffix' => '_secondaryDimensionIs' . ucfirst($secondaryDimension))
);
}
return $result;
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter