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 /plugins/API
parent1de540f1003eb303f73098ae690a8ef366977d2f (diff)
refs #8076 #9224 adding new segment ActionUrl + new operators starts with and ends with
Diffstat (limited to 'plugins/API')
-rw-r--r--plugins/API/API.php93
1 files changed, 70 insertions, 23 deletions
diff --git a/plugins/API/API.php b/plugins/API/API.php
index 4ea0cb4055..09e4719824 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -129,6 +129,14 @@ class API extends \Piwik\Plugin\API
$segment->setPermission($isAuthenticatedWithViewAccess);
}
+ if ($segment->getSqlSegment() && $segment->getUnionOfSegments()) {
+ throw new \Exception(sprintf('Union of segments and SQL segment is set for segment "%s", use only one of them', $segment->getName()));
+ }
+
+ if ($segment->getUnionOfSegments() && in_array($segment->getSegment(), $segment->getUnionOfSegments(), true)) {
+ throw new \Exception(sprintf('The segment %s contains a union segment to itself', $segment->getName()));
+ }
+
$segments[] = $segment->toArray();
}
}
@@ -493,30 +501,20 @@ class API extends \Piwik\Plugin\API
if (empty(Config::getInstance()->General['enable_segment_suggested_values'])) {
return array();
}
+
Piwik::checkUserHasViewAccess($idSite);
$maxSuggestionsToReturn = 30;
- $segmentsMetadata = $this->getSegmentsMetadata($idSite, $_hideImplementationData = false);
-
- $segmentFound = false;
- foreach ($segmentsMetadata as $segmentMetadata) {
- if ($segmentMetadata['segment'] == $segmentName) {
- $segmentFound = $segmentMetadata;
- break;
- }
- }
- if (empty($segmentFound)) {
- throw new \Exception("Requested segment not found.");
- }
+ $segment = $this->findSegment($segmentName, $idSite);
// if segment has suggested values callback then return result from it instead
$suggestedValuesCallbackRequiresTable = false;
- if (isset($segmentFound['suggestedValuesCallback'])) {
+ if (isset($segment['suggestedValuesCallback'])) {
$suggestedValuesCallbackRequiresTable = $this->doesSuggestedValuesCallbackNeedData(
- $segmentFound['suggestedValuesCallback']);
+ $segment['suggestedValuesCallback']);
if (!$suggestedValuesCallbackRequiresTable) {
- return call_user_func($segmentFound['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn);
+ return call_user_func($segment['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn);
}
}
@@ -525,6 +523,57 @@ class API extends \Piwik\Plugin\API
return array();
}
+ if (!empty($segment['unionOfSegments'])) {
+ $values = array();
+ foreach ($segment['unionOfSegments'] as $unionSegmentName) {
+ $unionSegment = $this->findSegment($unionSegmentName, $idSite);
+
+ try {
+ $result = $this->getSuggestedValuesForSegmentName($idSite, $unionSegment, $maxSuggestionsToReturn);
+ if (!empty($result)) {
+ $values = array_merge($result, $values);
+ }
+ } catch (\Exception $e) {
+ // we ignore if there was no data found for $unionSegmentName
+ }
+ }
+
+ if (empty($values)) {
+ throw new \Exception("There was no data to suggest for $segmentName");
+ }
+
+ } else {
+ $values = $this->getSuggestedValuesForSegmentName($idSite, $segment, $maxSuggestionsToReturn);
+ }
+
+ $values = $this->getMostFrequentValues($values);
+ $values = array_slice($values, 0, $maxSuggestionsToReturn);
+ $values = array_map(array('Piwik\Common', 'unsanitizeInputValue'), $values);
+
+ return $values;
+ }
+
+ private function findSegment($segmentName, $idSite)
+ {
+ $segmentsMetadata = $this->getSegmentsMetadata($idSite, $_hideImplementationData = false);
+
+ $segmentFound = false;
+ foreach ($segmentsMetadata as $segmentMetadata) {
+ if ($segmentMetadata['segment'] == $segmentName) {
+ $segmentFound = $segmentMetadata;
+ break;
+ }
+ }
+
+ if (empty($segmentFound)) {
+ throw new \Exception("Requested segment $segmentName not found.");
+ }
+
+ return $segmentFound;
+ }
+
+ private function getSuggestedValuesForSegmentName($idSite, $segment, $maxSuggestionsToReturn)
+ {
$startDate = Date::now()->subDay(60)->toString();
$requestLastVisits = "method=Live.getLastVisitsDetails
&idSite=$idSite
@@ -534,6 +583,8 @@ class API extends \Piwik\Plugin\API
&serialize=0
&flat=1";
+ $segmentName = $segment['segment'];
+
// Select non empty fields only
// Note: this optimization has only a very minor impact
$requestLastVisits .= "&segment=$segmentName" . urlencode('!=');
@@ -548,22 +599,18 @@ class API extends \Piwik\Plugin\API
$request = new Request($requestLastVisits);
$table = $request->process();
+
if (empty($table)) {
throw new \Exception("There was no data to suggest for $segmentName");
}
- if ($suggestedValuesCallbackRequiresTable) {
- $values = call_user_func($segmentFound['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn, $table);
+ if (isset($segment['suggestedValuesCallback']) &&
+ $this->doesSuggestedValuesCallbackNeedData($segment['suggestedValuesCallback'])) {
+ $values = call_user_func($segment['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn, $table);
} else {
$values = $this->getSegmentValuesFromVisitorLog($segmentName, $table);
}
- $values = $this->getMostFrequentValues($values);
-
- $values = array_slice($values, 0, $maxSuggestionsToReturn);
-
- $values = array_map(array('Piwik\Common', 'unsanitizeInputValue'), $values);
-
return $values;
}