diff --git a/app/Foundation/Providers/RepositoryServiceProvider.php b/app/Foundation/Providers/RepositoryServiceProvider.php index 8e5b00aa..56afc6a1 100644 --- a/app/Foundation/Providers/RepositoryServiceProvider.php +++ b/app/Foundation/Providers/RepositoryServiceProvider.php @@ -16,8 +16,15 @@ use CachetHQ\Cachet\Repositories\Metric\MetricRepository; use CachetHQ\Cachet\Repositories\Metric\MySqlRepository as MetricMySqlRepository; use CachetHQ\Cachet\Repositories\Metric\PgSqlRepository as MetricPgSqlRepository; use CachetHQ\Cachet\Repositories\Metric\SqliteRepository as MetricSqliteRepository; +use Illuminate\Contracts\Config\Repository as ConfigRepository; +use Illuminate\Contracts\Container\Container; use Illuminate\Support\ServiceProvider; +/** + * This is the repository service provider. + * + * @author James Brooks + */ class RepositoryServiceProvider extends ServiceProvider { /** @@ -37,15 +44,16 @@ class RepositoryServiceProvider extends ServiceProvider */ protected function registerMetricRepository() { - $this->app->singleton(MetricRepository::class, function ($app) { - $dbDriver = $app['config']->get('database.default'); + $this->app->singleton(MetricRepository::class, function (Container $app) { + $config = $app->make(ConfigRepository::class); + $driver = $config->get('database.default'); - if ($dbDriver == 'mysql') { - $repository = new MetricMySqlRepository(); - } elseif ($dbDriver == 'pgsql') { - $repository = new MetricPgSqlRepository(); - } elseif ($dbDriver == 'sqlite') { - $repository = new MetricSqliteRepository(); + if ($driver == 'mysql') { + $repository = new MetricMySqlRepository($config); + } elseif ($driver == 'pgsql') { + $repository = new MetricPgSqlRepository($config); + } elseif ($driver == 'sqlite') { + $repository = new MetricSqliteRepository($config); } $dates = $app->make(DateFactory::class); diff --git a/app/Repositories/Metric/AbstractMetricRepository.php b/app/Repositories/Metric/AbstractMetricRepository.php new file mode 100644 index 00000000..c781d281 --- /dev/null +++ b/app/Repositories/Metric/AbstractMetricRepository.php @@ -0,0 +1,63 @@ + + */ +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'; + } +} diff --git a/app/Repositories/Metric/MySqlRepository.php b/app/Repositories/Metric/MySqlRepository.php index 980a67a0..a9cca086 100644 --- a/app/Repositories/Metric/MySqlRepository.php +++ b/app/Repositories/Metric/MySqlRepository.php @@ -16,7 +16,12 @@ use DateInterval; use Illuminate\Support\Facades\DB; use Jenssegers\Date\Date; -class MySqlRepository implements MetricInterface +/** + * This is the mysql repository class. + * + * @author James Brooks + */ +class MySqlRepository extends AbstractMetricRepository implements MetricInterface { /** * Returns metrics for the last hour. @@ -40,7 +45,7 @@ class MySqlRepository implements MetricInterface $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, 'timeInterval' => $timeInterval, ]); @@ -77,7 +82,7 @@ class MySqlRepository implements MetricInterface $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, 'hourInterval' => $hourInterval, ]); @@ -112,7 +117,7 @@ class MySqlRepository implements MetricInterface $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, 'timeInterval' => $dateTime->format('Ymd'), ]); diff --git a/app/Repositories/Metric/PgSqlRepository.php b/app/Repositories/Metric/PgSqlRepository.php index 84695356..739c543b 100644 --- a/app/Repositories/Metric/PgSqlRepository.php +++ b/app/Repositories/Metric/PgSqlRepository.php @@ -16,7 +16,12 @@ use DateInterval; use Illuminate\Support\Facades\DB; use Jenssegers\Date\Date; -class PgSqlRepository implements MetricInterface +/** + * This is the pgsql repository class. + * + * @author James Brooks + */ +class PgSqlRepository extends AbstractMetricRepository implements MetricInterface { /** * Returns metrics for the last hour. @@ -41,7 +46,7 @@ class PgSqlRepository implements MetricInterface } $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, 'timeInterval' => $dateTime->format('YmdHi'), ]); @@ -79,7 +84,7 @@ class PgSqlRepository implements MetricInterface } $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, 'timeInterval' => $dateTime->format('YmdH'), ]); @@ -113,7 +118,7 @@ class PgSqlRepository implements MetricInterface } $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, 'timeInterval' => $dateTime->format('Ymd'), ]); diff --git a/app/Repositories/Metric/SqliteRepository.php b/app/Repositories/Metric/SqliteRepository.php index 6467b606..403d7761 100644 --- a/app/Repositories/Metric/SqliteRepository.php +++ b/app/Repositories/Metric/SqliteRepository.php @@ -16,7 +16,7 @@ use DateInterval; use Illuminate\Support\Facades\DB; use Jenssegers\Date\Date; -class SqliteRepository implements MetricInterface +class SqliteRepository extends AbstractMetricRepository implements MetricInterface { /** * Returns metrics for the last hour. @@ -41,7 +41,7 @@ class SqliteRepository implements MetricInterface } $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, 'timeInterval' => $dateTime->format('YmdHi'), ]); @@ -79,7 +79,7 @@ class SqliteRepository implements MetricInterface } $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, 'timeInterval' => $dateTime->format('YmdH'), ]); @@ -116,7 +116,7 @@ class SqliteRepository implements MetricInterface } $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, 'timeInterval' => $dateTime->format('Ymd'), ]);