From 6a33ffc0fa94b3c626292bad4d50489651ab0027 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Sat, 16 Aug 2025 18:22:57 +0300 Subject: [PATCH] drop select builder factory service --- application/Espo/Binding.php | 5 --- .../Core/Di/SelectBuilderFactoryAware.php | 37 --------------- .../Core/Di/SelectBuilderFactorySetter.php | 45 ------------------- .../EntityGroup/CountRelatedType.php | 13 ++++-- .../Functions/EntityGroup/SumRelatedType.php | 13 ++++-- .../Functions/RecordGroup/CountType.php | 13 ++++-- .../Functions/RecordGroup/ExistsType.php | 13 ++++-- .../Functions/RecordGroup/FindOneType.php | 10 +++-- .../RecordGroup/FindRelatedManyType.php | 13 ++++-- .../RecordGroup/FindRelatedOneType.php | 15 +++++-- application/Espo/Core/Record/Service.php | 25 +++++++---- .../Espo/Core/Select/SelectBuilderFactory.php | 15 +++++-- .../metadata/app/containerServices.json | 3 -- application/Espo/Services/Record.php | 32 +++++++------ 14 files changed, 113 insertions(+), 139 deletions(-) delete mode 100644 application/Espo/Core/Di/SelectBuilderFactoryAware.php delete mode 100644 application/Espo/Core/Di/SelectBuilderFactorySetter.php diff --git a/application/Espo/Binding.php b/application/Espo/Binding.php index f1ffcf18c6..3403b46aec 100644 --- a/application/Espo/Binding.php +++ b/application/Espo/Binding.php @@ -133,11 +133,6 @@ class Binding implements BindingProcessor 'authTokenManager' ); - $binder->bindService( - 'Espo\\Core\\Select\\SelectBuilderFactory', - 'selectBuilderFactory' - ); - $binder->bindService( 'Espo\\Core\\ServiceFactory', 'serviceFactory' diff --git a/application/Espo/Core/Di/SelectBuilderFactoryAware.php b/application/Espo/Core/Di/SelectBuilderFactoryAware.php deleted file mode 100644 index 519913c534..0000000000 --- a/application/Espo/Core/Di/SelectBuilderFactoryAware.php +++ /dev/null @@ -1,37 +0,0 @@ -. - * - * 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; -} diff --git a/application/Espo/Core/Di/SelectBuilderFactorySetter.php b/application/Espo/Core/Di/SelectBuilderFactorySetter.php deleted file mode 100644 index 27af3376f4..0000000000 --- a/application/Espo/Core/Di/SelectBuilderFactorySetter.php +++ /dev/null @@ -1,45 +0,0 @@ -. - * - * 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; - } -} diff --git a/application/Espo/Core/Formula/Functions/EntityGroup/CountRelatedType.php b/application/Espo/Core/Formula/Functions/EntityGroup/CountRelatedType.php index ffd5350004..681881df7d 100644 --- a/application/Espo/Core/Formula/Functions/EntityGroup/CountRelatedType.php +++ b/application/Espo/Core/Formula/Functions/EntityGroup/CountRelatedType.php @@ -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) { diff --git a/application/Espo/Core/Formula/Functions/EntityGroup/SumRelatedType.php b/application/Espo/Core/Formula/Functions/EntityGroup/SumRelatedType.php index 551d149b6d..d4dfe9eaf7 100644 --- a/application/Espo/Core/Formula/Functions/EntityGroup/SumRelatedType.php +++ b/application/Espo/Core/Formula/Functions/EntityGroup/SumRelatedType.php @@ -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) { diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/CountType.php b/application/Espo/Core/Formula/Functions/RecordGroup/CountType.php index 7969a577e1..76323d15d9 100644 --- a/application/Espo/Core/Formula/Functions/RecordGroup/CountType.php +++ b/application/Espo/Core/Formula/Functions/RecordGroup/CountType.php @@ -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); diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/ExistsType.php b/application/Espo/Core/Formula/Functions/RecordGroup/ExistsType.php index 779c51b8c0..4d81025e44 100644 --- a/application/Espo/Core/Formula/Functions/RecordGroup/ExistsType.php +++ b/application/Espo/Core/Formula/Functions/RecordGroup/ExistsType.php @@ -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); diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php b/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php index 3325dd14c2..f436e044f6 100644 --- a/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php +++ b/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php @@ -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 = []; diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedManyType.php b/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedManyType.php index 972bfe5fd0..ead02688fe 100644 --- a/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedManyType.php +++ b/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedManyType.php @@ -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 = []; diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedOneType.php b/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedOneType.php index 9962cd0491..292ce3e835 100644 --- a/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedOneType.php +++ b/application/Espo/Core/Formula/Functions/RecordGroup/FindRelatedOneType.php @@ -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 = []; diff --git a/application/Espo/Core/Record/Service.php b/application/Espo/Core/Record/Service.php index 905a160354..e6987cfe0b 100644 --- a/application/Espo/Core/Record/Service.php +++ b/application/Espo/Core/Record/Service.php @@ -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 */ @@ -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) diff --git a/application/Espo/Core/Select/SelectBuilderFactory.php b/application/Espo/Core/Select/SelectBuilderFactory.php index 13bbae4ce6..adef974a3f 100644 --- a/application/Espo/Core/Select/SelectBuilderFactory.php +++ b/application/Espo/Core/Select/SelectBuilderFactory.php @@ -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() + ); } } diff --git a/application/Espo/Resources/metadata/app/containerServices.json b/application/Espo/Resources/metadata/app/containerServices.json index 6a025d282e..3b3715713e 100644 --- a/application/Espo/Resources/metadata/app/containerServices.json +++ b/application/Espo/Resources/metadata/app/containerServices.json @@ -26,9 +26,6 @@ "number": { "loaderClassName": "Espo\\Core\\Loaders\\NumberUtil" }, - "selectBuilderFactory": { - "className": "Espo\\Core\\Select\\SelectBuilderFactory" - }, "selectManagerFactory": { "className": "Espo\\Core\\Select\\SelectManagerFactory" }, diff --git a/application/Espo/Services/Record.php b/application/Espo/Services/Record.php index d9e5500123..df81f85e40 100644 --- a/application/Espo/Services/Record.php +++ b/application/Espo/Services/Record.php @@ -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); } }