From eab0596c33cf2e659e7095dd4849af57c9ec64d3 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 2 Mar 2023 13:11:28 +0200 Subject: [PATCH] orm executor ref --- .../Espo/Core/ORM/EntityManagerFactory.php | 5 +- .../Espo/Core/ORM/EntityManagerProxy.php | 2 +- application/Espo/ORM/EntityManager.php | 10 +++- .../ORM/Executor/DefaultQueryExecutor.php | 50 +++++++++++++++++++ .../DefaultSqlExecutor.php} | 7 +-- .../Espo/ORM/{ => Executor}/QueryExecutor.php | 17 ++----- application/Espo/ORM/Executor/SqlExecutor.php | 43 ++++++++++++++++ application/Espo/ORM/Mapper/BaseMapper.php | 2 +- tests/unit/Espo/ORM/MapperTest.php | 14 +++--- tests/unit/Espo/ORM/SqlExecutorTest.php | 4 +- 10 files changed, 120 insertions(+), 34 deletions(-) create mode 100644 application/Espo/ORM/Executor/DefaultQueryExecutor.php rename application/Espo/ORM/{SqlExecutor.php => Executor/DefaultSqlExecutor.php} (97%) rename application/Espo/ORM/{ => Executor}/QueryExecutor.php (78%) create mode 100644 application/Espo/ORM/Executor/SqlExecutor.php diff --git a/application/Espo/Core/ORM/EntityManagerFactory.php b/application/Espo/Core/ORM/EntityManagerFactory.php index eb459d46c0..04498a37c5 100644 --- a/application/Espo/Core/ORM/EntityManagerFactory.php +++ b/application/Espo/Core/ORM/EntityManagerFactory.php @@ -36,6 +36,7 @@ use Espo\Core\Binding\BindingContainerBuilder; use Espo\Core\ORM\QueryComposer\Part\FunctionConverterFactory; use Espo\Core\Utils\Log; +use Espo\ORM\Executor\DefaultSqlExecutor; use Espo\ORM\Metadata; use Espo\ORM\EventDispatcher; use Espo\ORM\DatabaseParams; @@ -43,7 +44,7 @@ use Espo\ORM\PDO\PDOFactory; use Espo\ORM\QueryComposer\QueryComposerFactory as QueryComposerFactoryInterface; use Espo\ORM\Repository\RepositoryFactory as RepositoryFactoryInterface; use Espo\ORM\EntityFactory as EntityFactoryInterface; -use Espo\ORM\SqlExecutor; +use Espo\ORM\Executor\SqlExecutor; use Espo\ORM\Value\ValueFactoryFactory as ValueFactoryFactoryInterface; use Espo\ORM\Value\AttributeExtractorFactory as AttributeExtractorFactoryInterface; use Espo\ORM\PDO\PDOProvider; @@ -119,7 +120,7 @@ class EntityManagerFactory ->build() ); - $sqlExecutor = new SqlExecutor($pdoProvider, $this->log, $this->configDataProvider->logSql()); + $sqlExecutor = new DefaultSqlExecutor($pdoProvider, $this->log, $this->configDataProvider->logSql()); $binding = BindingContainerBuilder::create() ->bindInstance(DatabaseParams::class, $databaseParams) diff --git a/application/Espo/Core/ORM/EntityManagerProxy.php b/application/Espo/Core/ORM/EntityManagerProxy.php index 884efea15b..02851b1f31 100644 --- a/application/Espo/Core/ORM/EntityManagerProxy.php +++ b/application/Espo/Core/ORM/EntityManagerProxy.php @@ -33,7 +33,7 @@ use Espo\ORM\Entity; use Espo\ORM\Metadata; use Espo\ORM\Repository\RDBRepository; use Espo\ORM\Repository\Repository; -use Espo\ORM\SqlExecutor; +use Espo\ORM\Executor\SqlExecutor; use Espo\Core\Container; class EntityManagerProxy diff --git a/application/Espo/ORM/EntityManager.php b/application/Espo/ORM/EntityManager.php index 8f11d1440c..ca8df6b5c7 100644 --- a/application/Espo/ORM/EntityManager.php +++ b/application/Espo/ORM/EntityManager.php @@ -31,6 +31,10 @@ namespace Espo\ORM; use Espo\ORM\Defs\Defs; +use Espo\ORM\Executor\DefaultQueryExecutor; +use Espo\ORM\Executor\DefaultSqlExecutor; +use Espo\ORM\Executor\QueryExecutor; +use Espo\ORM\Executor\SqlExecutor; use Espo\ORM\QueryComposer\QueryComposer; use Espo\ORM\QueryComposer\QueryComposerFactory; use Espo\ORM\QueryComposer\QueryComposerWrapper; @@ -93,6 +97,7 @@ class EntityManager EventDispatcher $eventDispatcher, private PDOProvider $pdoProvider, private ?MapperFactory $mapperFactory = null, + ?QueryExecutor $queryExecutor = null, ?SqlExecutor $sqlExecutor = null ) { if (!$this->databaseParams->getPlatform()) { @@ -110,8 +115,9 @@ class EntityManager $this->initQueryComposer(); - $this->sqlExecutor = $sqlExecutor ?? new SqlExecutor($this->pdoProvider); - $this->queryExecutor = new QueryExecutor($this->sqlExecutor, $this->getQueryComposer()); + $this->sqlExecutor = $sqlExecutor ?? new DefaultSqlExecutor($this->pdoProvider); + $this->queryExecutor = $queryExecutor ?? + new DefaultQueryExecutor($this->sqlExecutor, $this->getQueryComposer()); $this->queryBuilder = new QueryBuilder(); $this->collectionFactory = new CollectionFactory($this); $this->transactionManager = new TransactionManager($this->pdoProvider->get(), $this->queryComposer); diff --git a/application/Espo/ORM/Executor/DefaultQueryExecutor.php b/application/Espo/ORM/Executor/DefaultQueryExecutor.php new file mode 100644 index 0000000000..8fed927392 --- /dev/null +++ b/application/Espo/ORM/Executor/DefaultQueryExecutor.php @@ -0,0 +1,50 @@ +queryComposer->compose($query); + + return $this->sqlExecutor->execute($sql, true); + } +} diff --git a/application/Espo/ORM/SqlExecutor.php b/application/Espo/ORM/Executor/DefaultSqlExecutor.php similarity index 97% rename from application/Espo/ORM/SqlExecutor.php rename to application/Espo/ORM/Executor/DefaultSqlExecutor.php index 6c17ce926b..5116e479bc 100644 --- a/application/Espo/ORM/SqlExecutor.php +++ b/application/Espo/ORM/Executor/DefaultSqlExecutor.php @@ -27,7 +27,7 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\ORM; +namespace Espo\ORM\Executor; use Espo\ORM\PDO\PDOProvider; use Psr\Log\LoggerInterface; @@ -38,10 +38,7 @@ use PDOException; use Exception; use RuntimeException; -/** - * Executes SQL queries. - */ -class SqlExecutor +class DefaultSqlExecutor implements SqlExecutor { private const MAX_ATTEMPT_COUNT = 4; diff --git a/application/Espo/ORM/QueryExecutor.php b/application/Espo/ORM/Executor/QueryExecutor.php similarity index 78% rename from application/Espo/ORM/QueryExecutor.php rename to application/Espo/ORM/Executor/QueryExecutor.php index 8f1e8f6ea1..273072197b 100644 --- a/application/Espo/ORM/QueryExecutor.php +++ b/application/Espo/ORM/Executor/QueryExecutor.php @@ -27,30 +27,19 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\ORM; +namespace Espo\ORM\Executor; use Espo\ORM\Query\Query; -use Espo\ORM\QueryComposer\QueryComposerWrapper; use PDOStatement; /** * Executes queries by given query params instances. */ -class QueryExecutor +interface QueryExecutor { - public function __construct( - private SqlExecutor $sqlExecutor, - private QueryComposerWrapper $queryComposer - ) {} - /** * Execute a query. */ - public function execute(Query $query): PDOStatement - { - $sql = $this->queryComposer->compose($query); - - return $this->sqlExecutor->execute($sql, true); - } + public function execute(Query $query): PDOStatement; } diff --git a/application/Espo/ORM/Executor/SqlExecutor.php b/application/Espo/ORM/Executor/SqlExecutor.php new file mode 100644 index 0000000000..641401c2b9 --- /dev/null +++ b/application/Espo/ORM/Executor/SqlExecutor.php @@ -0,0 +1,43 @@ +metadata = new Metadata($metadataDataProvider); - $this->sqlExecutor = $this->getMockBuilder(SqlExecutor::class)->disableOriginalConstructor()->getMock(); - - $entityManager = $this->getMockBuilder(EntityManager::class)->disableOriginalConstructor()->getMock(); + $this->sqlExecutor = $this->createMock(SqlExecutor::class); + $entityManager = $this->createMock(EntityManager::class); $entityManager ->method('getMetadata') ->will($this->returnValue($this->metadata)); - $this->entityFactory = $this->getMockBuilder(EntityFactory::class)->disableOriginalConstructor()->getMock(); + $this->entityFactory = $this->createMock(EntityFactory::class); $this->entityFactory ->expects($this->any()) @@ -124,7 +124,7 @@ class MapperTest extends \PHPUnit\Framework\TestCase $this->query = new QueryComposer($this->pdo, $this->entityFactory, $this->metadata); - $queryExecutor = new QueryExecutor($this->sqlExecutor, new QueryComposerWrapper($this->query)); + $queryExecutor = new DefaultQueryExecutor($this->sqlExecutor, new QueryComposerWrapper($this->query)); $this->db = new BaseMapper( $this->pdo, diff --git a/tests/unit/Espo/ORM/SqlExecutorTest.php b/tests/unit/Espo/ORM/SqlExecutorTest.php index 4be3b1c456..f959ba2bbe 100644 --- a/tests/unit/Espo/ORM/SqlExecutorTest.php +++ b/tests/unit/Espo/ORM/SqlExecutorTest.php @@ -29,8 +29,8 @@ namespace tests\unit\Espo\ORM; +use Espo\ORM\Executor\DefaultSqlExecutor; use Espo\ORM\PDO\PDOProvider; -use Espo\ORM\SqlExecutor; use PDO; use PDOStatement; @@ -50,7 +50,7 @@ class SqlExecutorTest extends \PHPUnit\Framework\TestCase $this->sth = $this->getMockBuilder(PDOStatement::class)->disableOriginalConstructor()->getMock(); - $this->executor = new SqlExecutor($pdoProvider); + $this->executor = new DefaultSqlExecutor($pdoProvider); } public function testExecute1()