summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2020-04-22 18:37:11 +0200
committerSimon Rettberg2020-04-22 18:37:11 +0200
commit970bbe1c1e3386e77738fd5f18edb9dd460e7450 (patch)
tree03229344b0559468621905c925ce4db3512851e2
parent[statistics] Validate operator for all filters (diff)
downloadslx-admin-970bbe1c1e3386e77738fd5f18edb9dd460e7450.tar.gz
slx-admin-970bbe1c1e3386e77738fd5f18edb9dd460e7450.tar.xz
slx-admin-970bbe1c1e3386e77738fd5f18edb9dd460e7450.zip
[statistics] Unify Ram and ID44 filters
-rw-r--r--modules-available/statistics/inc/statisticsfilter.inc.php107
1 files changed, 53 insertions, 54 deletions
diff --git a/modules-available/statistics/inc/statisticsfilter.inc.php b/modules-available/statistics/inc/statisticsfilter.inc.php
index 215d49a7..83983ee1 100644
--- a/modules-available/statistics/inc/statisticsfilter.inc.php
+++ b/modules-available/statistics/inc/statisticsfilter.inc.php
@@ -23,6 +23,7 @@ abstract class StatisticsFilter
const OP_ORDINAL = ['=', '!=', '<', '>', '<=', '>='];
const OP_STRCMP = ['~', '!~', '=', '!='];
const OP_NOMINAL = ['=', '!='];
+ const OP_FUZZY_ORDINAL = ['=', '!=', '~', '!~', '<', '>', '<=', '>='];
/**
* @var StatisticsFilter[]
@@ -54,7 +55,10 @@ abstract class StatisticsFilter
$this->placeholder = $placeholder;
}
- public function type() { return $this->ops === self::OP_ORDINAL ? 'int' : 'string'; }
+ public function type()
+ {
+ return ($this->ops === self::OP_ORDINAL || $this->ops === self::OP_FUZZY_ORDINAL) ? 'int' : 'string';
+ }
/* returns a where clause and adds needed operators to the passed arrays */
public abstract function whereClause(string $operator, $argument, array &$args, array &$joins);
@@ -222,7 +226,7 @@ abstract class StatisticsFilter
'realcores' => new SimpleStatisticsFilter('realcores', self::OP_ORDINAL, ''),
'systemmodel' => new SimpleStatisticsFilter('systemmodel', self::OP_STRCMP, 'PC-365 (IBM)'),
'cpumodel' => new SimpleStatisticsFilter('cpumodel', self::OP_STRCMP, 'Pentium Pro 200 MHz'),
- 'hddgb' => new Id44StatisticsFilter(),
+ 'hddgb' => new Id44GbStatisticsFilter(),
'gbram' => new RamGbStatisticsFilter(),
'kvmstate' => new EnumStatisticsFilter('kvmstate', ['ENABLED', 'DISABLED', 'UNSUPPORTED']),
'badsectors' => new SimpleStatisticsFilter('badsectors', self::OP_ORDINAL, ''),
@@ -364,94 +368,89 @@ class DateStatisticsFilter extends StatisticsFilter
}
-class RamGbStatisticsFilter extends StatisticsFilter
+class RuntimeStatisticsFilter extends StatisticsFilter
{
public function __construct()
{
- parent::__construct('mbram', self::OP_ORDINAL, 'GiB');
+ parent::__construct('lastboot', self::OP_ORDINAL);
}
public function whereClause(string $operator, $argument, array &$args, array &$joins)
{
- $lower = floor(StatisticsFilter::findBestValue(StatisticsFilter::SIZE_RAM, (int)$argument, false) * 1024 - 100);
- $upper = ceil(StatisticsFilter::findBestValue(StatisticsFilter::SIZE_RAM, (int)$argument, true) * 1024 + 100);
- if ($operator == '=') {
- return " mbram BETWEEN $lower AND $upper";
- } elseif ($operator == '<') {
- return " mbram < $lower";
+ $upper = time() - (int)$argument * 3600;
+ $lower = $upper - 3600;
+ $common = "state IN ('OCCUPIED', 'IDLE', 'STANDBY') AND";
+ if ($operator == '<') { // These are inverted (uptime vs lastboot)
+ return "$common lastboot > $upper";
} elseif ($operator == '<=') {
- return " mbram <= $upper";
+ return "$common lastboot > $lower";
} elseif ($operator == '>') {
- return " mbram > $upper";
+ return "$common lastboot < $lower";
} elseif ($operator == '>=') {
- return " mbram >= $lower";
+ return "$common lastboot < $upper";
+ } elseif ($operator == '=') {
+ return "$common (lastboot BETWEEN $lower AND $upper)";
}
// !=
- return " (mbram < $lower OR mbram > $upper)";
+ return "$common (lastboot NOT BETWEEN $lower AND > $upper)";
+ }
+}
+
+abstract class GbToMbRangeStatisticsFilter extends StatisticsFilter
+{
+
+ protected function rangeClause(string $operator, $argument, array $fuzzyVals)
+ {
+ if ($operator === '~' || $operator === '!~') {
+ $lower = (int)floor(StatisticsFilter::findBestValue($fuzzyVals, (int)$argument, false) * 1024 - 500);
+ $upper = (int)ceil(StatisticsFilter::findBestValue($fuzzyVals, (int)$argument, true) * 1024 + 100);
+ $operator = str_replace('~', '=', $operator);
+ } else {
+ $lower = round($argument * 1024 - 500);
+ $upper = round($argument * 1024 + 1023);
+ }
+ if ($operator === '=')
+ return " {$this->column} BETWEEN $lower AND $upper";
+ if ($operator === '!=')
+ return " {$this->column} NOT BETWEEN $lower AND $upper";
+ if ($operator === '<')
+ return " {$this->column} < $lower";
+ if ($operator === '<=')
+ return " {$this->column} <= $upper";
+ if ($operator === '>')
+ return " {$this->column} > $upper";
+ return " {$this->column} >= $lower"; // >=
}
}
-class RuntimeStatisticsFilter extends StatisticsFilter
+class RamGbStatisticsFilter extends GbToMbRangeStatisticsFilter
{
public function __construct()
{
- parent::__construct('lastboot', self::OP_ORDINAL);
+ parent::__construct('mbram', self::OP_FUZZY_ORDINAL, 'GiB');
}
public function whereClause(string $operator, $argument, array &$args, array &$joins)
{
- $upper = time() - (int)$argument * 3600;
- $lower = $upper - 3600;
- $common = "state IN ('OCCUPIED', 'IDLE', 'STANDBY') AND";
- if ($operator == '=') {
- return "$common (lastboot BETWEEN $lower AND $upper)";
- } elseif ($operator == '<') {
- return "$common lastboot > $upper";
- } elseif ($operator == '<=') {
- return "$common lastboot > $lower";
- } elseif ($operator == '>') {
- return "$common lastboot < $lower";
- } elseif ($operator == '>=') {
- return "$common lastboot < $upper";
- }
- // !=
- return "$common (lastboot < $lower OR lastboot > $upper)";
+ return parent::rangeClause($operator, $argument, self::SIZE_RAM);
}
+
}
-class Id44StatisticsFilter extends StatisticsFilter
+class Id44GbStatisticsFilter extends GbToMbRangeStatisticsFilter
{
public function __construct()
{
- parent::__construct('id44mb', self::OP_ORDINAL,'GiB');
+ parent::__construct('id44mb', self::OP_FUZZY_ORDINAL,'GiB');
}
public function whereClause(string $operator, $argument, array &$args, array &$joins)
{
- if ($operator === '=' || $operator === '!=') {
- $lower = floor(StatisticsFilter::findBestValue(StatisticsFilter::SIZE_ID44, $argument, false) * 1024 - 100);
- $upper = ceil(StatisticsFilter::findBestValue(StatisticsFilter::SIZE_ID44, $argument, true) * 1024 + 100);
- } else {
- $lower = $upper = round($argument * 1024);
- }
-
- if ($operator === '=') {
- return " id44mb BETWEEN $lower AND $upper";
- } elseif ($operator === '<=') {
- return " id44mb <= $upper";
- } elseif ($operator === '>=') {
- return " id44mb >= $lower";
- } elseif ($operator === '<') {
- return " id44mb < $lower";
- } elseif ($operator === '>') {
- return " id44mb > $upper";
- }
- // !=
- return " id44mb < $lower OR id44mb > $upper";
+ return parent::rangeClause($operator, $argument, self::SIZE_ID44);
}
}