Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@googlemail.com>2014-06-13 11:59:45 +0400
committerThomas Steur <thomas.steur@googlemail.com>2014-06-13 11:59:45 +0400
commitfccdcc0c2c9416a283d35feb89fa689f9a32fcae (patch)
tree8157e7430be6d69c002aaee6ed65aff28360ed81
parent83ee5a47ebf6227d7e0b898d506f230f07d9d815 (diff)
moved more logic from core to plugins
-rw-r--r--core/Db/Schema/Mysql.php13
-rw-r--r--core/Plugin/Segment.php8
-rw-r--r--core/Plugin/VisitDimension.php6
-rw-r--r--core/Tracker/Settings.php5
-rw-r--r--core/Tracker/Visit.php55
-rw-r--r--plugins/API/API.php30
-rw-r--r--plugins/Actions/Columns/EntryPageTitle.php4
-rw-r--r--plugins/Actions/Columns/EntryPageUrl.php4
-rw-r--r--plugins/Actions/Columns/ExitPageTitle.php18
-rw-r--r--plugins/Actions/Columns/ExitPageUrl.php4
-rw-r--r--plugins/Actions/Columns/VisitTotalActions.php94
-rw-r--r--plugins/Actions/Columns/VisitTotalSearches.php76
-rw-r--r--plugins/CoreHome/Columns/VisitFirstActionTime.php36
-rw-r--r--plugins/CoreHome/Columns/VisitLastActionTime.php53
-rw-r--r--plugins/CoreHome/Columns/VisitorDaysSinceFirst.php45
-rw-r--r--plugins/CoreHome/Columns/VisitorDaysSinceOrder.php41
-rw-r--r--plugins/CoreHome/Columns/VisitsCount.php45
-rw-r--r--plugins/CoreHome/Segment.php21
-rw-r--r--plugins/Events/Columns/TotalEvents.php44
-rw-r--r--plugins/UserSettings/Columns/Language.php18
-rw-r--r--plugins/UserSettings/Columns/Resolution.php20
-rw-r--r--plugins/VisitTime/Columns/Localtime.php14
-rw-r--r--plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php19
-rw-r--r--tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml14
m---------tests/PHPUnit/UI0
25 files changed, 560 insertions, 127 deletions
diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php
index ef7d87b4dd..7d1645ca2f 100644
--- a/core/Db/Schema/Mysql.php
+++ b/core/Db/Schema/Mysql.php
@@ -148,22 +148,12 @@ class Mysql implements SchemaInterface
idvisit INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
idsite INTEGER(10) UNSIGNED NOT NULL,
idvisitor BINARY(8) NOT NULL,
- visitor_localtime TIME NOT NULL,
visitor_returning TINYINT(1) NOT NULL,
- visitor_count_visits SMALLINT(5) UNSIGNED NOT NULL,
- visitor_days_since_last SMALLINT(5) UNSIGNED NOT NULL,
- visitor_days_since_order SMALLINT(5) UNSIGNED NOT NULL,
- visitor_days_since_first SMALLINT(5) UNSIGNED NOT NULL,
- visit_first_action_time DATETIME NOT NULL,
- visit_last_action_time DATETIME NOT NULL,
- visit_total_actions SMALLINT(5) UNSIGNED NOT NULL,
- visit_total_searches SMALLINT(5) UNSIGNED NOT NULL,
- visit_total_events SMALLINT(5) UNSIGNED NOT NULL,
visit_total_time SMALLINT(5) UNSIGNED NOT NULL,
visit_goal_converted TINYINT(1) NOT NULL,
visit_goal_buyer TINYINT(1) NOT NULL,
+ visit_last_action_time DATETIME NOT NULL,
config_id BINARY(8) NOT NULL,
- config_resolution VARCHAR(9) NOT NULL,
config_pdf TINYINT(1) NOT NULL,
config_flash TINYINT(1) NOT NULL,
config_java TINYINT(1) NOT NULL,
@@ -175,7 +165,6 @@ class Mysql implements SchemaInterface
config_silverlight TINYINT(1) NOT NULL,
config_cookie TINYINT(1) NOT NULL,
location_ip VARBINARY(16) NOT NULL,
- location_browser_lang VARCHAR(20) NOT NULL,
location_country CHAR(3) NOT NULL,
location_region char(2) DEFAULT NULL,
location_city varchar(255) DEFAULT NULL,
diff --git a/core/Plugin/Segment.php b/core/Plugin/Segment.php
index 52c2b04b8f..ea507f33af 100644
--- a/core/Plugin/Segment.php
+++ b/core/Plugin/Segment.php
@@ -109,6 +109,14 @@ class Segment
}
/**
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
* @param bool $permission
*/
public function setPermission($permission)
diff --git a/core/Plugin/VisitDimension.php b/core/Plugin/VisitDimension.php
index b7b3778a9e..def111f489 100644
--- a/core/Plugin/VisitDimension.php
+++ b/core/Plugin/VisitDimension.php
@@ -59,7 +59,11 @@ abstract class VisitDimension
$segment->setSqlSegment('log_visit.' . $this->fieldName);
}
- $segment->setType(Segment::TYPE_DIMENSION);
+ $type = $segment->getType();
+
+ if (empty($type)) {
+ $segment->setType(Segment::TYPE_DIMENSION);
+ }
$this->segments[] = $segment;
}
diff --git a/core/Tracker/Settings.php b/core/Tracker/Settings.php
index c40df487b3..341eb6d69b 100644
--- a/core/Tracker/Settings.php
+++ b/core/Tracker/Settings.php
@@ -33,7 +33,6 @@ class Settings
list($plugin_Flash, $plugin_Java, $plugin_Director, $plugin_Quicktime, $plugin_RealPlayer, $plugin_PDF,
$plugin_WindowsMedia, $plugin_Gears, $plugin_Silverlight, $plugin_Cookie) = $this->request->getPlugins();
- $resolution = $this->request->getParam('res');
$userAgent = $this->request->getUserAgent();
$deviceDetector = new \DeviceDetector($userAgent);
@@ -67,7 +66,6 @@ class Settings
$this->params = array(
'config_id' => $configurationHash,
- 'config_resolution' => $resolution,
'config_pdf' => $plugin_PDF,
'config_flash' => $plugin_Flash,
'config_java' => $plugin_Java,
@@ -77,8 +75,7 @@ class Settings
'config_windowsmedia' => $plugin_WindowsMedia,
'config_gears' => $plugin_Gears,
'config_silverlight' => $plugin_Silverlight,
- 'config_cookie' => $plugin_Cookie,
- 'location_browser_lang' => $browserLang,
+ 'config_cookie' => $plugin_Cookie
);
}
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index aaba4b4fa4..da374d4dab 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -300,7 +300,6 @@ class Visit implements VisitInterface
$this->visitorInfo = array_merge($this->visitorInfo, $this->visitorCustomVariables);
$this->visitorInfo['visit_goal_converted'] = $visitIsConverted ? 1 : 0;
- $this->visitorInfo['config_resolution'] = substr($this->visitorInfo['config_resolution'], 0, 9);
$dimensions = VisitDimension::getAllDimensions();
foreach ($dimensions as $dimension) {
@@ -505,22 +504,12 @@ class Visit implements VisitInterface
protected function getNewVisitorInformation($action)
{
- $actionType = false;
- if($action) {
- $actionType = $action->getActionType();
- }
-
- $daysSinceFirstVisit = $this->request->getDaysSinceFirstVisit();
$visitCount = $this->request->getVisitCount();
$daysSinceLastVisit = $this->request->getDaysSinceLastVisit();
$daysSinceLastOrder = $this->request->getDaysSinceLastOrder();
$isReturningCustomer = ($daysSinceLastOrder !== false);
- if ($daysSinceLastOrder === false) {
- $daysSinceLastOrder = 0;
- }
-
// User settings
$userInfo = $this->getSettingsObject();
$userInfo = $userInfo->getInfo();
@@ -534,28 +523,11 @@ class Visit implements VisitInterface
return array(
'idsite' => $this->request->getIdSite(),
- 'visitor_localtime' => $this->request->getLocalTime(),
'idvisitor' => $this->getVisitorIdcookie(),
'visitor_returning' => $visitorReturning,
- 'visitor_count_visits' => $visitCount,
- 'visitor_days_since_last' => $daysSinceLastVisit,
- 'visitor_days_since_order' => $daysSinceLastOrder,
- 'visitor_days_since_first' => $daysSinceFirstVisit,
- 'visit_first_action_time' => Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp()),
- 'visit_last_action_time' => Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp()),
- 'visit_total_actions' => in_array($actionType,
- array(Action::TYPE_PAGE_URL,
- Action::TYPE_DOWNLOAD,
- Action::TYPE_OUTLINK,
- Action::TYPE_SITE_SEARCH,
- Action::TYPE_EVENT))
- ? 1 : 0, // if visit starts with something else (e.g. ecommerce order), don't record as an action
- 'visit_total_searches' => $actionType == Action::TYPE_SITE_SEARCH ? 1 : 0,
- 'visit_total_events' => $actionType == Action::TYPE_EVENT ? 1 : 0,
'visit_total_time' => self::cleanupVisitTotalTime($defaultTimeOnePageVisit),
'visit_goal_buyer' => $this->goalManager->getBuyerType(),
'config_id' => $userInfo['config_id'],
- 'config_resolution' => $userInfo['config_resolution'],
'config_pdf' => $userInfo['config_pdf'],
'config_flash' => $userInfo['config_flash'],
'config_java' => $userInfo['config_java'],
@@ -567,7 +539,6 @@ class Visit implements VisitInterface
'config_silverlight' => $userInfo['config_silverlight'],
'config_cookie' => $userInfo['config_cookie'],
'location_ip' => $this->getVisitorIp(),
- 'location_browser_lang' => $userInfo['location_browser_lang'],
);
}
@@ -582,32 +553,6 @@ class Visit implements VisitInterface
{
$valuesToUpdate = array();
- if ($action) {
- $actionType = $action->getActionType();
- $idActionUrl = $action->getIdActionUrlForEntryAndExitIds();
-
- $incrementActions = false;
-
- if ($idActionUrl !== false) {
- $incrementActions = true;
- }
-
- if ($actionType == Action::TYPE_SITE_SEARCH) {
- $valuesToUpdate['visit_total_searches'] = 'visit_total_searches + 1';
- $incrementActions = true;
- } else if ($actionType == Action::TYPE_EVENT) {
- $valuesToUpdate['visit_total_events'] = 'visit_total_events + 1';
- $incrementActions = true;
- }
-
- if ($incrementActions) {
- $valuesToUpdate['visit_total_actions'] = 'visit_total_actions + 1';
- }
- }
-
- $datetimeServer = Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp());
- $valuesToUpdate['visit_last_action_time'] = $datetimeServer;
-
// Add 1 so it's always > 0
$visitTotalTime = 1 + $this->request->getCurrentTimestamp() - $this->visitorInfo['visit_first_action_time'];
$valuesToUpdate['visit_total_time'] = self::cleanupVisitTotalTime($visitTotalTime);
diff --git a/plugins/API/API.php b/plugins/API/API.php
index 61818abf69..8af6471353 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -183,21 +183,6 @@ class API extends \Piwik\Plugin\API
$segments[] = array(
'type' => 'metric',
'category' => Piwik::translate('General_Visit'),
- 'name' => 'General_NbActions',
- 'segment' => 'actions',
- 'sqlSegment' => 'log_visit.visit_total_actions',
- );
- $segments[] = array(
- 'type' => 'metric',
- 'category' => Piwik::translate('General_Visit'),
- 'name' => 'General_NbSearches',
- 'segment' => 'searches',
- 'sqlSegment' => 'log_visit.visit_total_searches',
- 'acceptedValues' => 'To select all visits who used internal Site Search, use: &segment=searches>0',
- );
- $segments[] = array(
- 'type' => 'metric',
- 'category' => Piwik::translate('General_Visit'),
'name' => 'General_ColumnVisitDuration',
'segment' => 'visitDuration',
'sqlSegment' => 'log_visit.visit_total_time',
@@ -221,21 +206,6 @@ class API extends \Piwik\Plugin\API
'sqlSegment' => 'log_visit.visitor_days_since_last',
);
$segments[] = array(
- 'type' => 'metric',
- 'category' => Piwik::translate('General_Visit'),
- 'name' => 'General_DaysSinceFirstVisit',
- 'segment' => 'daysSinceFirstVisit',
- 'sqlSegment' => 'log_visit.visitor_days_since_first',
- );
- $segments[] = array(
- 'type' => 'metric',
- 'category' => Piwik::translate('General_Visit'),
- 'name' => 'General_NumberOfVisits',
- 'segment' => 'visitCount',
- 'sqlSegment' => 'log_visit.visitor_count_visits',
- );
-
- $segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => 'General_VisitConvertedGoal',
diff --git a/plugins/Actions/Columns/EntryPageTitle.php b/plugins/Actions/Columns/EntryPageTitle.php
index 5df614f9e1..5664ea7c21 100644
--- a/plugins/Actions/Columns/EntryPageTitle.php
+++ b/plugins/Actions/Columns/EntryPageTitle.php
@@ -29,9 +29,9 @@ class EntryPageTitle extends VisitDimension
/**
* @param Request $request
- * @param $visit
+ * @param array $visit
* @param Action|null $action
- * @return bool
+ * @return int
*/
public function onNewVisit(Request $request, $visit, $action)
{
diff --git a/plugins/Actions/Columns/EntryPageUrl.php b/plugins/Actions/Columns/EntryPageUrl.php
index b2b9ea0c5c..760f4b635a 100644
--- a/plugins/Actions/Columns/EntryPageUrl.php
+++ b/plugins/Actions/Columns/EntryPageUrl.php
@@ -29,9 +29,9 @@ class EntryPageUrl extends VisitDimension
/**
* @param Request $request
- * @param $visit
+ * @param array $visit
* @param Action|null $action
- * @return bool
+ * @return int
*/
public function onNewVisit(Request $request, $visit, $action)
{
diff --git a/plugins/Actions/Columns/ExitPageTitle.php b/plugins/Actions/Columns/ExitPageTitle.php
index ed2d7821dd..2f2054ac60 100644
--- a/plugins/Actions/Columns/ExitPageTitle.php
+++ b/plugins/Actions/Columns/ExitPageTitle.php
@@ -29,9 +29,9 @@ class ExitPageTitle extends VisitDimension
/**
* @param Request $request
- * @param $visit
+ * @param array $visit
* @param Action|null $action
- * @return bool
+ * @return int|bool
*/
public function onNewVisit(Request $request, $visit, $action)
{
@@ -44,19 +44,19 @@ class ExitPageTitle extends VisitDimension
return (int) $idActionName;
}
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int|bool
+ */
public function onExistingVisit(Request $request, $visit, $action)
{
if (empty($action)) {
return false;
}
- $id = $action->getIdActionNameForEntryAndExitIds();
-
- if (!empty($id)) {
- $id = (int) $id;
- }
-
- return $id;
+ return $action->getIdActionNameForEntryAndExitIds();
}
public function getName()
diff --git a/plugins/Actions/Columns/ExitPageUrl.php b/plugins/Actions/Columns/ExitPageUrl.php
index ad3c21ec42..82ad5c598a 100644
--- a/plugins/Actions/Columns/ExitPageUrl.php
+++ b/plugins/Actions/Columns/ExitPageUrl.php
@@ -29,9 +29,9 @@ class ExitPageUrl extends VisitDimension
/**
* @param Request $request
- * @param $visit
+ * @param array $visit
* @param Action|null $action
- * @return bool
+ * @return int|bool
*/
public function onNewVisit(Request $request, $visit, $action)
{
diff --git a/plugins/Actions/Columns/VisitTotalActions.php b/plugins/Actions/Columns/VisitTotalActions.php
new file mode 100644
index 0000000000..49177a3143
--- /dev/null
+++ b/plugins/Actions/Columns/VisitTotalActions.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Actions\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker;
+
+class VisitTotalActions extends VisitDimension
+{
+ protected $fieldName = 'visit_total_actions';
+ protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
+
+ protected function init()
+ {
+ $segment = new Segment();
+ $segment->setType(Segment::TYPE_METRIC);
+ $segment->setSegment('actions');
+ $segment->setName('General_NbActions');
+ $this->addSegment($segment);
+ }
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ $actionType = false;
+ if ($action) {
+ $actionType = $action->getActionType();
+ }
+
+ $actions = array(
+ Action::TYPE_PAGE_URL,
+ Action::TYPE_DOWNLOAD,
+ Action::TYPE_OUTLINK,
+ Action::TYPE_SITE_SEARCH,
+ Action::TYPE_EVENT
+ );
+
+ // if visit starts with something else (e.g. ecommerce order), don't record as an action
+ if (in_array($actionType, $actions)) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onExistingVisit(Request $request, $visit, $action)
+ {
+ if (!$action) {
+ return false;
+ }
+
+ $increment = 'visit_total_actions + 1';
+
+ $idActionUrl = $action->getIdActionUrlForEntryAndExitIds();
+
+ if ($idActionUrl !== false) {
+ return $increment;
+ }
+
+ $actionType = $action->getActionType();
+
+ if (in_array($actionType, array(Action::TYPE_SITE_SEARCH, Action::TYPE_EVENT))) {
+ return $increment;
+ }
+
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/plugins/Actions/Columns/VisitTotalSearches.php b/plugins/Actions/Columns/VisitTotalSearches.php
new file mode 100644
index 0000000000..42a9ac8b14
--- /dev/null
+++ b/plugins/Actions/Columns/VisitTotalSearches.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Actions\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker;
+
+class VisitTotalSearches extends VisitDimension
+{
+ protected $fieldName = 'visit_total_searches';
+ protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
+
+ protected function init()
+ {
+ $segment = new Segment();
+ $segment->setType(Segment::TYPE_METRIC);
+ $segment->setSegment('searches');
+ $segment->setName('General_NbSearches');
+ $segment->setAcceptValues('To select all visits who used internal Site Search, use: &segment=searches>0');
+ $this->addSegment($segment);
+ }
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ if ($this->isSiteSearchAction($action)) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onExistingVisit(Request $request, $visit, $action)
+ {
+ if ($this->isSiteSearchAction($action)) {
+ return 'visit_total_searches + 1';
+ }
+
+ return false;
+ }
+
+ /**
+ * @param Action|null $action
+ * @return bool
+ */
+ private function isSiteSearchAction($action)
+ {
+ return ($action && $action->getActionType() == Action::TYPE_SITE_SEARCH);
+ }
+
+} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitFirstActionTime.php b/plugins/CoreHome/Columns/VisitFirstActionTime.php
new file mode 100644
index 0000000000..e0b7078fb8
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitFirstActionTime.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker;
+
+class VisitFirstActionTime extends VisitDimension
+{
+ protected $fieldName = 'visit_first_action_time';
+ protected $fieldType = 'DATETIME NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ return Tracker::getDatetimeFromTimestamp($request->getCurrentTimestamp());
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitLastActionTime.php b/plugins/CoreHome/Columns/VisitLastActionTime.php
new file mode 100644
index 0000000000..5c45cb31a5
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitLastActionTime.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker;
+
+class VisitLastActionTime extends VisitDimension
+{
+ protected $fieldName = 'visit_last_action_time';
+ // we do not install or define column definition here as we need to create this column when installing as there is
+ // an index on it. Currently we do not define the index here... although we could overwrite the install() method
+ // and add column 'visit_last_action_time' and add index. Problem is there is also an index
+ // INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether config_id already exists at
+ // installing point (in case config_id is installed via dimension as well we do not know which column will be added
+ // first).
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ return Tracker::getDatetimeFromTimestamp($request->getCurrentTimestamp());
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onExistingVisit(Request $request, $visit, $action)
+ {
+ return $this->onNewVisit($request, $visit, $action);
+ }
+
+} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
new file mode 100644
index 0000000000..c418e6e764
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+
+class VisitorDaysSinceFirst extends VisitDimension
+{
+ protected $fieldName = 'visitor_days_since_first';
+ protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
+
+ protected function init()
+ {
+ $segment = new Segment();
+ $segment->setType(Segment::TYPE_METRIC);
+ $segment->setSegment('daysSinceFirstVisit');
+ $segment->setName('General_DaysSinceFirstVisit');
+ $this->addSegment($segment);
+ }
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ return $request->getDaysSinceFirstVisit();
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
new file mode 100644
index 0000000000..5597a426f7
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+
+class VisitorDaysSinceOrder extends VisitDimension
+{
+ protected $fieldName = 'visitor_days_since_order';
+ protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ $daysSinceLastOrder = $request->getDaysSinceLastOrder();
+
+ if ($daysSinceLastOrder === false) {
+ $daysSinceLastOrder = 0;
+ }
+
+ return $daysSinceLastOrder;
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitsCount.php b/plugins/CoreHome/Columns/VisitsCount.php
new file mode 100644
index 0000000000..6b900eefef
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitsCount.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+
+class VisitsCount extends VisitDimension
+{
+ protected $fieldName = 'visitor_count_visits';
+ protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ protected function init()
+ {
+ $segment = new Segment();
+ $segment->setType(Segment::TYPE_METRIC);
+ $segment->setSegment('visitCount');
+ $segment->setName('General_NumberOfVisits');
+ $this->addSegment($segment);
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ return $request->getVisitCount();
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreHome/Segment.php b/plugins/CoreHome/Segment.php
new file mode 100644
index 0000000000..7b6f2fbf57
--- /dev/null
+++ b/plugins/CoreHome/Segment.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome;
+
+/**
+ * CoreHome segment base class
+ */
+class Segment extends \Piwik\Plugin\Segment
+{
+ protected function init()
+ {
+ $this->setCategory('General_Visit');
+ }
+}
+
diff --git a/plugins/Events/Columns/TotalEvents.php b/plugins/Events/Columns/TotalEvents.php
index 67ed9d7ae6..3d6ac9f33b 100644
--- a/plugins/Events/Columns/TotalEvents.php
+++ b/plugins/Events/Columns/TotalEvents.php
@@ -11,10 +11,13 @@ namespace Piwik\Plugins\Events\Columns;
use Piwik\Piwik;
use Piwik\Plugin\VisitDimension;
use Piwik\Plugin\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
class TotalEvents extends VisitDimension
-{
+{
protected $fieldName = 'visit_total_events';
+ protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
protected function init()
{
@@ -31,4 +34,43 @@ class TotalEvents extends VisitDimension
{
return Piwik::translate('Events_EventName');
}
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ if ($this->isEventAction($action)) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onExistingVisit(Request $request, $visit, $action)
+ {
+ if ($this->isEventAction($action)) {
+ return 'visit_total_events + 1';
+ }
+
+ return false;
+ }
+
+ /**
+ * @param Action|null $action
+ * @return bool
+ */
+ private function isEventAction($action)
+ {
+ return ($action && $action->getActionType() == Action::TYPE_EVENT);
+ }
} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/Language.php b/plugins/UserSettings/Columns/Language.php
index 120178ffb5..0345975639 100644
--- a/plugins/UserSettings/Columns/Language.php
+++ b/plugins/UserSettings/Columns/Language.php
@@ -10,11 +10,27 @@ namespace Piwik\Plugins\UserSettings\Columns;
use Piwik\Piwik;
use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
class Language extends VisitDimension
-{
+{
+ protected $fieldName = 'location_browser_lang';
+ protected $fieldType = 'VARCHAR(20) NOT NULL';
+
public function getName()
{
return Piwik::translate('General_Language');
}
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ return substr($request->getBrowserLanguage(), 0, 20);
+ }
} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/Resolution.php b/plugins/UserSettings/Columns/Resolution.php
index f9a5e1ee62..407daf7db4 100644
--- a/plugins/UserSettings/Columns/Resolution.php
+++ b/plugins/UserSettings/Columns/Resolution.php
@@ -11,10 +11,13 @@ namespace Piwik\Plugins\UserSettings\Columns;
use Piwik\Piwik;
use Piwik\Plugin\VisitDimension;
use Piwik\Plugins\UserSettings\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
class Resolution extends VisitDimension
{
protected $fieldName = 'config_resolution';
+ protected $fieldType = 'VARCHAR(9) NOT NULL';
protected function init()
{
@@ -25,6 +28,23 @@ class Resolution extends VisitDimension
$this->addSegment($segment);
}
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ $resolution = $request->getParam('res');
+
+ if (!empty($resolution)) {
+ return substr($resolution, 0, 9);
+ }
+
+ return $resolution;
+ }
+
public function getName()
{
return Piwik::translate('UserSettings_ColumnResolution');
diff --git a/plugins/VisitTime/Columns/Localtime.php b/plugins/VisitTime/Columns/Localtime.php
index f20dde3fed..6f0cc5f727 100644
--- a/plugins/VisitTime/Columns/Localtime.php
+++ b/plugins/VisitTime/Columns/Localtime.php
@@ -11,10 +11,13 @@ namespace Piwik\Plugins\VisitTime\Columns;
use Piwik\Piwik;
use Piwik\Plugin\VisitDimension;
use Piwik\Plugins\VisitTime\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
class Localtime extends VisitDimension
{
protected $fieldName = 'visitor_localtime';
+ protected $fieldType = 'TIME NOT NULL';
protected function init()
{
@@ -30,4 +33,15 @@ class Localtime extends VisitDimension
{
return Piwik::translate('VisitTime_ColumnLocalTime');
}
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ return $request->getLocalTime();
+ }
} \ No newline at end of file
diff --git a/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php b/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php
index a114bf5476..075c6e7aae 100644
--- a/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php
+++ b/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php
@@ -10,11 +10,28 @@ namespace Piwik\Plugins\VisitorInterest\Columns;
use Piwik\Piwik;
use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
class Visitsbydayssincelastvisit extends VisitDimension
-{
+{
+ protected $fieldName = 'visitor_days_since_last';
+ protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
+
public function getName()
{
return Piwik::translate('VisitorInterest_VisitsByDaysSinceLast');
}
+
+ /**
+ * @param Request $request
+ * @param array $visit
+ * @param Action|null $action
+ * @return int
+ */
+ public function onNewVisit(Request $request, $visit, $action)
+ {
+ return $request->getDaysSinceLastVisit();
+ }
+
} \ No newline at end of file
diff --git a/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml b/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
index 6d10c93942..19aefaace8 100644
--- a/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
+++ b/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
@@ -40,6 +40,13 @@
<row>
<type>metric</type>
<category>Visit</category>
+ <name>Total events</name>
+ <segment>events</segment>
+ <acceptedValues>To select all visits who triggered an Event, use: &amp;segment=events&gt;0</acceptedValues>
+ </row>
+ <row>
+ <type>metric</type>
+ <category>Visit</category>
<name>Visit Duration (in seconds)</name>
<segment>visitDuration</segment>
</row>
@@ -152,13 +159,6 @@
<row>
<type>dimension</type>
<category>Visit</category>
- <name>Total events</name>
- <segment>events</segment>
- <acceptedValues>To select all visits who triggered an Event, use: &amp;segment=events&gt;0</acceptedValues>
- </row>
- <row>
- <type>dimension</type>
- <category>Visit</category>
<name>Visit Ecommerce status at the end of the visit</name>
<segment>visitEcommerceStatus</segment>
<acceptedValues>none, ordered, abandonedCart, orderedThenAbandonedCart. For example, to select all visits that have made an Ecommerce order, the API request would contain &quot;&amp;segment=visitEcommerceStatus==ordered,visitEcommerceStatus==orderedThenAbandonedCart&quot;</acceptedValues>
diff --git a/tests/PHPUnit/UI b/tests/PHPUnit/UI
-Subproject b4ab7e0e73efc617156824cdeac0b9930a7f3e4
+Subproject 06b7215cfeda6fabd3acee2db22dd7805e14ad5