2014-11-25 11:19:20 +00:00
< ? php
2015-01-02 00:18:19 +00:00
namespace CachetHQ\Cachet\Models ;
2015-02-24 08:36:41 +00:00
use DateInterval ;
2015-02-24 08:38:26 +00:00
use DateTime ;
2015-01-01 12:23:17 +00:00
use Illuminate\Database\Eloquent\Model ;
2015-02-24 08:42:47 +00:00
use Illuminate\Support\Facades\Config ;
2015-01-21 02:32:18 -06:00
use Illuminate\Support\Facades\DB ;
2014-11-27 16:05:00 +00:00
use Watson\Validating\ValidatingTrait ;
2014-11-25 21:35:52 +00:00
2015-01-02 08:45:09 +00:00
/**
2015-01-02 12:16:28 +00:00
* @ property int $id
* @ property string $name
* @ property string $suffix
* @ property string $description
2015-03-26 15:07:16 -06:00
* @ property float $default_value
* @ property int $calc_type
2015-01-02 12:16:28 +00:00
* @ property int $display_chart
* @ property \Carbon\Carbon $created_at
* @ property \Carbon\Carbon $updated_at
2015-01-02 08:45:09 +00:00
*/
2015-03-20 18:30:45 -06:00
class Metric extends Model
2014-12-20 21:20:17 +00:00
{
2014-11-27 16:05:00 +00:00
use ValidatingTrait ;
2014-11-25 21:35:52 +00:00
2015-03-17 16:41:23 +00:00
const CALC_SUM = 0 ;
const CALC_AVG = 1 ;
2015-01-21 02:32:18 -06:00
/**
* The model ' s attributes .
*
2015-02-23 08:27:43 +00:00
* @ var string []
2015-01-21 02:32:18 -06:00
*/
protected $attributes = [
2015-02-23 08:27:43 +00:00
'name' => '' ,
'display_chart' => 1 ,
2015-03-17 16:41:23 +00:00
'default_value' => 0 ,
'calc_type' => 0 ,
2015-01-21 02:32:18 -06:00
];
2015-01-01 18:57:33 +00:00
/**
* The validation rules .
*
* @ var string []
*/
2014-11-27 16:05:00 +00:00
protected $rules = [
'name' => 'required' ,
'suffix' => 'required' ,
'display_chart' => 'boolean' ,
2015-03-17 16:41:23 +00:00
'default_value' => 'numeric' ,
2014-11-27 16:05:00 +00:00
];
2014-11-25 21:35:52 +00:00
2015-01-01 18:57:33 +00:00
/**
* The fillable properties .
*
* @ var string []
*/
2015-03-17 16:41:23 +00:00
protected $fillable = [ 'name' , 'suffix' , 'description' , 'display_chart' , 'default_value' , 'calc_type' ];
2014-11-25 21:35:52 +00:00
2014-12-01 08:52:34 +00:00
/**
* Metrics contain many metric points .
2014-12-30 18:19:22 +00:00
*
2015-01-01 18:57:33 +00:00
* @ return \Illuminate\Database\Eloquent\Relations\HasMany
2014-12-01 08:52:34 +00:00
*/
2014-12-20 21:20:17 +00:00
public function points ()
{
2015-01-02 00:18:19 +00:00
return $this -> hasMany ( 'CachetHQ\Cachet\Models\MetricPoint' , 'metric_id' , 'id' );
2014-12-01 08:52:34 +00:00
}
2015-01-21 02:32:18 -06:00
/**
* Returns the sum of all values a metric has .
*
* @ param int $hour
*
* @ return int
*/
public function getValues ( $hour )
{
2015-02-24 08:36:41 +00:00
$dateTime = new DateTime ();
$dateTime -> sub ( new DateInterval ( 'PT' . $hour . 'H' ));
2015-02-24 08:42:47 +00:00
if ( Config :: get ( 'database.default' ) === 'mysql' ) {
2015-03-17 16:41:23 +00:00
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' );
}
2015-02-24 08:42:47 +00:00
} else {
2015-03-17 16:41:23 +00:00
// 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) " ;
2015-03-26 15:07:16 -06:00
} else {
$queryType = " sum(metric_points.value) " ;
2015-03-17 16:41:23 +00:00
}
2015-04-18 13:59:37 +01:00
$query = DB :: select ( " select { $queryType } as aggregate FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE metric_points.metric_id = { $this -> id } AND to_char(metric_points.created_at, 'YYYYMMDDHH24') = :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') " , [
2015-02-25 15:00:08 +00:00
'timestamp' => $dateTime -> format ( 'YmdH' ),
]);
if ( isset ( $query [ 0 ])) {
$value = $query [ 0 ] -> aggregate ;
2015-02-25 14:23:25 +00:00
} else {
2015-02-25 15:00:08 +00:00
$value = 0 ;
2015-02-25 14:23:25 +00:00
}
2015-02-24 08:42:47 +00:00
}
2015-01-21 02:32:18 -06:00
if ( $value === 0 && $this -> default_value != $value ) {
return $this -> default_value ;
}
return $value ;
}
2014-11-27 16:05:00 +00:00
/**
* Determines whether a chart should be shown .
2014-12-30 18:19:22 +00:00
*
2014-11-27 16:05:00 +00:00
* @ return bool
*/
2014-12-20 21:20:17 +00:00
public function getShouldDisplayAttribute ()
{
2014-11-27 16:05:00 +00:00
return $this -> display_chart === 1 ;
}
2014-11-27 22:08:28 +00:00
}