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;
12use Piwik\DataTable\BaseFilter;
13use Piwik\Development;
14
15/**
16 * Executes a filter for each row of a {@link DataTable} and generates a segment filter for each row.
17 *
18 * **Basic usage example**
19 *
20 *     $dataTable->filter('AddSegmentByRangeLabel', array('segmentName'));
21 *
22 * @api
23 */
24class AddSegmentByRangeLabel extends BaseFilter
25{
26    private $segments;
27    private $delimiter;
28
29    /**
30     * Generates a segment filter based on the label column and the given segment name
31     *
32     * @param DataTable $table
33     * @param string $segment  one segment
34     */
35    public function __construct($table, $segment)
36    {
37        parent::__construct($table);
38
39        $this->segment   = $segment;
40    }
41
42    /**
43     * @param DataTable $table
44     */
45    public function filter($table)
46    {
47        if (empty($this->segment)) {
48            $msg = 'AddSegmentByRangeLabel is called without having any segment defined';
49            Development::error($msg);
50            return;
51        }
52
53        foreach ($table->getRowsWithoutSummaryRow() as $key => $row) {
54            $label = $row->getColumn('label');
55
56            if (empty($label)) {
57                return;
58            }
59
60            if ($label === 'General_NewVisits') {
61                $row->setMetadata('segment', 'visitorType==new');
62                continue;
63            }
64
65            // if there's more than one element, handle as a range w/ an upper bound
66            if (strpos($label, "-") !== false) {
67                // get the range
68                sscanf($label, "%d - %d", $lowerBound, $upperBound);
69
70                if ($lowerBound == $upperBound) {
71                    $row->setMetadata('segment', $this->segment . '==' . urlencode($lowerBound));
72                } else {
73                    $row->setMetadata('segment', $this->segment . '>=' . urlencode($lowerBound) . ';' .
74                                                              $this->segment . '<=' . urlencode($upperBound));
75                }
76            } // if there's one element, handle as a range w/ no upper bound
77            else {
78                // get the lower bound
79                sscanf($label, "%d", $lowerBound);
80
81                if ($lowerBound !== null) {
82                    $row->setMetadata('segment', $this->segment . '>=' . urlencode($lowerBound));
83                }
84            }
85        }
86    }
87}
88