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:
Diffstat (limited to 'plugins/CoreVisualizations/JqplotDataGenerator.php')
-rw-r--r--plugins/CoreVisualizations/JqplotDataGenerator.php142
1 files changed, 115 insertions, 27 deletions
diff --git a/plugins/CoreVisualizations/JqplotDataGenerator.php b/plugins/CoreVisualizations/JqplotDataGenerator.php
index d725d22b04..e120764005 100644
--- a/plugins/CoreVisualizations/JqplotDataGenerator.php
+++ b/plugins/CoreVisualizations/JqplotDataGenerator.php
@@ -10,11 +10,16 @@
namespace Piwik\Plugins\CoreVisualizations;
use Exception;
+use Piwik\API\Request;
use Piwik\Common;
use Piwik\DataTable;
+use Piwik\DataTable\Row;
use Piwik\Metrics;
+use Piwik\Period\Factory;
use Piwik\Piwik;
+use Piwik\Plugins\API\Filter\DataComparisonFilter;
use Piwik\Plugins\CoreVisualizations\JqplotDataGenerator\Chart;
+use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph;
require_once PIWIK_INCLUDE_PATH . '/plugins/CoreVisualizations/JqplotDataGenerator/Evolution.php';
@@ -26,7 +31,7 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/CoreVisualizations/JqplotDataGenerat
class JqplotDataGenerator
{
/**
- * View properties. @see Piwik\ViewDataTable for more info.
+ * View properties. @see \Piwik\ViewDataTable for more info.
*
* @var array
*/
@@ -34,6 +39,15 @@ class JqplotDataGenerator
protected $graphType;
+ protected $isComparing;
+
+ private $availableSegments;
+
+ /**
+ * @var JqplotGraph
+ */
+ protected $graph;
+
/**
* Creates a new JqplotDataGenerator instance for a graph type and view properties.
*
@@ -42,14 +56,14 @@ class JqplotDataGenerator
* @throws \Exception
* @return JqplotDataGenerator
*/
- public static function factory($type, $properties)
+ public static function factory($type, $properties, JqplotGraph $graph)
{
switch ($type) {
case 'evolution':
- return new JqplotDataGenerator\Evolution($properties, $type);
+ return new JqplotDataGenerator\Evolution($properties, $type, $graph);
case 'pie':
case 'bar':
- return new JqplotDataGenerator($properties, $type);
+ return new JqplotDataGenerator($properties, $type, $graph);
default:
throw new Exception("Unknown JqplotDataGenerator type '$type'.");
}
@@ -63,10 +77,14 @@ class JqplotDataGenerator
*
* @internal param \Piwik\Plugin\ViewDataTable $visualization
*/
- public function __construct($properties, $graphType)
+ public function __construct($properties, $graphType, JqplotGraph $graph)
{
$this->properties = $properties;
$this->graphType = $graphType;
+ $this->isComparing = $graph->isComparing();
+ $this->graph = $graph;
+
+ $this->availableSegments = Request::processRequest('SegmentEditor.getAll', $override = [], $default = []);
}
/**
@@ -80,12 +98,6 @@ class JqplotDataGenerator
$visualization = new Chart();
if ($dataTable->getRowsCount() > 0) {
- // if addTotalRow was called in GenerateGraphHTML, add a row containing totals of
- // different metrics
- if ($this->properties['add_total_row']) {
- $dataTable->queueFilter('AddSummaryRow', Piwik::translate('General_Total'));
- }
-
$dataTable->applyQueuedFilters();
$this->initChartObjectData($dataTable, $visualization);
}
@@ -101,47 +113,123 @@ class JqplotDataGenerator
{
$xLabels = $dataTable->getColumn('label');
- $columnNames = $this->properties['columns_to_display'];
- if (($labelColumnIndex = array_search('label', $columnNames)) !== false) {
- unset($columnNames[$labelColumnIndex]);
+ $columnsToDisplay = array_values($this->properties['columns_to_display']);
+ if (($labelColumnIndex = array_search('label', $columnsToDisplay)) !== false) {
+ unset($columnsToDisplay[$labelColumnIndex]);
}
- $columnNameToTranslation = $columnNameToValue = array();
- foreach ($columnNames as $columnName) {
- $columnNameToTranslation[$columnName] = @$this->properties['translations'][$columnName];
-
- $columnNameToValue[$columnName] = $dataTable->getColumn($columnName);
+ $seriesMetadata = null;
+ if ($this->isComparing) {
+ list($yLabels, $serieses, $seriesMetadata) = $this->getComparisonTableSerieses($dataTable, $columnsToDisplay);
+ } else {
+ list($yLabels, $serieses) = $this->getMainTableSerieses($dataTable, $columnsToDisplay);
}
$visualization->dataTable = $dataTable;
$visualization->properties = $this->properties;
$visualization->setAxisXLabels($xLabels);
- $visualization->setAxisYValues($columnNameToValue);
- $visualization->setAxisYLabels($columnNameToTranslation);
+ $visualization->setAxisYValues($serieses, $seriesMetadata);
+ $visualization->setAxisYLabels($yLabels);
- $units = $this->getUnitsForColumnsToDisplay();
+ $units = $this->getUnitsForSerieses($yLabels);
$visualization->setAxisYUnits($units);
}
- protected function getUnitsForColumnsToDisplay()
+ private function getMainTableSerieses(DataTable $dataTable, $columnNames)
+ {
+ $columnNameToTranslation = [];
+
+ foreach ($columnNames as $columnName) {
+ $columnNameToTranslation[$columnName] = @$this->properties['translations'][$columnName];
+ }
+
+ $columnNameToValue = array();
+ foreach ($columnNames as $columnName) {
+ $columnNameToValue[$columnName] = $dataTable->getColumn($columnName);
+ }
+
+ return [$columnNameToTranslation, $columnNameToValue];
+ }
+
+ private function getComparisonTableSerieses(DataTable $dataTable, $columnsToDisplay)
+ {
+ $seriesLabels = [];
+ $serieses = [];
+ $seriesMetadata = [];
+
+ $seriesIndices = [];
+
+ foreach ($dataTable->getRows() as $row) {
+ /** @var DataTable $comparisonTable */
+ $comparisonTable = $row->getComparisons();
+ if (empty($comparisonTable)) {
+ continue;
+ }
+
+ foreach ($comparisonTable->getRows() as $index => $compareRow) {
+ foreach ($columnsToDisplay as $columnIndex => $columnName) {
+ $seriesId = $columnName . '|' . $index;
+
+ if (!isset($seriesIndices[$seriesId])) {
+ $seriesIndices[$seriesId] = count($seriesIndices);
+ }
+
+ $seriesLabel = $this->getComparisonSeriesLabel($compareRow, $columnName);
+ $seriesLabels[$seriesId] = $seriesLabel;
+ $serieses[$seriesId][] = $compareRow->getColumn($columnName);
+
+ $seriesMetadata[$seriesId] = [
+ 'seriesIndex' => $seriesIndices[$seriesId],
+ 'metricIndex' => $columnIndex,
+ ];
+ }
+ }
+ }
+
+ return [$seriesLabels, $serieses, $seriesMetadata];
+ }
+
+ protected function getComparisonSeriesLabel(Row $compareRow, $columnName, $rowLabel = false)
+ {
+ return $this->getComparisonSeriesLabelFromCompareSeries($compareRow->getMetadata('compareSeriesPretty'), $columnName, $rowLabel);
+ }
+
+ protected function getComparisonSeriesLabelFromCompareSeries($compareSeriesPretty, $columnName, $rowLabel = false)
+ {
+ $columnTranslation = @$this->properties['translations'][$columnName];
+
+ if (empty($rowLabel)) {
+ $label = $columnTranslation;
+ } else {
+ $label = "$rowLabel ($columnTranslation)";
+ }
+
+ $label .= ' ' . $compareSeriesPretty;
+ return $label;
+ }
+
+ protected function getUnitsForSerieses($yLabels)
{
// derive units from column names
- $units = $this->deriveUnitsFromRequestedColumnNames();
+ $units = $this->deriveUnitsFromRequestedColumnNames($yLabels);
if (!empty($this->properties['y_axis_unit'])) {
$units = array_fill(0, count($units), $this->properties['y_axis_unit']);
}
return $units;
}
- private function deriveUnitsFromRequestedColumnNames()
+ private function deriveUnitsFromRequestedColumnNames($yLabels)
{
$idSite = Common::getRequestVar('idSite', null, 'int');
$units = array();
- foreach ($this->properties['columns_to_display'] as $columnName) {
+ foreach ($yLabels as $seriesId => $ignore) {
+ $parts = explode('|', $seriesId, 2);
+ $columnName = $parts[0];
+
$derivedUnit = Metrics::getUnit($columnName, $idSite);
- $units[$columnName] = empty($derivedUnit) ? false : $derivedUnit;
+ $units[$seriesId] = empty($derivedUnit) ? false : $derivedUnit;
}
return $units;
}