Metric repository now knows prefixes. Fixes #1938

This commit is contained in:
James Brooks
2016-07-06 18:42:31 +01:00
parent 7c846d06ff
commit 1fdda03199
5 changed files with 101 additions and 20 deletions

View File

@@ -16,8 +16,15 @@ use CachetHQ\Cachet\Repositories\Metric\MetricRepository;
use CachetHQ\Cachet\Repositories\Metric\MySqlRepository as MetricMySqlRepository; use CachetHQ\Cachet\Repositories\Metric\MySqlRepository as MetricMySqlRepository;
use CachetHQ\Cachet\Repositories\Metric\PgSqlRepository as MetricPgSqlRepository; use CachetHQ\Cachet\Repositories\Metric\PgSqlRepository as MetricPgSqlRepository;
use CachetHQ\Cachet\Repositories\Metric\SqliteRepository as MetricSqliteRepository; use CachetHQ\Cachet\Repositories\Metric\SqliteRepository as MetricSqliteRepository;
use Illuminate\Contracts\Config\Repository as ConfigRepository;
use Illuminate\Contracts\Container\Container;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
/**
* This is the repository service provider.
*
* @author James Brooks <james@alt-three.com>
*/
class RepositoryServiceProvider extends ServiceProvider class RepositoryServiceProvider extends ServiceProvider
{ {
/** /**
@@ -37,15 +44,16 @@ class RepositoryServiceProvider extends ServiceProvider
*/ */
protected function registerMetricRepository() protected function registerMetricRepository()
{ {
$this->app->singleton(MetricRepository::class, function ($app) { $this->app->singleton(MetricRepository::class, function (Container $app) {
$dbDriver = $app['config']->get('database.default'); $config = $app->make(ConfigRepository::class);
$driver = $config->get('database.default');
if ($dbDriver == 'mysql') { if ($driver == 'mysql') {
$repository = new MetricMySqlRepository(); $repository = new MetricMySqlRepository($config);
} elseif ($dbDriver == 'pgsql') { } elseif ($driver == 'pgsql') {
$repository = new MetricPgSqlRepository(); $repository = new MetricPgSqlRepository($config);
} elseif ($dbDriver == 'sqlite') { } elseif ($driver == 'sqlite') {
$repository = new MetricSqliteRepository(); $repository = new MetricSqliteRepository($config);
} }
$dates = $app->make(DateFactory::class); $dates = $app->make(DateFactory::class);

View File

@@ -0,0 +1,63 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Cachet\Repositories\Metric;
use CachetHQ\Cachet\Models\Metric;
use Illuminate\Contracts\Config\Repository;
/**
* This is the abstract metric repository class.
*
* @author Jams Brooks <james@alt-three.com>
*/
abstract class AbstractMetricRepository
{
/**
* The illuminate config repository.
*
* @var \Illuminate\Contracts\Config\Repository
*/
protected $config;
/**
* The name of the metrics table.
*
* @var string
*/
protected $tableName;
/**
* Create a new abstract metric repository instance.
*
* @param \Illuminate\Contracts\Config\Repository $config
*
* @return void
*/
public function __construct(Repository $config)
{
$this->config = $config;
}
/**
* Get the metrics table name.
*
* @return string
*/
protected function getTableName()
{
$driver = $this->config->get('database.default');
$connection = $this->config->get('database.connections.'.$driver);
$prefix = $connection['prefix'];
return $prefix.'metrics';
}
}

View File

@@ -16,7 +16,12 @@ use DateInterval;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Jenssegers\Date\Date; use Jenssegers\Date\Date;
class MySqlRepository implements MetricInterface /**
* This is the mysql repository class.
*
* @author James Brooks <james@alt-three.com>
*/
class MySqlRepository extends AbstractMetricRepository implements MetricInterface
{ {
/** /**
* Returns metrics for the last hour. * Returns metrics for the last hour.
@@ -40,7 +45,7 @@ class MySqlRepository implements MetricInterface
$value = 0; $value = 0;
$points = DB::select("SELECT {$queryType} FROM metrics m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND DATE_FORMAT(mp.`created_at`, '%Y%m%d%H%i') = :timeInterval GROUP BY HOUR(mp.`created_at`), MINUTE(mp.`created_at`)", [ $points = DB::select("SELECT {$queryType} FROM {$this->getTableName()} m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND DATE_FORMAT(mp.`created_at`, '%Y%m%d%H%i') = :timeInterval GROUP BY HOUR(mp.`created_at`), MINUTE(mp.`created_at`)", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $timeInterval, 'timeInterval' => $timeInterval,
]); ]);
@@ -77,7 +82,7 @@ class MySqlRepository implements MetricInterface
$value = 0; $value = 0;
$points = DB::select("SELECT {$queryType} FROM metrics m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND DATE_FORMAT(mp.`created_at`, '%Y%m%d%H') = :hourInterval GROUP BY HOUR(mp.`created_at`)", [ $points = DB::select("SELECT {$queryType} FROM {$this->getTableName()} m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND DATE_FORMAT(mp.`created_at`, '%Y%m%d%H') = :hourInterval GROUP BY HOUR(mp.`created_at`)", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'hourInterval' => $hourInterval, 'hourInterval' => $hourInterval,
]); ]);
@@ -112,7 +117,7 @@ class MySqlRepository implements MetricInterface
$value = 0; $value = 0;
$points = DB::select("SELECT {$queryType} FROM metrics m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND mp.`created_at` BETWEEN DATE_SUB(mp.`created_at`, INTERVAL 1 WEEK) AND DATE_ADD(NOW(), INTERVAL 1 DAY) AND DATE_FORMAT(mp.`created_at`, '%Y%m%d') = :timeInterval GROUP BY DATE_FORMAT(mp.`created_at`, '%Y%m%d')", [ $points = DB::select("SELECT {$queryType} FROM {$this->getTableName()} m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND mp.`created_at` BETWEEN DATE_SUB(mp.`created_at`, INTERVAL 1 WEEK) AND DATE_ADD(NOW(), INTERVAL 1 DAY) AND DATE_FORMAT(mp.`created_at`, '%Y%m%d') = :timeInterval GROUP BY DATE_FORMAT(mp.`created_at`, '%Y%m%d')", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $dateTime->format('Ymd'), 'timeInterval' => $dateTime->format('Ymd'),
]); ]);

View File

@@ -16,7 +16,12 @@ use DateInterval;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Jenssegers\Date\Date; use Jenssegers\Date\Date;
class PgSqlRepository implements MetricInterface /**
* This is the pgsql repository class.
*
* @author James Brooks <james@alt-three.com>
*/
class PgSqlRepository extends AbstractMetricRepository implements MetricInterface
{ {
/** /**
* Returns metrics for the last hour. * Returns metrics for the last hour.
@@ -41,7 +46,7 @@ class PgSqlRepository implements MetricInterface
} }
$value = 0; $value = 0;
$query = DB::select("select {$queryType} as value FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE metrics.id = :metricId AND to_char(metric_points.created_at, 'YYYYMMDDHH24MI') = :timeInterval GROUP BY to_char(metric_points.created_at, 'HHMI')", [ $query = DB::select("select {$queryType} as value FROM {$this->getTableName()} m JOIN metric_points ON metric_points.metric_id = m.id WHERE m.id = :metricId AND to_char(metric_points.created_at, 'YYYYMMDDHH24MI') = :timeInterval GROUP BY to_char(metric_points.created_at, 'HHMI')", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $dateTime->format('YmdHi'), 'timeInterval' => $dateTime->format('YmdHi'),
]); ]);
@@ -79,7 +84,7 @@ class PgSqlRepository implements MetricInterface
} }
$value = 0; $value = 0;
$query = DB::select("select {$queryType} as value FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE metric_points.metric_id = :metricId AND to_char(metric_points.created_at, 'YYYYMMDDHH24') = :timeInterval GROUP BY to_char(metric_points.created_at, 'H')", [ $query = DB::select("select {$queryType} as value FROM {$this->getTableName()} m JOIN metric_points ON metric_points.metric_id = m.id WHERE metric_points.metric_id = :metricId AND to_char(metric_points.created_at, 'YYYYMMDDHH24') = :timeInterval GROUP BY to_char(metric_points.created_at, 'H')", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $dateTime->format('YmdH'), 'timeInterval' => $dateTime->format('YmdH'),
]); ]);
@@ -113,7 +118,7 @@ class PgSqlRepository implements MetricInterface
} }
$value = 0; $value = 0;
$points = DB::select("SELECT {$queryType} FROM metrics m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND mp.created_at BETWEEN (mp.created_at - interval '1 week') AND (now() + interval '1 day') AND to_char(mp.created_at, 'YYYYMMDD') = :timeInterval GROUP BY to_char(mp.created_at, 'YYYYMMDD')", [ $points = DB::select("SELECT {$queryType} FROM {$this->getTableName()} m INNER JOIN metric_points mp ON m.id = mp.metric_id WHERE m.id = :metricId AND mp.created_at BETWEEN (mp.created_at - interval '1 week') AND (now() + interval '1 day') AND to_char(mp.created_at, 'YYYYMMDD') = :timeInterval GROUP BY to_char(mp.created_at, 'YYYYMMDD')", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $dateTime->format('Ymd'), 'timeInterval' => $dateTime->format('Ymd'),
]); ]);

View File

@@ -16,7 +16,7 @@ use DateInterval;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Jenssegers\Date\Date; use Jenssegers\Date\Date;
class SqliteRepository implements MetricInterface class SqliteRepository extends AbstractMetricRepository implements MetricInterface
{ {
/** /**
* Returns metrics for the last hour. * Returns metrics for the last hour.
@@ -41,7 +41,7 @@ class SqliteRepository implements MetricInterface
} }
$value = 0; $value = 0;
$query = DB::select("select {$queryType} as value FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE metrics.id = :metricId AND strftime('%Y%m%d%H%M', metric_points.created_at) = :timeInterval GROUP BY strftime('%H%M', metric_points.created_at)", [ $query = DB::select("select {$queryType} as value FROM {$this->getTableName()} m JOIN metric_points ON metric_points.metric_id = m.id WHERE m.id = :metricId AND strftime('%Y%m%d%H%M', metric_points.created_at) = :timeInterval GROUP BY strftime('%H%M', metric_points.created_at)", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $dateTime->format('YmdHi'), 'timeInterval' => $dateTime->format('YmdHi'),
]); ]);
@@ -79,7 +79,7 @@ class SqliteRepository implements MetricInterface
} }
$value = 0; $value = 0;
$query = DB::select("select {$queryType} as value FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE metrics.id = :metricId AND strftime('%Y%m%d%H', metric_points.created_at) = :timeInterval GROUP BY strftime('%H', metric_points.created_at)", [ $query = DB::select("select {$queryType} as value FROM {$this->getTableName()} m JOIN metric_points ON metric_points.metric_id = m.id WHERE m.id = :metricId AND strftime('%Y%m%d%H', metric_points.created_at) = :timeInterval GROUP BY strftime('%H', metric_points.created_at)", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $dateTime->format('YmdH'), 'timeInterval' => $dateTime->format('YmdH'),
]); ]);
@@ -116,7 +116,7 @@ class SqliteRepository implements MetricInterface
} }
$value = 0; $value = 0;
$query = DB::select("select {$queryType} as value FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE metrics.id = :metricId AND metric_points.created_at > date('now', '-7 day') AND strftime('%Y%m%d', metric_points.created_at) = :timeInterval GROUP BY strftime('%Y%m%d', metric_points.created_at)", [ $query = DB::select("select {$queryType} as value FROM {$this->getTableName()} m JOIN metric_points ON metric_points.metric_id = m.id WHERE m.id = :metricId AND metric_points.created_at > date('now', '-7 day') AND strftime('%Y%m%d', metric_points.created_at) = :timeInterval GROUP BY strftime('%Y%m%d', metric_points.created_at)", [
'metricId' => $metric->id, 'metricId' => $metric->id,
'timeInterval' => $dateTime->format('Ymd'), 'timeInterval' => $dateTime->format('Ymd'),
]); ]);