Welcome to mirror list, hosted at ThFree Co, Russian Federation.

AddSegmentByLabel.php « Filter « DataTable « core - github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1eacd4f72fadcbb030c26a4e556f104c2019c6ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
/**
 * Piwik - free/libre analytics platform
 *
 * @link http://piwik.org
 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 *
 */
namespace Piwik\DataTable\Filter;

use Piwik\DataTable;
use Piwik\DataTable\BaseFilter;
use Piwik\Development;

/**
 * Executes a filter for each row of a {@link DataTable} and generates a segment filter for each row.
 *
 * **Basic usage example**
 *
 *     $dataTable->filter('AddSegmentByLabel', array('segmentName'));
 *     $dataTable->filter('AddSegmentByLabel', array(array('segmentName1', 'segment2'), ';');
 *
 * @api
 */
class AddSegmentByLabel extends BaseFilter
{
    private $segments;
    private $delimiter;

    /**
     * Generates a segment filter based on the label column and the given segment names
     *
     * @param DataTable $table
     * @param string|array $segmentOrSegments Either one segment or an array of segments.
     *                                        If more than one segment is given a delimter has to be defined.
     * @param string $delimiter               The delimiter by which the label should be splitted.
     */
    public function __construct($table, $segmentOrSegments, $delimiter = '')
    {
        parent::__construct($table);

        if (!is_array($segmentOrSegments)) {
            $segmentOrSegments = array($segmentOrSegments);
        }

        $this->segments  = $segmentOrSegments;
        $this->delimiter = $delimiter;
    }

    /**
     * See {@link AddSegmentByLabel}.
     *
     * @param DataTable $table
     */
    public function filter($table)
    {
        if (empty($this->segments)) {
            $msg = 'AddSegmentByLabel is called without having any segments defined';
            Development::error($msg);
            return;
        }

        if (count($this->segments) === 1) {
            $segment = reset($this->segments);

            foreach ($table->getRowsWithoutSummaryRow() as $key => $row) {
                $label = $row->getColumn('label');

                if (!empty($label)) {
                    $row->setMetadata('segment', $segment . '==' . urlencode($label));
                }
            }
        } elseif (!empty($this->delimiter)) {
            $numSegments  = count($this->segments);
            $conditionAnd = ';';

            foreach ($table->getRowsWithoutSummaryRow() as $key => $row) {
                $label = $row->getColumn('label');
                if (!empty($label)) {
                    $parts = explode($this->delimiter, $label);

                    if (count($parts) === $numSegments) {
                        $filter = array();
                        foreach ($this->segments as $index => $segment) {
                            if (!empty($segment)) {
                                $filter[] = $segment . '==' . urlencode($parts[$index]);
                            }
                        }
                        $row->setMetadata('segment', implode($conditionAnd, $filter));
                    }
                }
            }
        } else {
            $names = implode(', ', $this->segments);
            $msg   = 'Multiple segments are given but no delimiter defined. Segments: ' . $names;
            Development::error($msg);
        }
    }
}