Metric repository now knows prefixes. Fixes #1938
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
63
app/Repositories/Metric/AbstractMetricRepository.php
Normal file
63
app/Repositories/Metric/AbstractMetricRepository.php
Normal 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';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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'),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -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'),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -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'),
|
||||||
]);
|
]);
|
||||||
|
|||||||
Reference in New Issue
Block a user