HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/iphim.naniguide.com/common/Database/Metrics/BaseMetric.php
<?php

namespace Common\Database\Metrics;

use Common\Database\Metrics\Traits\RoundingPrecision;
use Illuminate\Contracts\Database\Query\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Query\Expression;

abstract class BaseMetric
{
    use RoundingPrecision;

    protected Builder $query;

    public function __construct(
        public Builder|string|Model $model,
        public MetricDateRange $dateRange,
        public string|Expression|null $column = null,
        public string|null $dateColumn = null,
        protected int $limit = 100,
    ) {
        $this->query =
            $this->model instanceof Builder
                ? $this->model->clone()
                : (new $this->model())->newQuery();

        if (!$this->dateColumn) {
            $this->dateColumn = $this->query
                ->getModel()
                ->getQualifiedCreatedAtColumn();
        }
    }

    public function count(): array
    {
        return $this->aggregate('count');
    }

    public function average(): array
    {
        return $this->aggregate('avg');
    }

    public function sum(): array
    {
        return $this->aggregate('sum');
    }

    public function max(): array
    {
        return $this->aggregate('max');
    }

    public function min(): array
    {
        return $this->aggregate('min');
    }

    abstract protected function aggregate(string $function);

    protected function getWrappedColumn(): string
    {
        $column =
            $this->column ?: $this->query->getModel()->getQualifiedKeyName();
        return $column instanceof Expression
            ? (string) $column
            : $this->query
                ->getQuery()
                ->getGrammar()
                ->wrap($column);
    }

    protected function round(int|float $value): float
    {
        return round($value, $this->roundingPrecision, $this->roundingMode);
    }
}