summaryrefslogtreecommitdiffstats
path: root/modules-available/statistics/inc/statisticsfilterset.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/statistics/inc/statisticsfilterset.inc.php')
-rw-r--r--modules-available/statistics/inc/statisticsfilterset.inc.php116
1 files changed, 56 insertions, 60 deletions
diff --git a/modules-available/statistics/inc/statisticsfilterset.inc.php b/modules-available/statistics/inc/statisticsfilterset.inc.php
index c2642850..26595e93 100644
--- a/modules-available/statistics/inc/statisticsfilterset.inc.php
+++ b/modules-available/statistics/inc/statisticsfilterset.inc.php
@@ -3,47 +3,31 @@
class StatisticsFilterSet
{
/**
- * @var \StatisticsFilter[]
+ * @var \DatabaseFilter[]
*/
private $filters;
- private $sortDirection;
- private $sortColumn;
private $cache = false;
- public function __construct($filters)
+ /**
+ * @param DatabaseFilter[] $filters
+ */
+ public function __construct(array $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)
+ public function makeFragments(&$where, &$join, &$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 ';
@@ -54,57 +38,41 @@ class StatisticsFilterSet
}
}
$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;
+ $this->cache = compact('where', 'join', 'args');
}
public function filterNonClients()
{
- if (Module::get('runmode') === false || $this->hasFilter('IsClientFilter') !== false)
+ if (Module::get('runmode') === false || $this->hasFilter('IsClientStatisticsFilter') !== null)
return;
$this->cache = false;
// Runmode module exists, add filter
- $this->filters[] = new IsClientStatisticsFilter(true);
+ $this->filters[] = (new IsClientStatisticsFilter())->bind('=', true);
}
/**
* @param string $type filter type (class name)
- * @return false|StatisticsFilter The filter, false if not found
+ * @return ?DatabaseFilter The filter, null if not found
*/
- public function hasFilter($type)
+ public function hasFilter(string $type): ?DatabaseFilter
{
foreach ($this->filters as $filter) {
- if (get_class($filter) === $type) {
+ if ($filter->isClass($type)) {
return $filter;
}
}
- return false;
+ return null;
+ }
+
+ /**
+ * @param string $type filter type key/id
+ * @return ?DatabaseFilter The filter, null if not found
+ */
+ public function hasFilterKey(string $type): ?DatabaseFilter
+ {
+ if (isset($this->filters[$type]))
+ return $this->filters[$type];
+ return null;
}
/**
@@ -114,8 +82,10 @@ class StatisticsFilterSet
* @param string $permission permission to use
* @return bool false if no permission for any location, true otherwise
*/
- public function setAllowedLocationsFromPermission($permission)
+ public function setAllowedLocationsFromPermission(string $permission): bool
{
+ if (!Module::isAvailable('locations'))
+ return true;
$locs = User::getAllowedLocations($permission);
if (empty($locs))
return false;
@@ -124,7 +94,7 @@ class StatisticsFilterSet
return true;
unset($this->filters['permissions']);
} else {
- $this->filters['permissions'] = new LocationStatisticsFilter('=', $locs);
+ $this->filters['permissions'] = StatisticsFilter::$columns['location']->bind('=', $locs);
}
$this->cache = false;
return true;
@@ -135,9 +105,35 @@ class StatisticsFilterSet
*/
public function getAllowedLocations()
{
- if (isset($this->filters['permissions']->argument) && is_array($this->filters['permissions']->argument))
- return $this->filters['permissions']->argument;
+ if (isset($this->filters['permissions']) && is_array($this->filters['permissions']->argument))
+ return (array)$this->filters['permissions']->argument;
return false;
}
+ public function suitableForUsageGraph(): bool
+ {
+ foreach ($this->filters as $filter) {
+ switch ($filter->getClass()) {
+ case 'LocationStatisticsFilter':
+ case 'IsClientStatisticsFilter':
+ break;
+ case 'DateStatisticsFilter':
+ if ($filter->op !== '>' && $filter->op !== '>=')
+ return false;
+ if (strtotime($filter->argument) + 3*86400 > time())
+ return false;
+ break;
+ case 'RuntimeStatisticsFilter':
+ if ($filter->op !== '>' && $filter->op !== '>=')
+ return false;
+ if ($filter->argument < 3 * 24)
+ return false;
+ break;
+ default:
+ return false;
+ }
+ }
+ return true;
+ }
+
}