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@gmail.com>2015-11-17 07:03:04 +0300
committerThomas Steur <thomas.steur@gmail.com>2015-11-19 07:14:31 +0300
commit433c5c93a8524bd5d4dec7c6f73bc8dca957cb66 (patch)
treef95d8f47d6f716e0199f3c9222f472daa14dae17 /core/Segment.php
parent1de540f1003eb303f73098ae690a8ef366977d2f (diff)
refs #8076 #9224 adding new segment ActionUrl + new operators starts with and ends with
Diffstat (limited to 'core/Segment.php')
-rw-r--r--core/Segment.php103
1 files changed, 72 insertions, 31 deletions
diff --git a/core/Segment.php b/core/Segment.php
index 451afdb393..d9f8d163c6 100644
--- a/core/Segment.php
+++ b/core/Segment.php
@@ -110,6 +110,35 @@ class Segment
}
}
+ private function getAvailableSegments()
+ {
+ // segment metadata
+ if (empty($this->availableSegments)) {
+ $this->availableSegments = API::getInstance()->getSegmentsMetadata($this->idSites, $_hideImplementationData = false);
+ }
+
+ return $this->availableSegments;
+ }
+
+ private function getSegmentByName($name)
+ {
+ $segments = $this->getAvailableSegments();
+
+ foreach ($segments as $segment) {
+ if ($segment['segment'] == $name && !empty($name)) {
+
+ // check permission
+ if (isset($segment['permission']) && $segment['permission'] != 1) {
+ throw new NoAccessException("You do not have enough permission to access the segment " . $name);
+ }
+
+ return $segment;
+ }
+ }
+
+ throw new Exception("Segment '$name' is not a supported segment.");
+ }
+
/**
* @param $string
* @param $idSites
@@ -127,6 +156,7 @@ class Segment
// parse segments
$expressions = $segment->parseSubExpressions();
+ $expressions = $this->getExpressionsWithUnionsResolved($expressions);
// convert segments name to sql segment
// check that user is allowed to view this segment
@@ -142,6 +172,41 @@ class Segment
$segment->setSubExpressionsAfterCleanup($cleanedExpressions);
}
+ private function getExpressionsWithUnionsResolved($expressions)
+ {
+ $expressionsWithUnions = array();
+ foreach ($expressions as $expression) {
+ $operand = $expression[SegmentExpression::INDEX_OPERAND];
+ $name = $operand[SegmentExpression::INDEX_OPERAND_NAME];
+
+ $availableSegment = $this->getSegmentByName($name);
+
+ if (!empty($availableSegment['unionOfSegments'])) {
+ $count = 0;
+ foreach ($availableSegment['unionOfSegments'] as $segmentNameOfUnion) {
+ $count++;
+ $operator = SegmentExpression::BOOL_OPERATOR_OR; // we connect all segments within that union via OR
+ if ($count === count($availableSegment['unionOfSegments'])) {
+ $operator = $expression[SegmentExpression::INDEX_BOOL_OPERATOR];
+ }
+
+ $operand[SegmentExpression::INDEX_OPERAND_NAME] = $segmentNameOfUnion;
+ $expressionsWithUnions[] = array(
+ SegmentExpression::INDEX_BOOL_OPERATOR => $operator,
+ SegmentExpression::INDEX_OPERAND => $operand
+ );
+ }
+ } else {
+ $expressionsWithUnions[] = array(
+ SegmentExpression::INDEX_BOOL_OPERATOR => $expression[SegmentExpression::INDEX_BOOL_OPERATOR],
+ SegmentExpression::INDEX_OPERAND => $operand
+ );
+ }
+ }
+
+ return $expressionsWithUnions;
+ }
+
/**
* Returns `true` if the segment is empty, `false` if otherwise.
*/
@@ -154,33 +219,15 @@ class Segment
protected function getCleanedExpression($expression)
{
- if (empty($this->availableSegments)) {
- $this->availableSegments = API::getInstance()->getSegmentsMetadata($this->idSites, $_hideImplementationData = false);
- }
+ $name = $expression[SegmentExpression::INDEX_OPERAND_NAME];
+ $matchType = $expression[SegmentExpression::INDEX_OPERAND_OPERATOR];
+ $value = $expression[SegmentExpression::INDEX_OPERAND_VALUE];
- $name = $expression[0];
- $matchType = $expression[1];
- $value = $expression[2];
- $sqlName = '';
+ $segment = $this->getSegmentByName($name);
+ $sqlName = $segment['sqlSegment'];
- foreach ($this->availableSegments as $segment) {
- if ($segment['segment'] != $name) {
- continue;
- }
-
- $sqlName = $segment['sqlSegment'];
-
- // check permission
- if (isset($segment['permission'])
- && $segment['permission'] != 1
- ) {
- throw new NoAccessException("You do not have enough permission to access the segment " . $name);
- }
-
- if ($matchType == SegmentExpression::MATCH_IS_NOT_NULL_NOR_EMPTY
- || $matchType == SegmentExpression::MATCH_IS_NULL_OR_EMPTY) {
- break;
- }
+ if ($matchType != SegmentExpression::MATCH_IS_NOT_NULL_NOR_EMPTY
+ && $matchType != SegmentExpression::MATCH_IS_NULL_OR_EMPTY) {
if (isset($segment['sqlFilterValue'])) {
$value = call_user_func($segment['sqlFilterValue'], $value);
@@ -201,12 +248,6 @@ class Segment
$matchType = SegmentExpression::MATCH_ACTIONS_CONTAINS;
}
}
-
- break;
- }
-
- if (empty($sqlName)) {
- throw new Exception("Segment '$name' is not a supported segment.");
}
return array($sqlName, $matchType, $value);