summaryrefslogtreecommitdiffstats
path: root/modules-available/statistics/inc/statisticsfilterset.inc.php
blob: c2642850088ca30b567d0eec081419140e7b9085 (plain) (blame)
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php

class StatisticsFilterSet
{
	/**
	 * @var \StatisticsFilter[]
	 */
	private $filters;
	private $sortDirection;
	private $sortColumn;

	private $cache = false;

	public function __construct($filters)
	{
		$this->filters = $filters;
	}

	public function setSort($col, $direction)
	{
		$direction = ($direction === 'DESC' ? 'DESC' : 'ASC');

		if (!is_string($col) || !array_key_exists($col, StatisticsFilter::$columns)) {
			/* default sorting column is clientip */
			$col = 'clientip';
		}
		if ($col === $this->sortColumn && $direction === $this->sortDirection)
			return;
		$this->cache = false;
		$this->sortDirection =  $direction;
		$this->sortColumn = $col;
	}

	public function makeFragments(&$where, &$join, &$sort, &$args)
	{
		if ($this->cache !== false) {
			$where = $this->cache['where'];
			$join = $this->cache['join'];
			$sort = $this->cache['sort'];
			$args = $this->cache['args'];
			return;
		}
		/* generate where clause & arguments */
		$where = '';
		$joins = [];
		$sort = "";
		$args = [];
		if (empty($this->filters)) {
			$where = ' 1 ';
		} else {
			foreach ($this->filters as $filter) {
				$sep = ($where != '' ? ' AND ' : '');
				$where .= $sep . $filter->whereClause($args, $joins);
			}
		}
		$join = implode(' ', array_unique($joins));

		$col = $this->sortColumn;
		$isMapped = array_key_exists('map_sort', StatisticsFilter::$columns[$col]);
		$concreteCol = ($isMapped ? StatisticsFilter::$columns[$col]['map_sort'] : $col) ;

		if ($concreteCol === 'clientip') {
			$concreteCol = "INET_ATON(clientip)";
		}

		$sort = " ORDER BY " . $concreteCol . " " . $this->sortDirection
			. ", machineuuid ASC";
		$this->cache = compact('where', 'join', 'sort', 'args');
	}
	
	public function isNoId44Filter()
	{
		$filter = $this->hasFilter('Id44Filter');
		return $filter !== false && $filter->argument == 0;
	}

	public function getSortDirection()
	{
		return $this->sortDirection;
	}

	public function getSortColumn()
	{
		return $this->sortColumn;
	}

	public function filterNonClients()
	{
		if (Module::get('runmode') === false || $this->hasFilter('IsClientFilter') !== false)
			return;
		$this->cache = false;
		// Runmode module exists, add filter
		$this->filters[] = new IsClientStatisticsFilter(true);
	}

	/**
	 * @param string $type filter type (class name)
	 * @return false|StatisticsFilter The filter, false if not found
	 */
	public function hasFilter($type)
	{
		foreach ($this->filters as $filter) {
			if (get_class($filter) === $type) {
				return $filter;
			}
		}
		return false;
	}

	/**
	 * Add a location filter based on the allowed permissions for the given permission.
	 * Returns false if the user doesn't have the given permission for any location.
	 *
	 * @param string $permission permission to use
	 * @return bool false if no permission for any location, true otherwise
	 */
	public function setAllowedLocationsFromPermission($permission)
	{
		$locs = User::getAllowedLocations($permission);
		if (empty($locs))
			return false;
		if (in_array(0, $locs)) {
			if (!isset($this->filters['permissions']))
				return true;
			unset($this->filters['permissions']);
		} else {
			$this->filters['permissions'] = new LocationStatisticsFilter('=', $locs);
		}
		$this->cache = false;
		return true;
	}

	/**
	 * @return false|array
	 */
	public function getAllowedLocations()
	{
		if (isset($this->filters['permissions']->argument) && is_array($this->filters['permissions']->argument))
			return $this->filters['permissions']->argument;
		return false;
	}

}