diff --git a/core/Segment.php b/core/Segment.php index 401c1307a137a9fdeeeeca46165d8fe28de7cc50..e54b7aac3b6409f1d47c88ed6885159db191a9a0 100644 --- a/core/Segment.php +++ b/core/Segment.php @@ -5,9 +5,18 @@ class Piwik_Segment * @var Piwik_SegmentExpression */ protected $segment = null; + + /** + * Truncate the Segments to 4k + */ + const SEGMENT_TRUNCATE_LIMIT = 4096; + public function __construct($string, $idSites) { $string = trim($string); + // As a preventive measure, we restrict the filter size to a safe limit + $string = substr($string, 0, self::SEGMENT_TRUNCATE_LIMIT); + $this->string = $string; $this->idSites = $idSites; $segment = new Piwik_SegmentExpression($string); @@ -46,7 +55,8 @@ class Piwik_Segment { $expressions = $this->segment->parsedSubExpressions; $uniqueFields = array(); - foreach($expressions as $expression) { + foreach($expressions as $expression) + { $uniqueFields[] = $expression[Piwik_SegmentExpression::INDEX_OPERAND][0]; } return $uniqueFields; diff --git a/plugins/API/API.php b/plugins/API/API.php index 2f706fa0b942d08b25054db8bafa18a5cec9e693..995499cec693213529acd2b5063014ba58ce2711 100644 --- a/plugins/API/API.php +++ b/plugins/API/API.php @@ -105,8 +105,9 @@ class Piwik_API_API 'category' => 'Visit', 'name' => 'General_VisitorIP', 'segment' => 'visitIp', + 'acceptedValues' => '13.54.122.1, etc.', 'sqlSegment' => 'location_ip', - 'sqlFilter' => array('Piwik_Common', 'long2ip'), + 'sqlFilter' => array('Piwik_Common', 'getIp'), 'permission' => Piwik::isUserHasAdminAccess($idSites), ); $segments[] = array( @@ -160,7 +161,7 @@ class Piwik_API_API $columns = array('type', 'category', 'name', 'segment'); foreach($columns as $column) { - $compare = strcmp($row1[$column], $row2[$column]); + $compare = -1 * strcmp($row1[$column], $row2[$column]); if($compare != 0){ return $compare; } diff --git a/plugins/API/Controller.php b/plugins/API/Controller.php index 9b2ef803520fb392312d3530336146080ff37a91..9cedb5ed1e455fc4eecbacf2284c6b178979d5d3 100644 --- a/plugins/API/Controller.php +++ b/plugins/API/Controller.php @@ -43,4 +43,73 @@ class Piwik_API_Controller extends Piwik_Controller $view->list_api_methods_with_links = $ApiDocumentation->getAllInterfaceString(); echo $view->render(); } + + public function listSegments() + { + $segments = Piwik_API_API::getInstance()->getSegmentsMetadata($this->idSite); + + $tableDimensions = $tableMetrics = ''; + $customVariables=0; + $lastCategory=array(); + foreach($segments as $segment) + { + $customVariableWillBeDisplayed = in_array($segment['segment'], $onlyDisplay = array('customVariableName1', 'customVariableName2', 'customVariableValue1', 'customVariableValue2')); + // Don't display more than 4 custom variables name/value rows + if($segment['category'] == 'Custom Variables' + && !$customVariableWillBeDisplayed) + { + continue; + } + + $thisCategory = $segment['category']; + $output = ''; + if(empty($lastCategory[$segment['type']]) + || $lastCategory[$segment['type']] != $thisCategory) + { + $output .= '<tr><td colspan="2"><b>'.$thisCategory.'</b></td></tr>'; + } + + $lastCategory[$segment['type']] = $thisCategory; + + $exampleValues = isset($segment['acceptedValues']) + ? 'Example values: <code>'.$segment['acceptedValues'].'</code>' + : ''; + $output .= '<tr> + <td>'.$segment['segment'].'</td> + <td>'.$segment['name'] .'<br/>'.$exampleValues.' </td> + </tr>'; + + // Show only 2 custom variables and display message for rest + if($customVariableWillBeDisplayed) + { + $customVariables++; + if($customVariables == 4) + { + $output .= '<tr><td> There are 5 custom variables available, so you can segment across any segment name and value range. + <br/>For example, <code>customVariableName1==Type;customVariableValue1==Customer</code> + <br/>Returns all visitors that have the Custom Variable "Type" set to "Customer". + </td></tr>'; + } + } + + + if($segment['type'] == 'dimension') { + $tableDimensions .= $output; + } else { + $tableMetrics .= $output; + } + } + + echo " + <b>Dimensions</b> + <table> + $tableDimensions + </table> + <br/> + <b>Metrics</b> + <table> + $tableMetrics + </table> + "; + } } diff --git a/plugins/Provider/Provider.php b/plugins/Provider/Provider.php index 826adc90daaa8eb41e7a6adaae8d78068c5dda58..3985d8f439fa47aa1986dab70af408362c295413 100644 --- a/plugins/Provider/Provider.php +++ b/plugins/Provider/Provider.php @@ -63,6 +63,7 @@ class Piwik_Provider extends Piwik_Plugin 'category' => 'Visit', 'name' => Piwik_Translate('Provider_ColumnProvider'), 'segment' => 'provider', + 'acceptedValues' => 'comcast.net, proxad.net, etc.', 'sqlSegment' => 'location_provider' ); } diff --git a/plugins/Referers/Referers.php b/plugins/Referers/Referers.php index 43986d1b77ff7cedf4e92af949c7ef88cd15a53b..b012f81b4a28492d78f9dd174cb6481b85d69dff 100644 --- a/plugins/Referers/Referers.php +++ b/plugins/Referers/Referers.php @@ -110,6 +110,7 @@ class Piwik_Referers extends Piwik_Plugin 'category' => 'Referers_Referers', 'name' => 'Referers_ColumnKeyword', 'segment' => 'referrerKeyword', + 'acceptedValues' => 'Encoded%20Keyword, keyword', 'sqlSegment' => 'referer_keyword', ); $segments[] = array( @@ -117,12 +118,14 @@ class Piwik_Referers extends Piwik_Plugin 'category' => 'Referers_Referers', 'name' => 'Referers_RefererName', 'segment' => 'referrerName', + 'acceptedValues' => 'twitter.com, www.facebook.com, Bing, Google, Yahoo, CampaignName', 'sqlSegment' => 'referer_name', ); $segments[] = array( 'type' => 'dimension', 'category' => 'Referers_Referers', 'name' => 'Live_Referrer_URL', + 'acceptedValues' => 'http%3A%2F%2Fwww.example.org%2Freferer-page.htm', 'segment' => 'referrerUrl', 'sqlSegment' => 'referer_url', ); diff --git a/plugins/VisitTime/VisitTime.php b/plugins/VisitTime/VisitTime.php index 8a28162afff964beefc53f2f9a80e445381aecb3..b65d060c8c565381660a81103a49d2a46eda11ea 100644 --- a/plugins/VisitTime/VisitTime.php +++ b/plugins/VisitTime/VisitTime.php @@ -85,13 +85,14 @@ class Piwik_VisitTime extends Piwik_Plugin public function getSegmentsMetadata($notification) { $segments =& $notification->getNotificationObject(); + $acceptedValues = "0, 1, 2, 3, ..., 20, 21, 22, 23"; $segments[] = array( 'type' => 'dimension', 'category' => 'Visit', 'name' => Piwik_Translate('VisitTime_ColumnServerTime'), 'segment' => 'visitServerHour', 'sqlSegment' => 'HOUR(visit_last_action_time)', - 'acceptedValues' => implode(',', range(0, 23, 1)) + 'acceptedValues' => $acceptedValues ); $segments[] = array( 'type' => 'dimension', @@ -99,7 +100,7 @@ class Piwik_VisitTime extends Piwik_Plugin 'name' => Piwik_Translate('VisitTime_ColumnLocalTime'), 'segment' => 'visitLocalHour', 'sqlSegment' => 'HOUR(visitor_localtime)', - 'acceptedValues' => implode(',', range(0, 23, 1)) + 'acceptedValues' => $acceptedValues ); } diff --git a/tests/integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml b/tests/integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml index aab6df6964fe5fc83af48aab57c7d4df00cffb95..1f68948137ba8950c5ab882fdba3857acc25e91b 100644 --- a/tests/integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml +++ b/tests/integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml @@ -1,200 +1,205 @@ <?xml version="1.0" encoding="utf-8" ?> <result> <row> - <type>dimension</type> - <category>Actions</category> - <name>Entry Page URL</name> - <segment>entryPageUrl</segment> + <type>metric</type> + <category>Visit</category> + <name>Visit Duration (in seconds)</name> + <segment>visitDuration</segment> </row> <row> - <type>dimension</type> - <category>Actions</category> - <name>Entry Page title</name> - <segment>entryPageTitle</segment> + <type>metric</type> + <category>Visit</category> + <name>Number of Actions</name> + <segment>actions</segment> </row> <row> <type>dimension</type> - <category>Actions</category> - <name>Exit Page Title</name> - <segment>exitPageTitle</segment> + <category>Visit</category> + <name>Visitor type</name> + <segment>visitorType</segment> + <acceptedValues>new, returning</acceptedValues> </row> <row> <type>dimension</type> - <category>Actions</category> - <name>Exit Page URL</name> - <segment>exitPageUrl</segment> + <category>Visit</category> + <name>Visitor IP</name> + <segment>visitIp</segment> + <acceptedValues>13.54.122.1, etc.</acceptedValues> + <permission>1</permission> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable name 1</name> - <segment>customVariableName1</segment> + <category>Visit</category> + <name>Server time</name> + <segment>visitServerHour</segment> + <acceptedValues>0, 1, 2, 3, ..., 20, 21, 22, 23</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable name 2</name> - <segment>customVariableName2</segment> + <category>Visit</category> + <name>Resolution</name> + <segment>resolution</segment> + <acceptedValues>1280x1024, 800x600, etc.</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable name 3</name> - <segment>customVariableName3</segment> + <category>Visit</category> + <name>Provider</name> + <segment>provider</segment> + <acceptedValues>comcast.net, proxad.net, etc.</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable name 4</name> - <segment>customVariableName4</segment> + <category>Visit</category> + <name>Operating system</name> + <segment>operatingSystem</segment> + <acceptedValues>WXP, WI7, MAC, LIN, AND, IPD, etc.</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable name 5</name> - <segment>customVariableName5</segment> + <category>Visit</category> + <name>Local time</name> + <segment>visitLocalHour</segment> + <acceptedValues>0, 1, 2, 3, ..., 20, 21, 22, 23</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable value 1</name> - <segment>customVariableValue1</segment> + <category>Visit</category> + <name>Country</name> + <segment>country</segment> + <acceptedValues>de, us, fr, in, es, etc.</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable value 2</name> - <segment>customVariableValue2</segment> + <category>Visit</category> + <name>Continent</name> + <segment>continent</segment> + <acceptedValues>eur, asi, amc, amn, ams, afr, ant, oce</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable value 3</name> - <segment>customVariableValue3</segment> + <category>Visit</category> + <name>Browser version</name> + <segment>browserVersion</segment> + <acceptedValues>1.0, 8.0, etc.</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable value 4</name> - <segment>customVariableValue4</segment> + <category>Visit</category> + <name>Browser</name> + <segment>browserName</segment> + <acceptedValues>FF, IE, CH, SF, OP, etc.</acceptedValues> </row> <row> <type>dimension</type> - <category>Custom Variables</category> - <name>Custom Variable value 5</name> - <segment>customVariableValue5</segment> + <category>Referrers</category> + <name>Referrer URL</name> + <acceptedValues>http%3A%2F%2Fwww.example.org%2Freferer-page.htm</acceptedValues> + <segment>referrerUrl</segment> </row> <row> <type>dimension</type> <category>Referrers</category> - <name>Keyword</name> - <segment>referrerKeyword</segment> + <name>Referrer Type</name> + <segment>referrerType</segment> + <acceptedValues>direct, search, website, campaign</acceptedValues> </row> <row> <type>dimension</type> <category>Referrers</category> <name>Referrer Name</name> <segment>referrerName</segment> + <acceptedValues>twitter.com, www.facebook.com, Bing, Google, Yahoo, CampaignName</acceptedValues> </row> <row> <type>dimension</type> <category>Referrers</category> - <name>Referrer Type</name> - <segment>referrerType</segment> - <acceptedValues>direct, search, website, campaign</acceptedValues> + <name>Keyword</name> + <segment>referrerKeyword</segment> + <acceptedValues>Encoded%20Keyword, keyword</acceptedValues> </row> <row> <type>dimension</type> - <category>Referrers</category> - <name>Referrer URL</name> - <segment>referrerUrl</segment> + <category>Custom Variables</category> + <name>Custom Variable value 5</name> + <segment>customVariableValue5</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Browser</name> - <segment>browserName</segment> - <acceptedValues>FF, IE, CH, SF, OP, etc.</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable value 4</name> + <segment>customVariableValue4</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Browser version</name> - <segment>browserVersion</segment> - <acceptedValues>1.0, 8.0, etc.</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable value 3</name> + <segment>customVariableValue3</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Continent</name> - <segment>continent</segment> - <acceptedValues>eur, asi, amc, amn, ams, afr, ant, oce</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable value 2</name> + <segment>customVariableValue2</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Country</name> - <segment>country</segment> - <acceptedValues>de, us, fr, in, es, etc.</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable value 1</name> + <segment>customVariableValue1</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Local time</name> - <segment>visitLocalHour</segment> - <acceptedValues>0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable name 5</name> + <segment>customVariableName5</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Operating system</name> - <segment>operatingSystem</segment> - <acceptedValues>WXP, WI7, MAC, LIN, AND, IPD, etc.</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable name 4</name> + <segment>customVariableName4</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Provider</name> - <segment>provider</segment> + <category>Custom Variables</category> + <name>Custom Variable name 3</name> + <segment>customVariableName3</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Resolution</name> - <segment>resolution</segment> - <acceptedValues>1280x1024, 800x600, etc.</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable name 2</name> + <segment>customVariableName2</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Server time</name> - <segment>visitServerHour</segment> - <acceptedValues>0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23</acceptedValues> + <category>Custom Variables</category> + <name>Custom Variable name 1</name> + <segment>customVariableName1</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Visitor IP</name> - <segment>visitIp</segment> - <permission>1</permission> + <category>Actions</category> + <name>Exit Page URL</name> + <segment>exitPageUrl</segment> </row> <row> <type>dimension</type> - <category>Visit</category> - <name>Visitor type</name> - <segment>visitorType</segment> - <acceptedValues>new, returning</acceptedValues> + <category>Actions</category> + <name>Exit Page Title</name> + <segment>exitPageTitle</segment> </row> <row> - <type>metric</type> - <category>Visit</category> - <name>Number of Actions</name> - <segment>actions</segment> + <type>dimension</type> + <category>Actions</category> + <name>Entry Page title</name> + <segment>entryPageTitle</segment> </row> <row> - <type>metric</type> - <category>Visit</category> - <name>Visit Duration (in seconds)</name> - <segment>visitDuration</segment> + <type>dimension</type> + <category>Actions</category> + <name>Entry Page URL</name> + <segment>entryPageUrl</segment> </row> </result> \ No newline at end of file