. */ namespace SP\Infrastructure\Database; use Aura\SqlQuery\Common\Select; use Aura\SqlQuery\QueryInterface; use SP\Domain\Common\Models\Simple; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Database\Ports\QueryDataInterface; use function SP\__u; /** * Class QueryData */ final class QueryData implements QueryDataInterface { private const DEFAULT_MAP_CLASS = Simple::class; protected string $mapClassName = self::DEFAULT_MAP_CLASS; protected ?string $onErrorMessage = null; public function __construct(private readonly QueryInterface $query) { } public static function build(QueryInterface $query): QueryData { return new self($query); } public static function buildWithMapper(QueryInterface $query, string $class): QueryData { $self = new self($query); $self->mapClassName = self::checkClassOrDefault($class); return $self; } private static function checkClassOrDefault(string $class): string { return class_exists($class) ? $class : self::DEFAULT_MAP_CLASS; } public function getQuery(): QueryInterface { return $this->query; } public function getMapClassName(): string { return $this->mapClassName; } public function setMapClassName(string $class): QueryData { $this->mapClassName = self::checkClassOrDefault($class); return $this; } /** * @throws QueryException */ public function getQueryCount(): QueryInterface { if ($this->query instanceof Select) { $countQuery = (clone $this->query) ->resetCols() ->resetOrderBy() ->resetGroupBy() ->resetHaving() ->page(0); $countQuery->cols(['COUNT(*)']); return $countQuery; } throw new QueryException(__u('Invalid query type for count')); } public function getOnErrorMessage(): string { return $this->onErrorMessage ?: __u('Error while querying'); } public function setOnErrorMessage(string $onErrorMessage): QueryData { $this->onErrorMessage = $onErrorMessage; return $this; } }