From f4d64b8a79b54e6887d14fe090c388fe316e82a1 Mon Sep 17 00:00:00 2001 From: Victor GREBOT Date: Wed, 21 May 2025 17:41:19 +0200 Subject: [PATCH] feature: improve queryBuilder DX --- CHANGELOG | 3 ++ src/Ting/Repository/Repository.php | 65 +++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 375ae9bc..e3dafc7c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +3.13.0 (unreleased): + * Deprecate getQueryBuilder and add 4 dedicated getter for Select, Update, Delete & Insert + 3.12.1 (2025-12-16): * Fix Hydrator: disable identity map now prevent storing entities diff --git a/src/Ting/Repository/Repository.php b/src/Ting/Repository/Repository.php index 419965b8..890b6ee0 100644 --- a/src/Ting/Repository/Repository.php +++ b/src/Ting/Repository/Repository.php @@ -25,6 +25,10 @@ namespace CCMBenchmark\Ting\Repository; +use Aura\SqlQuery\Common\DeleteInterface; +use Aura\SqlQuery\Common\InsertInterface; +use Aura\SqlQuery\Common\SelectInterface; +use Aura\SqlQuery\Common\UpdateInterface; use Aura\SqlQuery\QueryFactory as AuraQueryFactory; use Aura\SqlQuery\QueryInterface; use CCMBenchmark\Ting\Connection; @@ -201,14 +205,14 @@ public function getCachedPreparedQuery($sql) /** + * @deprecated Use get{Select,Update,Delete,Insert}QueryBuilder instead * @param string $type One of the QUERY_ constant * @return QueryInterface * @throws DriverException */ public function getQueryBuilder($type) { - $driver = $this->connectionPool->getDriverClass($this->metadata->getConnectionName()); - $driver = ltrim($driver, '\\'); + $driver = $this->getDriverForConnection(); switch ($driver) { case Pgsql\Driver::class: @@ -233,6 +237,39 @@ public function getQueryBuilder($type) return $queryBuilder; } + public function getSelectQueryBuilder(): SelectInterface + { + $driver = $this->getDriverForConnection(); + $queryFactory = $this->getQueryFactoryForDriver($driver); + + return $queryFactory->newSelect(); + } + + + public function getUpdateQueryBuilder(): UpdateInterface + { + $driver = $this->getDriverForConnection(); + $queryFactory = $this->getQueryFactoryForDriver($driver); + + return $queryFactory->newUpdate(); + } + + public function getDeleteQueryBuilder(): DeleteInterface + { + $driver = $this->getDriverForConnection(); + $queryFactory = $this->getQueryFactoryForDriver($driver); + + return $queryFactory->newDelete(); + } + + public function getInsertQueryBuilder(): InsertInterface + { + $driver = $this->getDriverForConnection(); + $queryFactory = $this->getQueryFactoryForDriver($driver); + + return $queryFactory->newInsert(); + } + /** * Retrieve one object from database * @@ -403,4 +440,28 @@ public function getMetadata() { return $this->metadata; } + + private function getDriverForConnection(): string + { + $driver = $this->connectionPool->getDriverClass($this->metadata->getConnectionName()); + return ltrim($driver, '\\'); + } + + private function getQueryFactoryForDriver(string $driver): AuraQueryFactory + { + switch ($driver) { + case Pgsql\Driver::class: + $queryFactory = new AuraQueryFactory('pgsql'); + break; + case SphinxQL\Driver::class: + // SphinxQL and Mysqli are sharing the same driver + case Mysqli\Driver::class: + $queryFactory = new AuraQueryFactory('mysql'); + break; + default: + throw new DriverException('Driver ' . $driver . ' is unknown to build QueryBuilder'); + } + + return $queryFactory; + } }