Files
query_builder/src/Enforce/Database/Query/Builder.php

108 lines
3.1 KiB
PHP
Raw Normal View History

<?php
2024-08-03 20:58:53 -04:00
namespace ProVM\Enforce\Database\Query;
2024-08-03 20:58:53 -04:00
use Exception;
use FilesystemIterator;
use ProVM\Concept\Database\Query;
class Builder implements Query\Builder
{
public function __construct(array $query_classes)
{
$this->setQueries($query_classes);
}
2024-08-03 20:58:53 -04:00
/**
* @throws Exception
*/
public static function getClasses(string $databaseType): array
{
$directories = new FilesystemIterator(__DIR__);
foreach ($directories as $directory) {
if (!$directory->isDir()) {
continue;
}
if (strtolower($directory->getBasename()) !== strtolower($databaseType)) {
continue;
}
$classes = [];
$files = new FilesystemIterator($directory->getPathname());
foreach ($files as $file) {
if ($file->isDir()) {
continue;
}
$base = $file->getBasename('.php');
$interface = "ProVM\\Concept\\Database\\Query\\{$base}";
$class = __NAMESPACE__ . "\\{$directory->getBasename()}\\{$base}";
$classes[$interface] = $class;
}
return $classes;
}
throw new Exception("Database type's classes not found");
}
protected array $query_classes;
protected function getQueries(): array
{
return $this->query_classes;
}
protected function get(string $query_interface): string
{
return $this->query_classes[$query_interface];
}
protected function addQuery(string $query_interface, string $query): Builder
{
$this->query_classes[$query_interface] = $query;
return $this;
}
protected function setQueries(array $queries): Builder
{
foreach ($queries as $interface => $query) {
$this->addQuery($interface, $query);
}
return $this;
}
protected function build(string $query_interface, ?array $args = null): Query
{
$class = $this->get($query_interface);
if ($args !== null) {
return new $class(...$args);
}
return new $class;
}
public function select(array|string $columns = '*'): Query\Select
{
return $this->build(Query\Select::class, compact('columns'));
}
public function insert(?string $table = null): Query\Insert
{
return $this->build(Query\Insert::class, compact('table'));
}
public function update(?string $table = null): Query\Update
{
return $this->build(Query\Update::class, compact('table'));
}
public function delete(?string $table = null): Query\Delete
{
return $this->build(Query\Delete::class, compact('table'));
}
public function create(?string $table = null): Query\Create
{
return $this->build(Query\Create::class, compact('table'));
}
public function truncate(?string $table = null): Query\Truncate
{
return $this->build(Query\Truncate::class, compact('table'));
}
public function drop(?string $table = null): Query\Drop
{
return $this->build(Query\Drop::class, compact('table'));
}
}