drop select builder factory service

This commit is contained in:
Yuri Kuznetsov
2025-08-16 18:22:57 +03:00
parent b05072d21e
commit 6a33ffc0fa
14 changed files with 113 additions and 139 deletions
-5
View File
@@ -133,11 +133,6 @@ class Binding implements BindingProcessor
'authTokenManager'
);
$binder->bindService(
'Espo\\Core\\Select\\SelectBuilderFactory',
'selectBuilderFactory'
);
$binder->bindService(
'Espo\\Core\\ServiceFactory',
'serviceFactory'
@@ -1,37 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Di;
use Espo\Core\Select\SelectBuilderFactory;
interface SelectBuilderFactoryAware
{
public function setSelectBuilderFactory(SelectBuilderFactory $selectBuilderFactory): void;
}
@@ -1,45 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Di;
use Espo\Core\Select\SelectBuilderFactory;
trait SelectBuilderFactorySetter
{
/**
* @var SelectBuilderFactory
*/
protected $selectBuilderFactory;
public function setSelectBuilderFactory(SelectBuilderFactory $selectBuilderFactory): void
{
$this->selectBuilderFactory = $selectBuilderFactory;
}
}
@@ -34,16 +34,22 @@ use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Formula\Exceptions\Error;
use Espo\Core\Formula\Functions\Base;
use Espo\Core\Formula\Functions\RecordGroup\Util\FindQueryUtil;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\ORM\Defs\Params\RelationParam;
use Espo\Core\Di;
use stdClass;
/**
* @noinspection PhpUnused
*/
class CountRelatedType extends Base implements
Di\EntityManagerAware,
Di\SelectBuilderFactoryAware
Di\InjectableFactoryAware,
Di\UserAware
{
use Di\EntityManagerSetter;
use Di\SelectBuilderFactorySetter;
use Di\InjectableFactorySetter;
use Di\UserSetter;
/**
* @return int
@@ -77,8 +83,9 @@ class CountRelatedType extends Base implements
throw new Error();
}
$builder = $this->selectBuilderFactory
$builder = $this->injectableFactory->create(SelectBuilderFactory::class)
->create()
->forUser($this->user)
->from($foreignEntityType);
if ($filter) {
@@ -35,17 +35,23 @@ use Espo\Core\Di;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Formula\Functions\Base;
use Espo\Core\Formula\Functions\RecordGroup\Util\FindQueryUtil;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\ORM\Defs\Params\RelationParam;
use Espo\ORM\Name\Attribute;
use stdClass;
use PDO;
/**
* @noinspection PhpUnused
*/
class SumRelatedType extends Base implements
Di\EntityManagerAware,
Di\SelectBuilderFactoryAware
Di\InjectableFactoryAware,
Di\UserAware
{
use Di\EntityManagerSetter;
use Di\SelectBuilderFactorySetter;
use Di\InjectableFactorySetter;
use Di\UserSetter;
/**
* @return float
@@ -92,8 +98,9 @@ class SumRelatedType extends Base implements
throw new Error("No foreign link for link {$link}.");
}
$builder = $this->selectBuilderFactory
$builder = $this->injectableFactory->create(SelectBuilderFactory::class)
->create()
->forUser($this->user)
->from($foreignEntityType);
if ($filter) {
@@ -36,13 +36,19 @@ use Espo\Core\Formula\Exceptions\Error;
use Espo\Core\Formula\Functions\BaseFunction;
use Espo\Core\Formula\Functions\RecordGroup\Util\FindQueryUtil;
use Espo\Core\Di;
use Espo\Core\Select\SelectBuilderFactory;
/**
* @noinspection PhpUnused
*/
class CountType extends BaseFunction implements
Di\EntityManagerAware,
Di\SelectBuilderFactoryAware
Di\InjectableFactoryAware,
Di\UserAware
{
use Di\EntityManagerSetter;
use Di\SelectBuilderFactorySetter;
use Di\InjectableFactorySetter;
use Di\UserSetter;
public function process(ArgumentList $args)
{
@@ -59,8 +65,9 @@ class CountType extends BaseFunction implements
$filter = $this->evaluate($args[1]);
}
$builder = $this->selectBuilderFactory
$builder = $this->injectableFactory->create(SelectBuilderFactory::class)
->create()
->forUser($this->user)
->from($entityType);
(new FindQueryUtil())->applyFilter($builder, $filter, 2);
@@ -36,13 +36,19 @@ use Espo\Core\Formula\Exceptions\Error;
use Espo\Core\Formula\Functions\BaseFunction;
use Espo\Core\Di;
use Espo\Core\Formula\Functions\RecordGroup\Util\FindQueryUtil;
use Espo\Core\Select\SelectBuilderFactory;
/**
* @noinspection PhpUnused
*/
class ExistsType extends BaseFunction implements
Di\EntityManagerAware,
Di\SelectBuilderFactoryAware
Di\InjectableFactoryAware,
Di\UserAware
{
use Di\EntityManagerSetter;
use Di\SelectBuilderFactorySetter;
use Di\InjectableFactorySetter;
use Di\UserSetter;
public function process(ArgumentList $args)
{
@@ -59,8 +65,9 @@ class ExistsType extends BaseFunction implements
$filter = $this->evaluate($args[1]);
}
$builder = $this->selectBuilderFactory
$builder = $this->injectableFactory->create(SelectBuilderFactory::class)
->create()
->forUser($this->user)
->from($entityType);
(new FindQueryUtil())->applyFilter($builder, $filter, 2);
@@ -36,6 +36,7 @@ use Espo\Core\Formula\Exceptions\Error as FormulaError;
use Espo\Core\Formula\Functions\BaseFunction;
use Espo\Core\Di;
use Espo\Core\Formula\Functions\RecordGroup\Util\FindQueryUtil;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\Part\Order;
@@ -44,10 +45,12 @@ use Espo\ORM\Query\Part\Order;
*/
class FindOneType extends BaseFunction implements
Di\EntityManagerAware,
Di\SelectBuilderFactoryAware
Di\InjectableFactoryAware,
Di\UserAware
{
use Di\EntityManagerSetter;
use Di\SelectBuilderFactorySetter;
use Di\InjectableFactorySetter;
use Di\UserSetter;
public function process(ArgumentList $args)
{
@@ -59,8 +62,9 @@ class FindOneType extends BaseFunction implements
$orderBy = $this->evaluate($args[1]);
$order = $this->evaluate($args[2]) ?? Order::ASC;
$builder = $this->selectBuilderFactory
$builder = $this->injectableFactory->create(SelectBuilderFactory::class)
->create()
->forUser($this->user)
->from($entityType);
$whereClause = [];
@@ -41,20 +41,24 @@ use Espo\Core\Formula\ArgumentList;
use Espo\Core\Formula\Functions\BaseFunction;
use Espo\Core\Di;
use Espo\Core\Select\Helpers\RandomStringGenerator;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\ORM\Defs\Params\RelationParam;
use Espo\ORM\Name\Attribute;
use Espo\ORM\Type\RelationType;
/**
* @noinspection PhpUnused
*/
class FindRelatedManyType extends BaseFunction implements
Di\EntityManagerAware,
Di\SelectBuilderFactoryAware,
Di\MetadataAware,
Di\InjectableFactoryAware
Di\InjectableFactoryAware,
Di\UserAware
{
use Di\EntityManagerSetter;
use Di\SelectBuilderFactorySetter;
use Di\MetadataSetter;
use Di\InjectableFactorySetter;
use Di\UserSetter;
/**
* @throws Error
@@ -158,8 +162,9 @@ class FindRelatedManyType extends BaseFunction implements
$this->throwError("Not supported link '$link'.");
}
$builder = $this->selectBuilderFactory
$builder = $this->injectableFactory->create(SelectBuilderFactory::class)
->create()
->forUser($this->user)
->from($foreignEntityType);
$whereClause = [];
@@ -32,6 +32,7 @@ namespace Espo\Core\Formula\Functions\RecordGroup;
use Espo\Core\Exceptions\BadRequest;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\ORM\Entity as CoreEntity;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\ORM\Defs\Params\RelationParam;
use Espo\ORM\Name\Attribute;
use Espo\Core\Formula\ArgumentList;
@@ -42,14 +43,19 @@ use Espo\Core\Di;
use Espo\ORM\Query\Part\Order;
use Espo\ORM\Type\RelationType;
/**
* @noinspection PhpUnused
*/
class FindRelatedOneType extends BaseFunction implements
Di\EntityManagerAware,
Di\SelectBuilderFactoryAware,
Di\MetadataAware
Di\MetadataAware,
Di\InjectableFactoryAware,
Di\UserAware
{
use Di\EntityManagerSetter;
use Di\SelectBuilderFactorySetter;
use Di\MetadataSetter;
use Di\InjectableFactorySetter;
use Di\UserSetter;
public function process(ArgumentList $args)
{
@@ -142,8 +148,9 @@ class FindRelatedOneType extends BaseFunction implements
$this->throwError("Not supported link '$link'.");
}
$builder = $this->selectBuilderFactory
$builder = $this->injectableFactory->create(SelectBuilderFactory::class)
->create()
->forUser($this->user)
->from($foreignEntityType);
$whereClause = [];
+16 -9
View File
@@ -59,6 +59,8 @@ use Espo\Core\Record\Input\Data;
use Espo\Core\Record\Input\Filter;
use Espo\Core\Record\Input\FilterProvider;
use Espo\Core\Select\Primary\Filters\One;
use Espo\Core\Select\SelectBuilder;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\Core\Utils\Json;
use Espo\Core\Acl;
use Espo\Core\Acl\Table as AclTable;
@@ -109,7 +111,6 @@ class Service implements Crud,
Di\FieldUtilAware,
Di\FieldValidationManagerAware,
Di\RecordServiceContainerAware,
Di\SelectBuilderFactoryAware,
Di\AssignmentCheckerManagerAware
{
use Di\ConfigSetter;
@@ -122,7 +123,6 @@ class Service implements Crud,
use Di\FieldUtilSetter;
use Di\FieldValidationManagerSetter;
use Di\RecordServiceContainerSetter;
use Di\SelectBuilderFactorySetter;
use Di\AssignmentCheckerManagerSetter;
protected string $entityType;
@@ -156,11 +156,21 @@ class Service implements Crud,
protected const MAX_SELECT_TEXT_ATTRIBUTE_LENGTH = 10000;
public function __construct(string $entityType = '')
{
public function __construct(
protected SelectBuilderFactory $selectBuilderFactory,
string $entityType = '',
) {
$this->entityType = $entityType;
$this->initEntityType();
}
/**
* @internal
*/
protected function initEntityType(): void
{}
/**
* @return RDBRepository<TEntity>
*/
@@ -240,8 +250,7 @@ class Service implements Crud,
public function getEntity(string $id): ?Entity
{
try {
$builder = $this->selectBuilderFactory
->create()
$builder = $this->selectBuilderFactory->create()
->from($this->entityType)
->withSearchParams(
SearchParams::create()
@@ -887,9 +896,7 @@ class Service implements Crud,
$preparedSearchParams = $this->prepareSearchParams($searchParams);
$selectBuilder = $this->selectBuilderFactory->create();
$query = $selectBuilder
$query = $this->selectBuilderFactory->create()
->from($this->entityType)
->withStrictAccessControl()
->withSearchParams($preparedSearchParams)
@@ -29,18 +29,27 @@
namespace Espo\Core\Select;
use Espo\Core\Binding\BindingContainerBuilder;
use Espo\Core\InjectableFactory;
use Espo\Entities\User;
/**
* Creates instances of Select Builder.
*/
class SelectBuilderFactory
{
public function __construct(private InjectableFactory $injectableFactory)
{}
public function __construct(
private InjectableFactory $injectableFactory,
private User $user,
) {}
public function create(): SelectBuilder
{
return $this->injectableFactory->create(SelectBuilder::class);
return $this->injectableFactory->createWithBinding(
SelectBuilder::class,
BindingContainerBuilder::create()
->bindInstance(User::class, $this->user)
->build()
);
}
}
@@ -26,9 +26,6 @@
"number": {
"loaderClassName": "Espo\\Core\\Loaders\\NumberUtil"
},
"selectBuilderFactory": {
"className": "Espo\\Core\\Select\\SelectBuilderFactory"
},
"selectManagerFactory": {
"className": "Espo\\Core\\Select\\SelectManagerFactory"
},
+18 -14
View File
@@ -29,6 +29,7 @@
namespace Espo\Services;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\ORM\Entity;
use Espo\Core\Record\Service as RecordService;
use Espo\Core\Utils\Util;
@@ -41,21 +42,24 @@ use Espo\Core\Utils\Util;
*/
class Record extends RecordService
{
public function __construct(string $entityType = '')
/**
* @internal
*/
protected function initEntityType(): void
{
parent::__construct($entityType);
if (!$this->entityType) {
// Detecting the entity type by the class-name.
$name = get_class($this);
$matches = null;
if (preg_match('@\\\\([\w]+)$@', $name, $matches)) {
$name = $matches[1];
}
$this->entityType = Util::normalizeScopeName($name);
if ($this->entityType) {
return;
}
// Detecting the entity type by the class-name.
$name = get_class($this);
$matches = null;
if (preg_match('@\\\\([\w]+)$@', $name, $matches)) {
$name = $matches[1];
}
$this->entityType = Util::normalizeScopeName($name);
}
}