From 3a5a4c7a5c673044b8704186d9f83d7760efdc46 Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Wed, 14 Oct 2026 17:15:33 +0200 Subject: [PATCH] tie together Repository factory class and execution of queries --- src/Analyze/Result/RepositoryMethod.php | 9 ++++ src/Repository/Repository.php | 45 ++++++++++--------- .../ResolutionStrategy/DeleteEntity.php | 2 +- src/Repository/ResolutionStrategy/FindAll.php | 2 +- .../ResolutionStrategy/FindById.php | 2 +- .../ResolutionStrategy/ResolutionStrategy.php | 2 +- .../ResolutionStrategy/SaveEntity.php | 2 +- .../ResolutionStrategy/UserDefinedQuery.php | 2 +- src/Sql/LazyQuery.php | 9 +++- tests/Analyze/EntityAnalyzerTest.php | 3 +- .../ResolutionStrategy/FindAllTest.php | 11 ++++- 11 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/Analyze/Result/RepositoryMethod.php b/src/Analyze/Result/RepositoryMethod.php index 9bc3b7c..3f58111 100644 --- a/src/Analyze/Result/RepositoryMethod.php +++ b/src/Analyze/Result/RepositoryMethod.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Kartierung\Analyze\Result; use Kartierung\Repository\ResolutionStrategy\ResolutionStrategy; +use Kartierung\Sql\LazyQuery; readonly class RepositoryMethod { @@ -25,4 +26,12 @@ readonly class RepositoryMethod { return str_starts_with($this->returnType, '?'); } + + /** + * @param array $parameters + */ + public function createQuery(array $parameters): LazyQuery + { + return $this->resolutionStrategy->createQuery($this, $parameters); + } } diff --git a/src/Repository/Repository.php b/src/Repository/Repository.php index 979c790..5edaca5 100644 --- a/src/Repository/Repository.php +++ b/src/Repository/Repository.php @@ -4,52 +4,55 @@ declare(strict_types=1); namespace Kartierung\Repository; -use Kartierung\Analyze\Exception\InvalidRepository; -use Kartierung\Attribute\Query; -use ReflectionClass; +use Kartierung\Analyze\RepositoryAnalyzer; +use Kartierung\Analyze\Result\RepositoryResult; +use Kartierung\Repository\ResolutionStrategy\ResolutionStrategyFactory; +use PDO; -class Repository +readonly class Repository { + public function __construct( + private PDO $pdo + ) {} + /** * @template R of object * @param class-string $clazz * @return R - * @noinspection PhpDocMissingThrowsInspection */ public function ofType(string $clazz): object { - /** @noinspection PhpUnhandledExceptionInspection */ - $refClass = new ReflectionClass($clazz); + $resolutionStrategyFactory = new ResolutionStrategyFactory(); + $repoResult = (new RepositoryAnalyzer($resolutionStrategyFactory))->analyze($clazz); /** * @var R of object * @phpstan-ignore varTag.nativeType */ - return new class($refClass) { - /** - * @param ReflectionClass $refClass - */ + return new class($repoResult, $this->pdo) { public function __construct( - private readonly ReflectionClass $refClass + private readonly RepositoryResult $repoResult, + private readonly PDO $pdo ) {} /** - * @param string $name + * @param string $methodName * @param list $arguments * @return mixed */ - public function __call(string $name, array $arguments): mixed + public function __call(string $methodName, array $arguments): mixed { - $method = $this->refClass->getMethod($name); - $queryAttr = $method->getAttributes(Query::class); + $repoMethod = $this->repoResult->methods[$methodName]; - if (count($queryAttr) !== 1) { - throw new InvalidRepository( - "Called method $name has an invalid number of Query attributes. Expected: 1" - ); + $argCount = 0; + $callParams = []; + foreach ($repoMethod->parameters as $parameter) { + $callParams[$parameter->name] = $arguments[$argCount++]; } - return ''; + $query = $repoMethod->createQuery($callParams); + + return $query->execute($this->pdo); } }; } diff --git a/src/Repository/ResolutionStrategy/DeleteEntity.php b/src/Repository/ResolutionStrategy/DeleteEntity.php index f6e4338..7d6547f 100644 --- a/src/Repository/ResolutionStrategy/DeleteEntity.php +++ b/src/Repository/ResolutionStrategy/DeleteEntity.php @@ -10,7 +10,7 @@ use PDO; class DeleteEntity implements ResolutionStrategy { - public function execute(RepositoryMethod $method, array $parameters): LazyQuery + public function createQuery(RepositoryMethod $method, array $parameters): LazyQuery { return new LazyQuery( function (PDO $pdo) { diff --git a/src/Repository/ResolutionStrategy/FindAll.php b/src/Repository/ResolutionStrategy/FindAll.php index 5d04269..71382c3 100644 --- a/src/Repository/ResolutionStrategy/FindAll.php +++ b/src/Repository/ResolutionStrategy/FindAll.php @@ -14,7 +14,7 @@ use PDOStatement; readonly class FindAll implements ResolutionStrategy { - public function execute(RepositoryMethod $method, array $parameters): LazyQuery + public function createQuery(RepositoryMethod $method, array $parameters): LazyQuery { return new LazyQuery(function (PDO $pdo) use ($method): array { /** @var class-string $entityFqcn */ diff --git a/src/Repository/ResolutionStrategy/FindById.php b/src/Repository/ResolutionStrategy/FindById.php index dd061be..14529cb 100644 --- a/src/Repository/ResolutionStrategy/FindById.php +++ b/src/Repository/ResolutionStrategy/FindById.php @@ -10,7 +10,7 @@ use PDO; class FindById implements ResolutionStrategy { - public function execute(RepositoryMethod $method, array $parameters): LazyQuery + public function createQuery(RepositoryMethod $method, array $parameters): LazyQuery { return new LazyQuery( function (PDO $pdo) { diff --git a/src/Repository/ResolutionStrategy/ResolutionStrategy.php b/src/Repository/ResolutionStrategy/ResolutionStrategy.php index 8c24255..040e87e 100644 --- a/src/Repository/ResolutionStrategy/ResolutionStrategy.php +++ b/src/Repository/ResolutionStrategy/ResolutionStrategy.php @@ -14,5 +14,5 @@ interface ResolutionStrategy * @param array $parameters * @return LazyQuery */ - public function execute(RepositoryMethod $method, array $parameters): LazyQuery; + public function createQuery(RepositoryMethod $method, array $parameters): LazyQuery; } diff --git a/src/Repository/ResolutionStrategy/SaveEntity.php b/src/Repository/ResolutionStrategy/SaveEntity.php index 8def6d1..798500e 100644 --- a/src/Repository/ResolutionStrategy/SaveEntity.php +++ b/src/Repository/ResolutionStrategy/SaveEntity.php @@ -10,7 +10,7 @@ use PDO; class SaveEntity implements ResolutionStrategy { - public function execute(RepositoryMethod $method, array $parameters): LazyQuery + public function createQuery(RepositoryMethod $method, array $parameters): LazyQuery { return new LazyQuery( function (PDO $pdo) { diff --git a/src/Repository/ResolutionStrategy/UserDefinedQuery.php b/src/Repository/ResolutionStrategy/UserDefinedQuery.php index 3d7068d..eb3c2fb 100644 --- a/src/Repository/ResolutionStrategy/UserDefinedQuery.php +++ b/src/Repository/ResolutionStrategy/UserDefinedQuery.php @@ -10,7 +10,7 @@ use PDO; class UserDefinedQuery implements ResolutionStrategy { - public function execute(RepositoryMethod $method, array $parameters): LazyQuery + public function createQuery(RepositoryMethod $method, array $parameters): LazyQuery { return new LazyQuery( function (PDO $pdo) { diff --git a/src/Sql/LazyQuery.php b/src/Sql/LazyQuery.php index 13281c3..1e2a17c 100644 --- a/src/Sql/LazyQuery.php +++ b/src/Sql/LazyQuery.php @@ -10,9 +10,14 @@ use PDO; readonly class LazyQuery { /** - * @param (Closure(PDO): mixed) $execute + * @param (Closure(PDO): mixed) $queryCall */ public function __construct( - public Closure $execute + private Closure $queryCall ) {} + + public function execute(PDO $pdo): mixed + { + return $this->queryCall->__invoke($pdo); + } } diff --git a/tests/Analyze/EntityAnalyzerTest.php b/tests/Analyze/EntityAnalyzerTest.php index ce5f684..5789fa8 100644 --- a/tests/Analyze/EntityAnalyzerTest.php +++ b/tests/Analyze/EntityAnalyzerTest.php @@ -11,7 +11,6 @@ use Kartierung\Analyze\Result\FieldAccess; use Kartierung\Analyze\Result\Type\ArrayType; use Kartierung\Analyze\Result\Type\PrimitiveType; use Kartierung\FullEntity; -use Kartierung\PropertyPropagatedEntity; use PHPUnit\Framework\TestCase; class EntityAnalyzerTest extends TestCase @@ -22,7 +21,7 @@ class EntityAnalyzerTest extends TestCase $entity = FullEntity::class; // When - $result = (new EntityAnalyzer(FullEntity::class))->analyze(); + $result = (new EntityAnalyzer($entity))->analyze(); // Then $this->assertEquals('simple-table', $result->tableName); diff --git a/tests/Repository/ResolutionStrategy/FindAllTest.php b/tests/Repository/ResolutionStrategy/FindAllTest.php index 9047fbb..83350ae 100644 --- a/tests/Repository/ResolutionStrategy/FindAllTest.php +++ b/tests/Repository/ResolutionStrategy/FindAllTest.php @@ -35,7 +35,7 @@ class FindAllTest extends TestCase public function testSelectsData(): void { // Given - $query = (new FindAll())->execute( + $query = (new FindAll())->createQuery( method: new RepositoryMethod( query: '', returnType: '', @@ -48,10 +48,17 @@ class FindAllTest extends TestCase ); // When - $result = $query->execute->__invoke($this->pdo); + $result = $query->execute($this->pdo); // Then $this->assertNotEmpty($result); + $this->assertEquals( + [ + new SimpleEntity(1, 'dings'), + new SimpleEntity(2, 'bumms') + ], + $result + ); } }