diff options
author | mattpiwik <matthieu.aubry@gmail.com> | 2011-01-14 03:04:08 +0300 |
---|---|---|
committer | mattpiwik <matthieu.aubry@gmail.com> | 2011-01-14 03:04:08 +0300 |
commit | ecedd2c7fda81cca177bdf774ebd92b7c0e1326e (patch) | |
tree | 41426ae6a4ff106e35645dd4fa977466178df48c | |
parent | 3156f9ec247b3ac792997cc9ccfad955b8762e4a (diff) |
Fixes #2007
* stores idvisitor, config_id as BIGINT rather than char(32)
* updates Tracking and Archiving code
git-svn-id: http://dev.piwik.org/svn/trunk@3729 59fd770c-687e-43c8-a1e3-f5a4ff64c105
-rw-r--r-- | core/ArchiveProcessing/Day.php | 4 | ||||
-rw-r--r-- | core/ArchiveProcessing/Period.php | 2 | ||||
-rw-r--r-- | core/Cookie.php | 2 | ||||
-rw-r--r-- | core/Db/Schema/Myisam.php | 10 | ||||
-rw-r--r-- | core/Tracker.php | 20 | ||||
-rw-r--r-- | core/Tracker/Action.php | 12 | ||||
-rw-r--r-- | core/Tracker/GoalManager.php | 21 | ||||
-rw-r--r-- | core/Tracker/Visit.php | 80 | ||||
-rw-r--r-- | core/Updates/1.2.php | 43 | ||||
-rw-r--r-- | plugins/Actions/Actions.php | 6 | ||||
-rw-r--r-- | plugins/Live/API.php | 6 | ||||
-rw-r--r-- | plugins/Referers/Referers.php | 2 | ||||
-rw-r--r-- | plugins/VisitFrequency/VisitFrequency.php | 2 | ||||
-rw-r--r-- | tests/integration/Main.test.php | 3 |
14 files changed, 145 insertions, 68 deletions
diff --git a/core/ArchiveProcessing/Day.php b/core/ArchiveProcessing/Day.php index deff461fad..031a572a55 100644 --- a/core/ArchiveProcessing/Day.php +++ b/core/ArchiveProcessing/Day.php @@ -36,7 +36,7 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing */ protected function compute() { - $query = "SELECT count(distinct visitor_idcookie) as nb_uniq_visitors, + $query = "SELECT count(distinct idvisitor) as nb_uniq_visitors, count(*) as nb_visits, sum(visit_total_actions) as nb_actions, max(visit_total_actions) as max_actions, @@ -145,7 +145,7 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing public function getArrayInterestForLabel($label) { $query = "SELECT $label as label, - count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`, + count(distinct idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`, count(*) as `". Piwik_Archive::INDEX_NB_VISITS ."`, sum(visit_total_actions) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`, max(visit_total_actions) as `". Piwik_Archive::INDEX_MAX_ACTIONS ."`, diff --git a/core/ArchiveProcessing/Period.php b/core/ArchiveProcessing/Period.php index 86cf3cb805..513955cbc0 100644 --- a/core/ArchiveProcessing/Period.php +++ b/core/ArchiveProcessing/Period.php @@ -302,7 +302,7 @@ class Piwik_ArchiveProcessing_Period extends Piwik_ArchiveProcessing protected function computeNbUniqVisitors() { $query = " - SELECT count(distinct visitor_idcookie) as nb_uniq_visitors + SELECT count(distinct idvisitor) as nb_uniq_visitors FROM ".Piwik_Common::prefixTable('log_visit')." WHERE visit_last_action_time >= ? AND visit_last_action_time <= ? diff --git a/core/Cookie.php b/core/Cookie.php index f080bd1fa2..ce59c74855 100644 --- a/core/Cookie.php +++ b/core/Cookie.php @@ -368,7 +368,7 @@ class Piwik_Cookie */ public function __toString() { - $str = 'COOKIE '.$this->name.', rows count: '.count($this->value). ', cookie size = '.strlen($this->generateContentString()).' bytes<br/>'; + $str = 'COOKIE '.$this->name.', rows count: '.count($this->value). ', cookie size = '.strlen($this->generateContentString())." bytes\n"; $str .= var_export($this->value, $return = true); return $str; } diff --git a/core/Db/Schema/Myisam.php b/core/Db/Schema/Myisam.php index 71d1f1655b..e0dd892699 100644 --- a/core/Db/Schema/Myisam.php +++ b/core/Db/Schema/Myisam.php @@ -169,8 +169,8 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface 'log_visit' => "CREATE TABLE {$prefixTables}log_visit ( idvisit INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, idsite INTEGER(10) UNSIGNED NOT NULL, + idvisitor BIGINT( 20 ) UNSIGNED NOT NULL, visitor_localtime TIME NOT NULL, - visitor_idcookie CHAR(32) NOT NULL, visitor_returning TINYINT(1) NOT NULL, visit_first_action_time DATETIME NOT NULL, visit_last_action_time DATETIME NOT NULL, @@ -185,7 +185,7 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface referer_name VARCHAR(70) NULL, referer_url TEXT NOT NULL, referer_keyword VARCHAR(255) NULL, - config_md5config CHAR(32) NOT NULL, + config_id BIGINT( 20 ) UNSIGNED NOT NULL, config_os CHAR(3) NOT NULL, config_browser_name VARCHAR(10) NOT NULL, config_browser_version VARCHAR(20) NOT NULL, @@ -206,14 +206,14 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface location_continent CHAR(3) NOT NULL, PRIMARY KEY(idvisit), INDEX index_idsite_idvisit (idsite, idvisit), - INDEX index_idsite_datetime_config (idsite, visit_last_action_time, config_md5config(8)) + INDEX index_idsite_datetime_config (idsite, visit_last_action_time, config_id) ) DEFAULT CHARSET=utf8 ", 'log_conversion' => "CREATE TABLE `{$prefixTables}log_conversion` ( idvisit int(10) unsigned NOT NULL, idsite int(10) unsigned NOT NULL, - visitor_idcookie char(32) NOT NULL, + idvisitor BIGINT(20) NOT NULL, server_time datetime NOT NULL, idaction_url int(11) default NULL, idlink_va int(11) default NULL, @@ -236,9 +236,9 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface 'log_link_visit_action' => "CREATE TABLE {$prefixTables}log_link_visit_action ( idlink_va INTEGER(11) NOT NULL AUTO_INCREMENT, idsite int(10) UNSIGNED NOT NULL, + idvisitor BIGINT(20) NOT NULL, server_time DATETIME NOT NULL, idvisit INTEGER(10) UNSIGNED NOT NULL, - visitor_idcookie char(32) NOT NULL, idaction_url INTEGER(10) UNSIGNED NOT NULL, idaction_url_ref INTEGER(10) UNSIGNED NOT NULL, idaction_name INTEGER(10) UNSIGNED, diff --git a/core/Tracker.php b/core/Tracker.php index 271d848e4c..003972b8ae 100644 --- a/core/Tracker.php +++ b/core/Tracker.php @@ -324,6 +324,26 @@ class Piwik_Tracker $this->setState(self::STATE_LOGGING_DISABLE); } } + + /** + * Helper which returns the function call to convert the first 16 chars of a md5 hash to a BIGINT + * + * @return string used in SQL statement + */ + static public function getBindConvertStringAsBigInt() + { + return 'cast(conv(?, 16, 10) as unsigned integer)'; + } + + /** + * Reverse int to string conversion + * @see getBindConvertStringAsBigInt() + * @param $field + */ + static public function getSelectConvertBigIntAsString($field) + { + return "LPAD(LOWER(conv(".$field.",10,16)), 16, '0')"; + } } if(!function_exists('printDebug')) diff --git a/core/Tracker/Action.php b/core/Tracker/Action.php index be04923129..7b8cd86bc3 100644 --- a/core/Tracker/Action.php +++ b/core/Tracker/Action.php @@ -170,9 +170,9 @@ class Piwik_Tracker_Action implements Piwik_Tracker_Action_Interface } $parsedUrl['query'] = substr($validQuery,0,-strlen($separator)); $url = Piwik_Common::getParseUrlReverse($parsedUrl); - printDebug('Excluded parameters "'.implode(',',$excludedParameters).'" from URL. - Before was <br/><code>"'.$originalUrl.'"</code>, <br/> - After is <br/><code>"'.$url.'"</code>'); + printDebug('Excluded parameters "'.implode(',',$excludedParameters).'" from URL'); + printDebug(' Before was "'.$originalUrl.'"'); + printDebug(' After is "'.$url.'"'); return $url; } @@ -285,12 +285,12 @@ class Piwik_Tracker_Action implements Piwik_Tracker_Action_Interface } Piwik_Tracker::getDatabase()->query( "INSERT INTO ".Piwik_Common::prefixTable('log_link_visit_action') - ." (idvisit, idsite, server_time, visitor_idcookie, idaction_url, idaction_name, idaction_url_ref, idaction_name_ref, time_spent_ref_action) - VALUES (?,?,?,?,?,?,?,?,?)", + ." (idvisit, idsite, idvisitor, server_time, idaction_url, idaction_name, idaction_url_ref, idaction_name_ref, time_spent_ref_action) + VALUES (?,?,".Piwik_Tracker::getBindConvertStringAsBigInt().",?,?,?,?,?,?)", array( $idVisit, $this->idSite, - Piwik_Tracker::getDatetimeFromTimestamp($this->timestamp), $visitorIdCookie, + Piwik_Tracker::getDatetimeFromTimestamp($this->timestamp), $this->getIdActionUrl(), $idActionName , $idRefererActionUrl, diff --git a/core/Tracker/GoalManager.php b/core/Tracker/GoalManager.php index 374c7b5cde..89198fc0e8 100644 --- a/core/Tracker/GoalManager.php +++ b/core/Tracker/GoalManager.php @@ -177,7 +177,7 @@ class Piwik_Tracker_GoalManager $goal = array( 'idvisit' => $visitorInformation['idvisit'], 'idsite' => $idSite, - 'visitor_idcookie' => $visitorInformation['visitor_idcookie'], + 'idvisitor' => $visitorInformation['idvisitor'], 'server_time' => Piwik_Tracker::getDatetimeFromTimestamp($visitorInformation['visit_last_action_time']), 'location_country' => $location_country, 'location_continent'=> $location_continent, @@ -220,14 +220,19 @@ class Piwik_Tracker_GoalManager } printDebug($newGoal); - $fields = implode(", ", array_keys($newGoal)); - $bindFields = substr(str_repeat( "?,",count($newGoal)),0,-1); - + // idvisitor has a special INSERT + $idVisitor = $newGoal['idvisitor']; + unset($newGoal['idvisitor']); + + $fields = implode(", ", array_keys($newGoal)) . ', idvisitor '; + $bindFields = substr(str_repeat( "?,",count($newGoal)),0,-1) . ','. Piwik_Tracker::getBindConvertStringAsBigInt(); + $newGoal['idvisitor'] = $idVisitor; + try { - Piwik_Tracker::getDatabase()->query( - "INSERT IGNORE INTO " . Piwik_Common::prefixTable('log_conversion') . " ($fields) - VALUES ($bindFields) ", array_values($newGoal) - ); + $sql = "INSERT IGNORE INTO " . Piwik_Common::prefixTable('log_conversion') . " + ($fields) VALUES ($bindFields) "; + $bind = array_values($newGoal); + Piwik_Tracker::getDatabase()->query($sql, $bind); } catch( Exception $e) { if(Piwik_Tracker::getDatabase()->isErrNo($e, '1062')) { diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php index 457c5b8ca7..9e78e3ae44 100644 --- a/core/Tracker/Visit.php +++ b/core/Tracker/Visit.php @@ -182,7 +182,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface if(!is_null($action)) { $action->record( $this->visitorInfo['idvisit'], - $this->visitorInfo['visitor_idcookie'], + $this->visitorInfo['idvisitor'], $idRefererActionUrl, $idRefererActionName, $this->visitorInfo['time_spent_ref_action'] @@ -219,7 +219,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $this->handleNewVisit($idActionUrl, $idActionName, $someGoalsConverted); if(!is_null($action)) { - $action->record( $this->visitorInfo['idvisit'], $this->visitorInfo['visitor_idcookie'], 0, 0, 0 ); + $action->record( $this->visitorInfo['idvisit'], $this->visitorInfo['idvisitor'], 0, 0, 0 ); } } @@ -344,8 +344,8 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface SET $sqlActionUpdate ".implode($updateParts, ', ')." WHERE idsite = ? AND idvisit = ? - AND visitor_idcookie = ?"; - array_push($sqlBind, $this->idsite, $this->visitorInfo['idvisit'], $this->visitorInfo['visitor_idcookie'] ); + AND idvisitor = ". Piwik_Tracker::getBindConvertStringAsBigInt(); + array_push($sqlBind, $this->idsite, $this->visitorInfo['idvisit'], $this->visitorInfo['idvisitor'] ); $result = Piwik_Tracker::getDatabase()->query($sqlQuery, $sqlBind); printDebug('Updating visitor with idvisit='.$this->visitorInfo['idvisit'].', setting visit_last_action_time='.$datetimeServer.' and visit_total_time='.$visitTotalTime); @@ -355,7 +355,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface { printDebug("Visitor with this idcookie and idvisit wasn't found in the DB."); throw new Piwik_Tracker_Visit_VisitorNotFoundInDatabase( - "The visitor with visitor_idcookie=".$this->visitorInfo['visitor_idcookie']." and idvisit=".$this->visitorInfo['idvisit'] + "The visitor with idvisitor=".$this->visitorInfo['idvisitor']." and idvisit=".$this->visitorInfo['idvisit'] ." wasn't found in the DB, we fallback to a new visitor"); } @@ -389,7 +389,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $serverTimestamp = $this->getCurrentTimestamp(); - $idcookie = $this->getVisitorIdcookie(); + $idcookie = substr($this->getVisitorIdcookie(), 0, 16); $returningVisitor = $this->isVisitorKnown() ? 1 : 0; $defaultTimeOnePageVisit = Piwik_Tracker_Config::getInstance()->Tracker['default_time_one_page_visit']; @@ -406,7 +406,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $this->visitorInfo = array( 'idsite' => $this->idsite, 'visitor_localtime' => $localTime, - 'visitor_idcookie' => $idcookie, + 'idvisitor' => $idcookie, 'visitor_returning' => $returningVisitor, 'visit_first_action_time' => Piwik_Tracker::getDatetimeFromTimestamp($serverTimestamp), 'visit_last_action_time' => Piwik_Tracker::getDatetimeFromTimestamp($serverTimestamp), @@ -421,7 +421,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface 'referer_name' => $refererInfo['referer_name'], 'referer_url' => Piwik_Common::unsanitizeInputValue($refererInfo['referer_url']), 'referer_keyword' => $refererInfo['referer_keyword'], - 'config_md5config' => $userInfo['config_md5config'], + 'config_id' => $userInfo['config_id'], 'config_os' => $userInfo['config_os'], 'config_browser_name' => $userInfo['config_browser_name'], 'config_browser_version' => $userInfo['config_browser_version'], @@ -461,13 +461,25 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $this->visitorInfo['referer_keyword'] = substr($this->visitorInfo['referer_keyword'], 0, 255); $this->visitorInfo['config_resolution'] = substr($this->visitorInfo['config_resolution'], 0, 9); - $fields = implode(", ", array_keys($this->visitorInfo)); - $values = substr(str_repeat( "?,",count($this->visitorInfo)),0,-1); + // idVisitor and configId appear as 16b long md5 hash, but are inserted as bigint + $idVisitor = $this->visitorInfo['idvisitor']; + $configId = $this->visitorInfo['config_id']; + unset($this->visitorInfo['idvisitor']); + unset($this->visitorInfo['config_id']); + + $fields = implode(", ", array_keys($this->visitorInfo)) . ', idvisitor, config_id'; + $values = substr(str_repeat( "?,",count($this->visitorInfo)),0,-1) + .', '.Piwik_Tracker::getBindConvertStringAsBigInt() + .', '.Piwik_Tracker::getBindConvertStringAsBigInt(); + + $sql = "INSERT INTO ".Piwik_Common::prefixTable('log_visit'). " ($fields) VALUES ($values)"; - printDebug($this->visitorInfo); - Piwik_Tracker::getDatabase()->query( "INSERT INTO ".Piwik_Common::prefixTable('log_visit'). - " ($fields) VALUES ($values)", array_values($this->visitorInfo)); + $this->visitorInfo['idvisitor'] = $idVisitor; + $this->visitorInfo['config_id'] = $configId; + $bind = array_values($this->visitorInfo); + Piwik_Tracker::getDatabase()->query( $sql, $bind); + $idVisit = Piwik_Tracker::getDatabase()->lastInsertId(); $this->visitorInfo['idvisit'] = $idVisit; @@ -487,7 +499,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface { if($this->isVisitorKnown()) { - $idcookie = $this->visitorInfo['visitor_idcookie']; + $idcookie = $this->visitorInfo['idvisitor']; } else { @@ -724,11 +736,12 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $this->printCookie(); - if( false !== ($idVisitor = $this->cookie->get( Piwik_Tracker::COOKIE_INDEX_IDVISITOR )) ) + if( false !== ($idVisitor = $this->cookie->get( Piwik_Tracker::COOKIE_INDEX_IDVISITOR )) + && strlen($idVisitor) >= 16) { - $this->visitorInfo['visitor_idcookie'] = $idVisitor; + $this->visitorInfo['idvisitor'] = substr($idVisitor, 0, 16); $this->visitorKnown = true; - printDebug("The visitor has the piwik cookie (idcookie = ".$this->visitorInfo['visitor_idcookie'].") "); + printDebug("The visitor has the piwik cookie (idvisitor = ".$this->visitorInfo['idvisitor'].") "); } else { @@ -736,20 +749,20 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface } $userInfo = $this->getUserSettingsInformation(); - $md5Config = $userInfo['config_md5config']; + $configId = $userInfo['config_id']; $timeLookBack = date('Y-m-d H:i:s', $this->getCurrentTimestamp() - self::TIME_IN_PAST_TO_SEARCH_FOR_VISITOR); - $bindSql = array( $timeLookBack, $this->idsite, $md5Config); + $bindSql = array( $timeLookBack, $this->idsite, $configId); $where = ''; if( Piwik_Tracker_Config::getInstance()->Tracker['trust_visitors_cookies'] - && !empty($this->visitorInfo['visitor_idcookie'])) + && !empty($this->visitorInfo['idvisitor'])) { // If the visitor cookies should be trusted (ie. intranet) we add this condition - $where = 'AND visitor_idcookie = ? '; - $bindSql[] = $idVisitor; + $where = 'AND idvisitor = '.Piwik_Tracker::getBindConvertStringAsBigInt(); + $bindSql[] = $this->visitorInfo['idvisitor']; } - $sql = " SELECT visitor_idcookie, + $sql = " SELECT ".Piwik_Tracker::getSelectConvertBigIntAsString('idvisitor')." as idvisitor, visit_last_action_time, visit_first_action_time, idvisit, @@ -758,16 +771,15 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface FROM ".Piwik_Common::prefixTable('log_visit'). " WHERE visit_last_action_time >= ? AND idsite = ? - AND config_md5config = ? + AND config_id = ".Piwik_Tracker::getBindConvertStringAsBigInt()." ".$where." ORDER BY visit_last_action_time DESC LIMIT 1"; $visitRow = Piwik_Tracker::getDatabase()->fetch($sql, $bindSql); - if($visitRow && count($visitRow) > 0) { - $this->visitorInfo['visitor_idcookie'] = $visitRow['visitor_idcookie']; + $this->visitorInfo['idvisitor'] = $visitRow['idvisitor']; $this->visitorInfo['visit_last_action_time'] = strtotime($visitRow['visit_last_action_time']); $this->visitorInfo['visit_first_action_time'] = strtotime($visitRow['visit_first_action_time']); $this->visitorInfo['idvisit'] = $visitRow['idvisit']; @@ -776,14 +788,18 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $this->visitorKnown = true; - printDebug("The visitor is known because of his userSettings+IP (idvisit = {$this->visitorInfo['idvisit']}, last action = ".date("r", $this->visitorInfo['visit_last_action_time']).", first action = ".date("r", $this->visitorInfo['visit_first_action_time']) .")"); + printDebug("The visitor is known (idvisit = {$this->visitorInfo['idvisit']}, last action = ".date("r", $this->visitorInfo['visit_last_action_time']).", first action = ".date("r", $this->visitorInfo['visit_first_action_time']) .")"); if(!empty($where)) { - printDebug("Also matched the visitor based on his idcookie: {$visitRow['visitor_idcookie']}"); + printDebug("Also matched the visitor based on his idcookie: {$visitRow['idvisitor']}"); } } + else + { + printDebug("The visitor was not matched with an existing visitor..."); + } } - + /** * Gets the UserSettings information and returns them in an array of name => value * @@ -841,7 +857,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $browserLang); $this->userSettingsInformation = array( - 'config_md5config' => $configurationHash, + 'config_id' => $configurationHash, 'config_os' => $os, 'config_browser_name' => $browserName, 'config_browser_version' => $browserVersion, @@ -915,7 +931,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface // idcookie has been generated in handleNewVisit or we simply propagate the old value $this->cookie->set( Piwik_Tracker::COOKIE_INDEX_IDVISITOR, - $this->visitorInfo['visitor_idcookie'] ); + $this->visitorInfo['idvisitor'] ); $this->cookie->save(); } @@ -1143,7 +1159,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface */ protected function getConfigHash( $os, $browserName, $browserVersion, $resolution, $plugin_Flash, $plugin_Java, $plugin_Director, $plugin_Quicktime, $plugin_RealPlayer, $plugin_PDF, $plugin_WindowsMedia, $plugin_Gears, $plugin_Silverlight, $plugin_Cookie, $ip, $browserLang) { - return md5( $os . $browserName . $browserVersion . $resolution . $plugin_Flash . $plugin_Java . $plugin_Director . $plugin_Quicktime . $plugin_RealPlayer . $plugin_PDF . $plugin_WindowsMedia . $plugin_Gears . $plugin_Silverlight . $plugin_Cookie . $ip . $browserLang ); + return substr( md5( $os . $browserName . $browserVersion . $resolution . $plugin_Flash . $plugin_Java . $plugin_Director . $plugin_Quicktime . $plugin_RealPlayer . $plugin_PDF . $plugin_WindowsMedia . $plugin_Gears . $plugin_Silverlight . $plugin_Cookie . $ip . $browserLang ), 0, 16); } /** diff --git a/core/Updates/1.2.php b/core/Updates/1.2.php index a7caee8a45..2795973afd 100644 --- a/core/Updates/1.2.php +++ b/core/Updates/1.2.php @@ -18,30 +18,65 @@ class Piwik_Updates_1_2 extends Piwik_Updates static function getSql($schema = 'Myisam') { return array( + // Various performance improvements schema updates 'ALTER TABLE `'. Piwik_Common::prefixTable('log_visit') .'` DROP `visit_server_date`, DROP INDEX `index_idsite_date_config`, + DROP INDEX `index_idsite_datetime_config`, ADD `visit_entry_idaction_name` INT UNSIGNED NOT NULL AFTER `visit_entry_idaction_url`, ADD `visit_exit_idaction_name` INT UNSIGNED NOT NULL AFTER `visit_exit_idaction_url`, CHANGE `visit_exit_idaction_url` `visit_exit_idaction_url` INT UNSIGNED NOT NULL, - CHANGE `visit_entry_idaction_url` `visit_entry_idaction_url` INT UNSIGNED NOT NULL + CHANGE `visit_entry_idaction_url` `visit_entry_idaction_url` INT UNSIGNED NOT NULL, + ADD `idvisitor` BIGINT( 20 ) UNSIGNED NOT NULL AFTER `idsite`, + ADD `config_id` BIGINT( 20 ) UNSIGNED NOT NULL AFTER `config_md5config` ' => false, 'ALTER TABLE `'. Piwik_Common::prefixTable('log_link_visit_action') .'` ADD `idsite` INT( 10 ) UNSIGNED NOT NULL AFTER `idlink_va` , ADD `server_time` DATETIME NOT NULL AFTER `idsite`, - ADD `visitor_idcookie` char(32) NOT NULL AFTER `idsite`, + ADD `idvisitor` BIGINT(20) UNSIGNED NOT NULL AFTER `idsite`, ADD `idaction_name_ref` INT UNSIGNED NOT NULL AFTER `idaction_name`, ADD INDEX `index_idsite_servertime` ( `idsite` , `server_time` ) ' => false, - // Backfill logs as best as we can + + 'ALTER TABLE `'. Piwik_Common::prefixTable('log_conversion') .'` + ADD `idvisitor` BIGINT( 20 ) UNSIGNED NOT NULL AFTER `idsite` + ' => false, + + // Migrate 128bits IDs inefficiently stored as 8bytes (256 bits) into 64bits + 'UPDATE '.Piwik_Common::prefixTable('log_visit') .' + SET idvisitor = cast(conv(substring(visitor_idcookie,1,16), 16, 10) as unsigned integer), + config_id = cast(conv(substring(config_id,1,16), 16, 10) as unsigned integer) + ' => false, + 'UPDATE '.Piwik_Common::prefixTable('log_conversion') .' + SET idvisitor = cast(conv(substring(visitor_idcookie,1,16), 16, 10) as unsigned integer) + ' => false, + + // Drop migrated fields + 'ALTER TABLE `'. Piwik_Common::prefixTable('log_visit') .'` + DROP visitor_idcookie, + DROP config_md5config + ' => false, + 'ALTER TABLE `'. Piwik_Common::prefixTable('log_conversion') .'` + DROP visitor_idcookie + ' => false, + + // Recreate INDEX on new field + 'ALTER TABLE `'. Piwik_Common::prefixTable('log_visit') .'` + ADD INDEX `index_idsite_datetime_config` (idsite, visit_last_action_time, config_id) + ' => false, + + // Backfill action logs as best as we can 'UPDATE '.Piwik_Common::prefixTable('log_link_visit_action') .' as action, '.Piwik_Common::prefixTable('log_visit') .' as visit SET action.idsite = visit.idsite, action.server_time = visit.visit_last_action_time, - action.visitor_idcookie = visit.visitor_idcookie + action.idvisitor = visit.idvisitor WHERE action.idvisit=visit.idvisit ' => false, + + // New index used max once per request, in case this table grows significantly in the future 'ALTER TABLE `'. Piwik_Common::prefixTable('option') .'` ADD INDEX ( `autoload` ) ' => false, + ); } diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php index e18553ecb9..479fb76fa7 100644 --- a/plugins/Actions/Actions.php +++ b/plugins/Actions/Actions.php @@ -218,7 +218,7 @@ class Piwik_Actions extends Piwik_Plugin type, idaction, count(distinct idvisit) as `". Piwik_Archive::INDEX_NB_VISITS ."`, - count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`, + count(distinct idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`, count(*) as `". Piwik_Archive::INDEX_PAGE_NB_HITS ."` FROM ".Piwik_Common::prefixTable('log_link_visit_action')." as log_link_visit_action LEFT JOIN ".Piwik_Common::prefixTable('log_action')." as log_action ON (log_link_visit_action.%s = idaction) @@ -235,7 +235,7 @@ class Piwik_Actions extends Piwik_Plugin * Entry actions for Page URLs and Page names */ $queryString = "SELECT %s as idaction, - count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_UNIQ_VISITORS ."`, + count(distinct idvisitor) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_UNIQ_VISITORS ."`, count(*) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_VISITS ."`, sum(visit_total_actions) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_ACTIONS ."`, sum(visit_total_time) as `". Piwik_Archive::INDEX_PAGE_ENTRY_SUM_VISIT_LENGTH ."`, @@ -253,7 +253,7 @@ class Piwik_Actions extends Piwik_Plugin * Exit actions */ $queryString = "SELECT %s as idaction, - count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_PAGE_EXIT_NB_UNIQ_VISITORS ."`, + count(distinct idvisitor) as `". Piwik_Archive::INDEX_PAGE_EXIT_NB_UNIQ_VISITORS ."`, count(*) as `". Piwik_Archive::INDEX_PAGE_EXIT_NB_VISITS ."` FROM ".Piwik_Common::prefixTable('log_visit')." WHERE visit_last_action_time >= ? diff --git a/plugins/Live/API.php b/plugins/Live/API.php index d809692b78..2a7be3d137 100644 --- a/plugins/Live/API.php +++ b/plugins/Live/API.php @@ -203,7 +203,7 @@ class Piwik_Live_API if(!empty($visitorId)) { - $where[] = Piwik_Common::prefixTable('log_visit') . ".visitor_idcookie = ? "; + $where[] = Piwik_Common::prefixTable('log_visit') . ".idvisitor = ? "; $whereBind[] = $visitorId; } @@ -344,10 +344,10 @@ class Piwik_Live_API */ private function cleanVisitorDetails( &$visitorDetails, $idSite ) { - $toUnset = array('config_md5config'); + $toUnset = array('config_id'); if(Piwik::isUserIsAnonymous()) { - $toUnset[] = 'visitor_idcookie'; + $toUnset[] = 'idvisitor'; $toUnset[] = 'location_ip'; } foreach($toUnset as $keyName) diff --git a/plugins/Referers/Referers.php b/plugins/Referers/Referers.php index 5f5e338a18..c2fa26ccaa 100644 --- a/plugins/Referers/Referers.php +++ b/plugins/Referers/Referers.php @@ -272,7 +272,7 @@ class Piwik_Referers extends Piwik_Plugin referer_name, referer_keyword, referer_url, - count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`, + count(distinct idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`, count(*) as `". Piwik_Archive::INDEX_NB_VISITS ."`, sum(visit_total_actions) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`, max(visit_total_actions) as `". Piwik_Archive::INDEX_MAX_ACTIONS ."`, diff --git a/plugins/VisitFrequency/VisitFrequency.php b/plugins/VisitFrequency/VisitFrequency.php index eee2dccc80..c092b8128b 100644 --- a/plugins/VisitFrequency/VisitFrequency.php +++ b/plugins/VisitFrequency/VisitFrequency.php @@ -102,7 +102,7 @@ class Piwik_VisitFrequency extends Piwik_Plugin /* @var $archiveProcessing Piwik_ArchiveProcessing */ $archiveProcessing = $notification->getNotificationObject(); - $query = "SELECT count(distinct visitor_idcookie) as nb_uniq_visitors_returning, + $query = "SELECT count(distinct idvisitor) as nb_uniq_visitors_returning, count(*) as nb_visits_returning, sum(visit_total_actions) as nb_actions_returning, max(visit_total_actions) as max_actions_returning, diff --git a/tests/integration/Main.test.php b/tests/integration/Main.test.php index 7da869f7d8..cb3eb7fd88 100644 --- a/tests/integration/Main.test.php +++ b/tests/integration/Main.test.php @@ -242,7 +242,8 @@ class Test_Piwik_Integration_Main extends Test_Integration // - // Second new visitor on Idsite 1: one page view $visitorB = $this->getTracker($idSite, $dateTime, $defaultInit = true); - $visitorB->setIp('1.5.6.8'); + $visitorB->setIp('100.52.656.83'); + $visitorB->setResolution(800, 300); $visitorB->setForceVisitDateTime(Piwik_Date::factory($dateTime)->addHour(1)->getDatetime()); $visitorB->setUrlReferer( '' ); $visitorB->setUserAgent('Opera/9.63 (Windows NT 5.1; U; en) Presto/2.1.1'); |