1<?php
2/**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 *
8 */
9namespace Piwik\DataTable\Filter;
10
11use Piwik\DataTable\BaseFilter;
12use Piwik\DataTable;
13
14/**
15 * Converts for each row of a {@link DataTable} a segmentValue to a segment (expression). The name of the segment
16 * is automatically detected based on the given report.
17 *
18 * **Basic usage example**
19 *
20 *     $dataTable->filter('AddSegmentBySegmentValue', array($reportInstance));
21 *
22 * @api
23 */
24class AddSegmentBySegmentValue extends BaseFilter
25{
26    /**
27     * @var \Piwik\Plugin\Report
28     */
29    private $report;
30
31    /**
32     * @param DataTable $table
33     * @param $report
34     */
35    public function __construct($table, $report)
36    {
37        parent::__construct($table);
38        $this->report = $report;
39    }
40
41    /**
42     * See {@link AddSegmentBySegmentValue}.
43     *
44     * @param DataTable $table
45     * @return int The number of deleted rows.
46     */
47    public function filter($table)
48    {
49        if (empty($this->report) || !$table->getRowsCount()) {
50            return;
51        }
52
53        $dimension = $this->report->getDimension();
54
55        if (empty($dimension)) {
56            return;
57        }
58
59        $segments = $dimension->getSegments();
60
61        if (empty($segments)) {
62            return;
63        }
64
65        $this->enableRecursive(true);
66
67        /** @var \Piwik\Plugin\Segment $segment */
68        $segment     = reset($segments);
69        $segmentName = $segment->getSegment();
70
71        foreach ($table->getRows() as $row) {
72            $value  = $row->getMetadata('segmentValue');
73            $filter = $row->getMetadata('segment');
74
75            if ($value !== false && $filter === false) {
76                $row->setMetadata('segment', sprintf('%s==%s', $segmentName, urlencode($value)));
77            }
78
79            $this->filterSubTable($row);
80        }
81    }
82}
83