diff --git a/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php b/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php index 9d784dfe..ad847728 100644 --- a/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php +++ b/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php @@ -19,6 +19,7 @@ class CreateMetricsTable extends Migration $table->string('suffix'); $table->text('description'); $table->decimal('default_value', 10, 3); + $table->tinyInteger('calc_type'); $table->boolean('display_chart')->default(1); $table->timestamps(); diff --git a/app/lang/de/forms.php b/app/lang/de/forms.php index 11f33b3f..2f597b39 100644 --- a/app/lang/de/forms.php +++ b/app/lang/de/forms.php @@ -58,6 +58,9 @@ return [ 'description' => 'Description', 'description-help' => 'You may also use Markdown.', 'display-chart' => 'Display chart on status page?', + 'calc_type' => 'Calculation of metrics', + 'type_sum' => 'Sum', + 'type_avg' => 'Average', 'points' => [ 'value' => 'Value', diff --git a/app/lang/en/forms.php b/app/lang/en/forms.php index d2f79ee2..33b5bc8b 100644 --- a/app/lang/en/forms.php +++ b/app/lang/en/forms.php @@ -61,6 +61,9 @@ return [ 'description-help' => 'You may also use Markdown.', 'display-chart' => 'Display chart on status page?', 'default-value' => 'Default value', + 'calc_type' => 'Calculation of metrics', + 'type_sum' => 'Sum', + 'type_avg' => 'Average', 'points' => [ 'value' => 'Value', diff --git a/app/lang/es/forms.php b/app/lang/es/forms.php index 679d4acc..328dace9 100644 --- a/app/lang/es/forms.php +++ b/app/lang/es/forms.php @@ -59,6 +59,9 @@ return [ 'description' => 'Descripción', 'description-help' => 'Puedes usar también Markdown.', 'display-chart' => '¿Vizualizar gráfica en la página de estado?', + 'calc_type' => 'Calculation of metrics', + 'type_sum' => 'Sum', + 'type_avg' => 'Average', 'points' => [ 'value' => 'Valor', diff --git a/app/lang/fr/forms.php b/app/lang/fr/forms.php index ff9f2be9..ac023203 100644 --- a/app/lang/fr/forms.php +++ b/app/lang/fr/forms.php @@ -58,6 +58,9 @@ return [ 'description' => 'Description', 'description-help' => 'You may also use Markdown.', 'display-chart' => 'Display chart on status page?', + 'calc_type' => 'Calculation of metrics', + 'type_sum' => 'Sum', + 'type_avg' => 'Average', 'points' => [ 'value' => 'Value', diff --git a/app/lang/pt-BR/forms.php b/app/lang/pt-BR/forms.php index a0d783b5..f9b75a23 100755 --- a/app/lang/pt-BR/forms.php +++ b/app/lang/pt-BR/forms.php @@ -61,6 +61,9 @@ return [ 'description-help' => '', 'display-chart' => '', 'default-value' => '', + 'calc_type' => 'Calculation of metrics', + 'type_sum' => 'Sum', + 'type_avg' => 'Average', 'points' => [ 'value' => '', diff --git a/app/views/dashboard/metrics/add.blade.php b/app/views/dashboard/metrics/add.blade.php index ececbfbc..2a643292 100644 --- a/app/views/dashboard/metrics/add.blade.php +++ b/app/views/dashboard/metrics/add.blade.php @@ -31,6 +31,13 @@ +
+ + +
diff --git a/app/views/dashboard/metrics/edit.blade.php b/app/views/dashboard/metrics/edit.blade.php index b47acb1d..cb95aecb 100644 --- a/app/views/dashboard/metrics/edit.blade.php +++ b/app/views/dashboard/metrics/edit.blade.php @@ -31,6 +31,13 @@
+
+ + +
diff --git a/app/views/partials/metrics.blade.php b/app/views/partials/metrics.blade.php index c9d27a29..644fc636 100644 --- a/app/views/partials/metrics.blade.php +++ b/app/views/partials/metrics.blade.php @@ -31,37 +31,36 @@
@endforeach diff --git a/src/Models/Metric.php b/src/Models/Metric.php index 2861e86e..d84af1d3 100644 --- a/src/Models/Metric.php +++ b/src/Models/Metric.php @@ -24,6 +24,9 @@ class Metric extends Model implements TransformableInterface { use ValidatingTrait; + const CALC_SUM = 0; + const CALC_AVG = 1; + /** * The model's attributes. * @@ -32,6 +35,8 @@ class Metric extends Model implements TransformableInterface protected $attributes = [ 'name' => '', 'display_chart' => 1, + 'default_value' => 0, + 'calc_type' => 0, ]; /** @@ -43,7 +48,7 @@ class Metric extends Model implements TransformableInterface 'name' => 'required', 'suffix' => 'required', 'display_chart' => 'boolean', - 'default_value' => 'numeric|required', + 'default_value' => 'numeric', ]; /** @@ -51,7 +56,7 @@ class Metric extends Model implements TransformableInterface * * @var string[] */ - protected $fillable = ['name', 'suffix', 'description', 'display_chart', 'default_value']; + protected $fillable = ['name', 'suffix', 'description', 'display_chart', 'default_value', 'calc_type']; /** * Metrics contain many metric points. @@ -76,9 +81,20 @@ class Metric extends Model implements TransformableInterface $dateTime->sub(new DateInterval('PT'.$hour.'H')); if (Config::get('database.default') === 'mysql') { - $value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->sum('value'); + if (! isset($this->calc_type) || $this->calc_type === self::CALC_SUM) { + $value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->sum('value'); + } elseif ($this->calc_type === self::CALC_AVG) { + $value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->avg('value'); + } } else { - $query = DB::select("select sum(metric_points.value) as aggregate FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE to_char(metric_points.created_at, 'YYYYMMDDHH') = :timestamp AND to_char(metric_points.created_at, 'H') = to_char(now() - interval '{$hour} hour', 'H') GROUP BY to_char(metric_points.created_at, 'H')", [ + // Default metrics calculations. + if (! isset($this->calc_type) || $this->calc_type === self::CALC_SUM) { + $queryType = "sum(metric_points.value)"; + } elseif ($this->calc_type === self::CALC_AVG) { + $queryType = "avg(metric_points.value)"; + } + + $query = DB::select("select {$queryType} as aggregate FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE to_char(metric_points.created_at, 'YYYYMMDDHH') = :timestamp AND to_char(metric_points.created_at, 'H') = to_char(now() - interval '{$hour} hour', 'H') GROUP BY to_char(metric_points.created_at, 'H')", [ 'timestamp' => $dateTime->format('YmdH'), ]);