Skip to content

Commit

Permalink
Refactor API.getSegmentsMetadata and Plugin\Segment so segments are a…
Browse files Browse the repository at this point in the history
…ll defined through Plugin\Segment class in dimensions & make sure AutoSuggestAPITest data providers do not use database.
  • Loading branch information
diosmosis committed Sep 2, 2015
1 parent 76adbdc commit 173259c
Show file tree
Hide file tree
Showing 10 changed files with 204 additions and 67 deletions.
26 changes: 26 additions & 0 deletions core/Plugin/Segment.php
Expand Up @@ -52,6 +52,12 @@ class Segment
private $permission;
private $suggestedValuesCallback;

/**
* TODO
* @var bool
*/
private $requiresAtLeastViewAccess = false;

/**
* @ignore
*/
Expand Down Expand Up @@ -255,4 +261,24 @@ public function toArray()

return $segment;
}

/**
* TODO
* @return boolean
* @ignore
*/
public function isRequiresAtLeastViewAccess()
{
return $this->requiresAtLeastViewAccess;
}

/**
* TODO
* @param boolean $requiresAtLeastViewAccess
* @ignore
*/
public function setRequiresAtLeastViewAccess($requiresAtLeastViewAccess)
{
$this->requiresAtLeastViewAccess = $requiresAtLeastViewAccess;
}
}
51 changes: 6 additions & 45 deletions plugins/API/API.php
Expand Up @@ -120,10 +120,15 @@ public function getAvailableMeasurableTypes()

public function getSegmentsMetadata($idSites = array(), $_hideImplementationData = true)
{
$segments = array();
$isAuthenticatedWithViewAccess = Piwik::isUserHasViewAccess($idSites) && !Piwik::isUserIsAnonymous();

$segments = array();
foreach (Dimension::getAllDimensions() as $dimension) {
foreach ($dimension->getSegments() as $segment) {
if ($segment->isRequiresAtLeastViewAccess()) {
$segment->setPermission($isAuthenticatedWithViewAccess);
}

$segments[] = $segment->toArray();
}
}
Expand Down Expand Up @@ -176,50 +181,6 @@ public function getSegmentsMetadata($idSites = array(), $_hideImplementationData
*/
Piwik::postEvent('API.getSegmentDimensionMetadata', array(&$segments, $idSites));

$isAuthenticatedWithViewAccess = Piwik::isUserHasViewAccess($idSites) && !Piwik::isUserIsAnonymous();

$segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => 'General_UserId',
'segment' => 'userId',
'acceptedValues' => 'any non empty unique string identifying the user (such as an email address or a username).',
'sqlSegment' => 'log_visit.user_id',
'permission' => $isAuthenticatedWithViewAccess,
);

$segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => 'General_VisitorID',
'segment' => 'visitorId',
'acceptedValues' => '34c31e04394bdc63 - any 16 Hexadecimal chars ID, which can be fetched using the Tracking API function getVisitorId()',
'sqlSegment' => 'log_visit.idvisitor',
'sqlFilterValue' => array('Piwik\Common', 'convertVisitorIdToBin'),
'permission' => $isAuthenticatedWithViewAccess,
);

$segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => Piwik::translate('General_Visit') . " ID",
'segment' => 'visitId',
'acceptedValues' => 'Any integer. ',
'sqlSegment' => 'log_visit.idvisit',
'permission' => $isAuthenticatedWithViewAccess,
);

$segments[] = array(
'type' => 'metric',
'category' => Piwik::translate('General_Visit'),
'name' => 'General_VisitorIP',
'segment' => 'visitIp',
'acceptedValues' => '13.54.122.1. </code>Select IP ranges with notation: <code>visitIp>13.54.122.0;visitIp<13.54.122.255',
'sqlSegment' => 'log_visit.location_ip',
'sqlFilterValue' => array('Piwik\Network\IPUtils', 'stringToBinaryIP'),
'permission' => $isAuthenticatedWithViewAccess,
);

