diff options
author | Simon Rettberg | 2019-11-07 10:30:37 +0100 |
---|---|---|
committer | Simon Rettberg | 2019-11-07 10:30:37 +0100 |
commit | a03f1f478a5f75de79ff2348461c8e9ed9872d3f (patch) | |
tree | bc552f1456733f017ae6fda320ea80af6de76af5 /modules-available/statistics/inc/statisticsfilterset.inc.php | |
parent | [translation] Get rid of up_json_encode (diff) | |
download | slx-admin-a03f1f478a5f75de79ff2348461c8e9ed9872d3f.tar.gz slx-admin-a03f1f478a5f75de79ff2348461c8e9ed9872d3f.tar.xz slx-admin-a03f1f478a5f75de79ff2348461c8e9ed9872d3f.zip |
[statistics] Modularize
Diffstat (limited to 'modules-available/statistics/inc/statisticsfilterset.inc.php')
-rw-r--r-- | modules-available/statistics/inc/statisticsfilterset.inc.php | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/modules-available/statistics/inc/statisticsfilterset.inc.php b/modules-available/statistics/inc/statisticsfilterset.inc.php new file mode 100644 index 00000000..c2642850 --- /dev/null +++ b/modules-available/statistics/inc/statisticsfilterset.inc.php @@ -0,0 +1,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; + } + +} |