From 970bbe1c1e3386e77738fd5f18edb9dd460e7450 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 22 Apr 2020 18:37:11 +0200 Subject: [statistics] Unify Ram and ID44 filters --- .../statistics/inc/statisticsfilter.inc.php | 107 ++++++++++----------- 1 file 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); } } -- cgit v1.2.3-55-g7522