New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Remove duplicate reports from UserSettings plugin #6565
Merged
Merged
Changes from all commits
Commits
Show all changes
57 commits
Select commit
Hold shift + click to select a range
79c71c7
remove old usersettings tests as they are obsolete now; there are mor…
sgiehl f9ba253
remove 'Extended' from function names
sgiehl e803319
ensure device type report always contain all device types
sgiehl d34a876
Remove MobileVSDesktop reports as we now have detailed device type re…
sgiehl dcf9565
extend browser and os details in devicesdetection plugin
sgiehl e29f107
do no longer archive os and browser data in usersettings plugin
sgiehl e7cdc75
rename reports 'GetBrowserFamilies' to 'GetBrowsers' as families are …
sgiehl 390f825
remove browser & os reports from usersettings plugin
sgiehl d30c662
moved columns settings like segments to devicesdetection plugin and r…
sgiehl 0332e8d
passthrough all calls to 'moved' API methods from usersettings plugin…
sgiehl dd4376b
cleaned up usersettings functions
sgiehl d62c15e
KABOOM - removed old UserAgentParser as it is not used anymore!
sgiehl 653bf01
enabled DevicesDetection plugin for OneVisitorTwoVisits_withCookieSup…
sgiehl b41d73a
updated a couple of test files
sgiehl cb46475
updating some more tests
sgiehl 6f38b1a
Merge branch 'master' into deprecate_usersettings
sgiehl f6fa63f
fixing rowevolution test
sgiehl 9424aa4
remove obsolete test files
sgiehl f171539
update test file
sgiehl 6cb4014
update expected test files
sgiehl 3d77d3f
update expected test files
sgiehl ae7ed3f
fix test
sgiehl 407a665
Merge branch 'master' into deprecate_usersettings
sgiehl 261a60b
readded expected files for deprecated apis
sgiehl 2903e59
fixed some tests
sgiehl a4342fa
Merge branch 'master' into deprecate_usersettings
sgiehl 0c97fc8
Merge branch 'master' into deprecate_usersettings
sgiehl 15853aa
Merge branch 'master' into deprecate_usersettings
sgiehl 0a7d9b2
Merge branch 'master' into deprecate_usersettings
sgiehl 3b738ca
fixing some tests
sgiehl 5764e75
Merge branch 'master' into deprecate_usersettings
sgiehl ae589cd
Merge branch 'master' into deprecate_usersettings
sgiehl 6ffcf24
added first version of update script
sgiehl a45c6b9
Merge branch 'master' into deprecate_usersettings
sgiehl dff3519
Merge branch 'master' into deprecate_usersettings
sgiehl 170e5e3
added shortlabel again to keep BC
sgiehl a05d4df
completely removed short os name as it is useless
sgiehl cfcd7ff
update expected test files
sgiehl 3878792
Merge branch 'master' into deprecate_usersettings
sgiehl 0d1d705
use ArchiveTableCreator to get blob tables
sgiehl 432a8c8
refactored duplicate code
sgiehl afb283a
fix version number
sgiehl 47cbb9a
map removed usersettings reports to new reports in devicesdetection p…
sgiehl 6dd9a92
use devicesdetection widget in default dashboard instead of deprecate…
sgiehl 6c62004
Merge branch 'master' into deprecate_usersettings
sgiehl 802eb98
added sqls for updating scheduled reports to new devicesdetection rep…
sgiehl 26188f9
added update sql to update existing dashboards to use new widgets (if…
sgiehl 776584c
moved logic for replacing a dashboard widget to dashboard model
sgiehl 7819080
updated changelog; added removal tests for deprecated methods
sgiehl a5d8306
added method to map legacy os shorts, to ensure old archives are disp…
sgiehl f0cb169
updated some comments
sgiehl e2ce5cd
a visitor now has a browser, browser name and browser version attribu…
sgiehl fcd4868
fix archiving for old log_visit entries having NULL as os_version
sgiehl d2052fb
fixed tests
sgiehl 42e26da
Merge branch 'master' into deprecate_usersettings
sgiehl 6840e82
add logo before changeing label
sgiehl 9d9a7c8
fixed small issue while rebuilding os archives
sgiehl File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,252 @@ | ||
<?php | ||
/** | ||
* Piwik - free/libre analytics platform | ||
* | ||
* @link http://piwik.org | ||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later | ||
* | ||
*/ | ||
|
||
namespace Piwik\Updates; | ||
|
||
use Piwik\Common; | ||
use Piwik\DataAccess\ArchiveTableCreator; | ||
use Piwik\DataTable; | ||
use Piwik\Db; | ||
use Piwik\Updater; | ||
use Piwik\Updates; | ||
use DeviceDetector\Parser\Client\Browser AS BrowserParser; | ||
use Piwik\Plugins\Dashboard\Model AS DashboardModel; | ||
|
||
/** | ||
* This Update script will update all browser and os archives of UserSettings and DevicesDetection plugin | ||
* | ||
* In the future only DevicesDetection will handle browser and os archives, so we try to rename all existing archives | ||
* of UserSettings plugin to their corresponding archive name in DevicesDetection plugin: | ||
* - *UserSettings_browser* will now be *DevicesDetection_browserVersions* | ||
* - *UserSettings_os* will now be *DevicesDetection_osVersions* | ||
* | ||
* Unlike DevicesDetection plugin, the UserSettings plugin did not store archives holding the os and browser data without | ||
* their version number. The "version-less" reports were always generated out of the "version-containing" archives . | ||
* For big archives (month/year) that ment that some of the data was truncated, due to the datatable entry limit. | ||
* To avoid that data loss / inaccuracy in the future, DevicesDetection plugin will also store archives without the version. | ||
* For data archived after DevicesDetection plugin was enabled, those archive already exist. As we are removing the | ||
* UserSettings reports, we need to move the existing old data to the new archives, which means we need to build up | ||
* those archives, where they do not exist. | ||
* | ||
* NOTE: Some archives might not contain "all" data. | ||
* That might have happened directly after the day DevicesDetection plugin was enabled. For the days before, there were | ||
* no archives calculated. So week/month/year archives will only contain data for the days, where archives were generated | ||
* To find a date after which it is safe to use DevicesDetection archives we need to find the first day-archive that | ||
* contains DevicesDetection data. Day archives will always contain full data, but week/month/year archives may not. | ||
* So we need to recreate those week/month/year archives. | ||
*/ | ||
class Updates_2_10_0_b1 extends Updates | ||
{ | ||
|
||
static function getSql() | ||
{ | ||
$sqls = array('# ATTENTION: This update script will execute some more SQL queries than that below as it is necessary to rebuilt some archives #' => false); | ||
|
||
// update scheduled reports to use new plugin | ||
$reportsToReplace = array( | ||
'UserSettings_getBrowserVersion' => 'DevicesDetection_getBrowserVersions', | ||
'UserSettings_getBrowser' => 'DevicesDetection_getBrowsers', | ||
'UserSettings_getOSFamily' => 'DevicesDetection_getOsFamilies', | ||
'UserSettings_getOS' => 'DevicesDetection_getOsVersions', | ||
'UserSettings_getMobileVsDesktop' => 'DevicesDetection_getType', | ||
'UserSettings_getBrowserType' => 'DevicesDetection_getBrowserEngines', | ||
'UserSettings_getWideScreen' => 'UserSettings_getScreenType', | ||
); | ||
|
||
foreach ($reportsToReplace as $old => $new) { | ||
$sqls["UPDATE " . Common::prefixTable('report') . " SET reports = REPLACE(reports, '".$old."', '".$new."')"] = false; | ||
} | ||
|
||
// update dashboard to use new widgets | ||
$oldWidgets = array( | ||
array('module' => 'UserSettings', 'action' => 'getBrowserVersion', 'params' => array()), | ||
array('module' => 'UserSettings', 'action' => 'getBrowser', 'params' => array()), | ||
array('module' => 'UserSettings', 'action' => 'getOSFamily', 'params' => array()), | ||
array('module' => 'UserSettings', 'action' => 'getOS', 'params' => array()), | ||
array('module' => 'UserSettings', 'action' => 'getMobileVsDesktop', 'params' => array()), | ||
array('module' => 'UserSettings', 'action' => 'getBrowserType', 'params' => array()), | ||
array('module' => 'UserSettings', 'action' => 'getWideScreen', 'params' => array()), | ||
); | ||
|
||
$newWidgets = array( | ||
array('module' => 'DevicesDetection', 'action' => 'getBrowserVersions', 'params' => array()), | ||
array('module' => 'DevicesDetection', 'action' => 'getBrowsers', 'params' => array()), | ||
array('module' => 'DevicesDetection', 'action' => 'getOsFamilies', 'params' => array()), | ||
array('module' => 'DevicesDetection', 'action' => 'getOsVersions', 'params' => array()), | ||
array('module' => 'DevicesDetection', 'action' => 'getType', 'params' => array()), | ||
array('module' => 'DevicesDetection', 'action' => 'getBrowserEngines', 'params' => array()), | ||
array('module' => 'UserSettings', 'action' => 'getScreenType', 'params' => array()), | ||
); | ||
|
||
$allDashboards = Db::get()->fetchAll(sprintf("SELECT * FROM %s", Common::prefixTable('user_dashboard'))); | ||
|
||
foreach($allDashboards AS $dashboard) { | ||
|
||
$dashboardLayout = json_decode($dashboard['layout']); | ||
|
||
$dashboardLayout = DashboardModel::replaceDashboardWidgets($dashboardLayout, $oldWidgets, $newWidgets); | ||
|
||
$newLayout = json_encode($dashboardLayout); | ||
if ($newLayout != $dashboard['layout']) { | ||
$sqls["UPDATE " . Common::prefixTable('user_dashboard') . " SET layout = '".addslashes($newLayout)."' WHERE iddashboard = ".$dashboard['iddashboard']] = false; | ||
} | ||
} | ||
|
||
return $sqls; | ||
} | ||
|
||
static function update() | ||
{ | ||
Updater::updateDatabase(__FILE__, self::getSql()); | ||
|
||
$archiveBlobTables = self::getAllArchiveBlobTables(); | ||
|
||
foreach ($archiveBlobTables as $table) { | ||
self::updateBrowserArchives($table); | ||
self::updateOsArchives($table); | ||
} | ||
} | ||
|
||
/** | ||
* Returns all available archive blob tables | ||
* | ||
* @return array | ||
*/ | ||
public static function getAllArchiveBlobTables() | ||
{ | ||
static $archiveBlobTables; | ||
|
||
if (empty($archiveBlobTables)) { | ||
|
||
$archiveTables = ArchiveTableCreator::getTablesArchivesInstalled(); | ||
|
||
$archiveBlobTables = array_filter($archiveTables, function($name) { | ||
return ArchiveTableCreator::getTypeFromTableName($name) == ArchiveTableCreator::BLOB_TABLE; | ||
}); | ||
|
||
// sort tables so we have them in order of their date | ||
rsort($archiveBlobTables); | ||
} | ||
|
||
return (array) $archiveBlobTables; | ||
} | ||
|
||
/** | ||
* Find the first day on which DevicesDetection archives were generated | ||
* | ||
* @return int Timestamp | ||
*/ | ||
public static function getFirstDayOfArchivedDeviceDetectorData() | ||
{ | ||
static $deviceDetectionBlobAvailableDate; | ||
|
||
if (empty($deviceDetectionBlobAvailableDate)) { | ||
|
||
$archiveBlobTables = self::getAllArchiveBlobTables(); | ||
|
||
$deviceDetectionBlobAvailableDate = null; | ||
foreach ($archiveBlobTables as $table) { | ||
|
||
// Look for all day archives and try to find that with the lowest date | ||
$deviceDetectionBlobAvailableDate = Db::get()->fetchOne(sprintf("SELECT date1 FROM %s WHERE name = 'DevicesDetection_browserVersions' AND period = 1 ORDER BY date1 ASC LIMIT 1", $table)); | ||
|
||
if (!empty($deviceDetectionBlobAvailableDate)) { | ||
break; | ||
} | ||
|
||
} | ||
|
||
$deviceDetectionBlobAvailableDate = strtotime($deviceDetectionBlobAvailableDate); | ||
} | ||
|
||
return $deviceDetectionBlobAvailableDate; | ||
} | ||
|
||
/** | ||
* Updates all browser archives to new structure | ||
* @param string $table | ||
* @throws \Exception | ||
*/ | ||
public static function updateBrowserArchives($table) | ||
{ | ||
// rename old UserSettings archives where no DeviceDetection archives exists | ||
Db::exec(sprintf("UPDATE IGNORE %s SET name='DevicesDetection_browserVersions' WHERE name = 'UserSettings_browser'", $table)); | ||
|
||
/* | ||
* check dates of remaining (non-day) archives with calculated safe date | ||
* archives before or within that week/month/year of that date will be replaced | ||
*/ | ||
$oldBrowserBlobs = Db::get()->fetchAll(sprintf("SELECT * FROM %s WHERE name = 'UserSettings_browser' AND `period` > 1", $table)); | ||
foreach ($oldBrowserBlobs as $blob) { | ||
|
||
// if start date of blob is before calculated date us old usersettings archive instead of already existing DevicesDetection archive | ||
if (strtotime($blob['date1']) < self::getFirstDayOfArchivedDeviceDetectorData()) { | ||
|
||
Db::get()->query(sprintf("DELETE FROM %s WHERE idarchive = ? AND name = ?", $table), array($blob['idarchive'], 'DevicesDetection_browserVersions')); | ||
Db::get()->query(sprintf("UPDATE %s SET name = ? WHERE idarchive = ? AND name = ?", $table), array('DevicesDetection_browserVersions', $blob['idarchive'], 'UserSettings_browser')); | ||
} | ||
} | ||
|
||
// rebuild archives without versions | ||
$browserBlobs = Db::get()->fetchAll(sprintf("SELECT * FROM %s WHERE name = 'DevicesDetection_browserVersions'", $table)); | ||
foreach ($browserBlobs as $blob) { | ||
self::createArchiveBlobWithoutVersions($blob, 'DevicesDetection_browsers', $table); | ||
} | ||
} | ||
|
||
public static function updateOsArchives($table) { | ||
Db::exec(sprintf("UPDATE IGNORE %s SET name='DevicesDetection_osVersions' WHERE name = 'UserSettings_os'", $table)); | ||
|
||
/* | ||
* check dates of remaining (non-day) archives with calculated safe date | ||
* archives before or within that week/month/year of that date will be replaced | ||
*/ | ||
$oldOsBlobs = Db::get()->fetchAll(sprintf("SELECT * FROM %s WHERE name = 'UserSettings_os' AND `period` > 1", $table)); | ||
foreach ($oldOsBlobs as $blob) { | ||
|
||
// if start date of blob is before calculated date us old usersettings archive instead of already existing DevicesDetection archive | ||
if (strtotime($blob['date1']) < self::getFirstDayOfArchivedDeviceDetectorData()) { | ||
|
||
Db::get()->query(sprintf("DELETE FROM %s WHERE idarchive = ? AND name = ?", $table), array($blob['idarchive'], 'DevicesDetection_osVersions')); | ||
Db::get()->query(sprintf("UPDATE %s SET name = ? WHERE idarchive = ? AND name = ?", $table), array('DevicesDetection_osVersions', $blob['idarchive'], 'UserSettings_os')); | ||
} | ||
} | ||
|
||
// rebuild archives without versions | ||
$osBlobs = Db::get()->fetchAll(sprintf("SELECT * FROM %s WHERE name = 'DevicesDetection_osVersions'", $table)); | ||
foreach ($osBlobs as $blob) { | ||
self::createArchiveBlobWithoutVersions($blob, 'DevicesDetection_os', $table); | ||
} | ||
} | ||
|
||
protected static function createArchiveBlobWithoutVersions($blob, $newName, $table) | ||
{ | ||
$blob['value'] = @gzuncompress($blob['value']); | ||
|
||
$datatable = DataTable::fromSerializedArray($blob['value']); | ||
$datatable->filter('GroupBy', array('label', function ($label) { | ||
if (preg_match("/(.+) [0-9]+(?:\.[0-9]+)?$/", $label, $matches)) { | ||
return $matches[1]; // should match for browsers | ||
} | ||
|
||
if (strpos($label, ';')) { | ||
return substr($label, 0, 3); // should match for os | ||
} | ||
|
||
return $label; | ||
})); | ||
|
||
$newData = $datatable->getSerialized(); | ||
|
||
$blob['value'] = @gzcompress($newData[0]); | ||
$blob['name'] = $newName; | ||
|
||
Db::get()->query(sprintf('REPLACE INTO %s (`idarchive`, `name`, `idsite`, `date1`, `date2`, `period`, `ts_archived`, `value`) VALUES (?, ? , ?, ?, ?, ?, ?, ?)', $table), array_values($blob)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
im not sure I understand why
AND
period> 1
here?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Day archives are always complete, so period > 1 should select all archives that are not a day archive