foreach ($segments as &$segment) {
$segment['name'] = Piwik::translate($segment['name']);
$segment['category'] = Piwik::translate($segment['category']);
Expand Down
15 changes: 15 additions & 0 deletions plugins/CoreHome/Columns/UserId.php
Expand Up @@ -12,7 +12,9 @@
use Piwik\DataTable;
use Piwik\DataTable\Map;
use Piwik\Period\Range;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
use Piwik\Plugins\VisitsSummary\API as VisitsSummaryApi;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
Expand All @@ -33,6 +35,19 @@ class UserId extends VisitDimension
*/
protected $columnType = 'VARCHAR(200) NULL';

protected function configureSegments()
{
$segment = new Segment();
$segment->setType('dimension');
$segment->setSegment('userId');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName('General_UserId');
$segment->setAcceptedValues('any non empty unique string identifying the user (such as an email address or a username).');
$segment->setSqlSegment('log_visit.user_id');
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}

/**
* @param Request $request
* @param Visitor $visitor
Expand Down
34 changes: 34 additions & 0 deletions plugins/CoreHome/Columns/VisitId.php
@@ -0,0 +1,34 @@
<?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\Plugins\CoreHome\Columns;

use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;

/**
* TODO
*/
class VisitId extends VisitDimension
{
protected function configureSegments()
{
parent::configureSegments();

$segment = new Segment();
$segment->setType('dimension');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName(Piwik::translate('General_Visit') . " ID");
$segment->setSegment('visitId');
$segment->setAcceptedValues('Any integer.');
$segment->setSqlSegment('log_visit.idvisit');
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}
}
35 changes: 35 additions & 0 deletions plugins/CoreHome/Columns/VisitIp.php
@@ -0,0 +1,35 @@
<?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\Plugins\CoreHome\Columns;

use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;

/**
* TODO
*/
class VisitIp extends VisitDimension
{
protected function configureSegments()
{
parent::configureSegments();

$segment = new Segment();
$segment->setType('metric');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName('General_VisitorIP');
$segment->setSegment('visitIp');
$segment->setAcceptedValues('13.54.122.1. </code>Select IP ranges with notation: <code>visitIp>13.54.122.0;visitIp<13.54.122.255');
$segment->setSqlSegment('log_visit.location_ip');
$segment->setSqlFilterValue(array('Piwik\Network\IPUtils', 'stringToBinaryIP'));
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}
}
35 changes: 35 additions & 0 deletions plugins/CoreHome/Columns/VisitorId.php
@@ -0,0 +1,35 @@
<?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\Plugins\CoreHome\Columns;

use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;

/**
* TODO
*/
class VisitorId extends VisitDimension
{
protected function configureSegments()
{
parent::configureSegments();

$segment = new Segment();
$segment->setType('dimension');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName('General_VisitorID');
$segment->setSegment('visitorId');
$segment->setAcceptedValues('34c31e04394bdc63 - any 16 Hexadecimal chars ID, which can be fetched using the Tracking API function getVisitorId()');
$segment->setSqlSegment('log_visit.idvisitor');
$segment->setSqlFilterValue(array('Piwik\Common', 'convertVisitorIdToBin'));
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}
}
3 changes: 2 additions & 1 deletion plugins/CustomVariables/Model.php
Expand Up @@ -18,6 +18,7 @@ class Model
const SCOPE_PAGE = 'log_link_visit_action';
const SCOPE_VISIT = 'log_visit';
const SCOPE_CONVERSION = 'log_conversion';
const DEFAULT_CUSTOM_VAR_COUNT = 5;

private $scope = null;

Expand Down Expand Up @@ -159,7 +160,7 @@ public static function install()
$model = new Model($scope);

try {
$maxCustomVars = 5;
$maxCustomVars = self::DEFAULT_CUSTOM_VAR_COUNT;
$customVarsToAdd = $maxCustomVars - $model->getCurrentNumCustomVars();

for ($index = 0; $index < $customVarsToAdd; $index++) {
Expand Down
58 changes: 44 additions & 14 deletions tests/PHPUnit/System/AutoSuggestAPITest.php
Expand Up @@ -8,8 +8,11 @@
namespace Piwik\Tests\System;

use Piwik\API\Request;
use Piwik\Application\Environment;
use Piwik\Columns\Dimension;
use Piwik\Common;
use Piwik\Date;
use Piwik\Plugins\CustomVariables\Model;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
use Piwik\Tests\Fixtures\ManyVisitsWithGeoIP;
use Piwik\Tests\Framework\Fixture;
Expand Down Expand Up @@ -45,15 +48,12 @@ public function testApi($api, $params)

public function getApiForTesting()
{
// we will test all segments from all plugins
Fixture::loadAllPlugins();

$idSite = self::$fixture->idSite;
$apiForTesting = array();
$segments = self::getSegmentsMetadata();

$segments = \Piwik\Plugins\API\API::getInstance()->getSegmentsMetadata(self::$fixture->idSite);
$apiForTesting = array();
foreach ($segments as $segment) {
$apiForTesting[] = $this->getApiForTestingForSegment($idSite, $segment['segment']);
$apiForTesting[] = $this->getApiForTestingForSegment($idSite, $segment);
}

if (self::isMysqli() || self::isTravisCI()) {
Expand Down Expand Up @@ -119,20 +119,20 @@ public function testAnotherApi($api, $params)

public function getAnotherApiForTesting()
{
$segments = self::getSegmentsMetadata(self::$fixture->idSite);
$segments = self::getSegmentsMetadata();

$apiForTesting = array();
foreach ($segments as $segment) {
if(self::isTravisCI() && $segment['segment'] == 'deviceType') {
if(self::isTravisCI() && $segment == 'deviceType') {
// test started failing after bc19503 and I cannot understand why
continue;
}
$apiForTesting[] = array('VisitsSummary.get',
array('idSite' => self::$fixture->idSite,
'date' => date("Y-m-d", strtotime(self::$fixture->dateTime)) . ',today',
'period' => 'range',
'testSuffix' => '_' . $segment['segment'],
'segmentToComplete' => $segment['segment']));
'testSuffix' => '_' . $segment,
'segmentToComplete' => $segment));
}
return $apiForTesting;
}
Expand All @@ -153,15 +153,45 @@ public function testCheckOtherTestsWereComplete()
$this->assertGreaterThan($minimumSegmentsToTest, self::$processed, $message);
}

public static function getSegmentsMetadata($idSite)
public static function getSegmentsMetadata()
{
// Refresh cache for CustomVariables\Model
Cache::clearCacheGeneral();

\Piwik\Plugins\CustomVariables\Model::install();
$segments = array();

$environment = new Environment(null);

$exception = null;
try {
$environment->init();
$environment->getContainer()->get('Piwik\Plugin\Manager')->loadActivatedPlugins();

foreach (Dimension::getAllDimensions() as $dimension) {
foreach ($dimension->getSegments() as $segment) {
$segments[] = $segment->getSegment();
}
}

// add CustomVariables manually since the data provider may not have access to the DB
for ($i = 1; $i != Model::DEFAULT_CUSTOM_VAR_COUNT + 1; ++$i) {
$segments[] = 'customVariableName' . $i;
$segments[] = 'customVariableValue' . $i;
$segments[] = 'customVariablePageName' . $i;
$segments[] = 'customVariablePageValue' . $i;
}
} catch (\Exception $ex) {
$exception = $ex;

echo $ex->getMessage()."\n".$ex->getTraceAsString()."\n";
}

$environment->destroy();

if (!empty($exception)) {
throw $exception;
}

// Segment matching NONE
$segments = \Piwik\Plugins\API\API::getInstance()->getSegmentsMetadata($idSite);
return $segments;
}
}
Expand Down
Expand Up @@ -48,7 +48,7 @@ public function getApiForTesting()

public function getSegmentToTest()
{
$segments = AutoSuggestAPITest::getSegmentsMetadata(self::$fixture->idSite);
$segments = AutoSuggestAPITest::getSegmentsMetadata();

$minimumExpectedSegmentsCount = 55; // as of Piwik 1.12
$this->assertGreaterThan($minimumExpectedSegmentsCount, count($segments));
Expand All @@ -57,18 +57,18 @@ public function getSegmentToTest()
$seenVisitorId = false;
foreach ($segments as $segment) {
$value = 'campaign';
if ($segment['segment'] == 'visitorId') {
if ($segment == 'visitorId') {
$seenVisitorId = true;
$value = '34c31e04394bdc63';
}
if ($segment['segment'] == 'visitEcommerceStatus') {
if ($segment == 'visitEcommerceStatus') {
$value = 'none';
}
$matchNone = $segment['segment'] . '!=' . $value;
$matchNone = $segment . '!=' . $value;

// deviceType != campaign matches ALL visits, but we want to match None
if($segment['segment'] == 'deviceType') {
$matchNone = $segment['segment'] . '==car%20browser';
if($segment == 'deviceType') {
$matchNone = $segment . '==car%20browser';
}
$segmentExpression[] = $matchNone;
}
Expand Down

0 comments on commit 173259c

Please sign in to comment.