From b00dfb6135345a130261c13177db8db872909aab Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 15 Apr 2021 18:13:03 +0300 Subject: [PATCH] select use binding --- .../Espo/Core/Select/Where/Converter.php | 12 +- .../Core/Select/Where/ConverterFactory.php | 101 +++++++++++--- .../Espo/Core/Select/Where/ItemConverter.php | 2 +- .../Select/Where/ItemConverterFactory.php | 49 +++++-- .../Select/Where/ItemGeneralConverter.php | 131 ++++++++++-------- .../Meeting/Where/DateTimeItemTransformer.php | 2 +- .../Select/Where/ConverterFactoryTest.php | 73 +++++++--- .../Select/Where/ItemConverterFactoryTest.php | 45 ++++-- 8 files changed, 287 insertions(+), 128 deletions(-) diff --git a/application/Espo/Core/Select/Where/Converter.php b/application/Espo/Core/Select/Where/Converter.php index 44e767b72e..d4b0b00e82 100644 --- a/application/Espo/Core/Select/Where/Converter.php +++ b/application/Espo/Core/Select/Where/Converter.php @@ -59,7 +59,7 @@ class Converter public function __construct( string $entityType, User $user, - ItemGeneralConverter $itemConverter, + ItemConverter $itemConverter, Scanner $scanner, RandomStringGenerator $randomStringGenerator, ORMDefs $ormDefs @@ -72,7 +72,7 @@ class Converter $this->ormDefs = $ormDefs; } - public function convert(QueryBuilder $queryBuilder, Item $item) : WhereClause + public function convert(QueryBuilder $queryBuilder, Item $item): WhereClause { $whereClause = []; @@ -93,7 +93,7 @@ class Converter return WhereClause::fromRaw($whereClause); } - protected function itemToList(Item $item) : array + protected function itemToList(Item $item): array { if ($item->getType() !== 'and') { return [ @@ -110,7 +110,7 @@ class Converter return $list; } - protected function processItem(QueryBuilder $queryBuilder, Item $item) : ?array + protected function processItem(QueryBuilder $queryBuilder, Item $item): ?array { $type = $item->getType(); $attribute = $item->getAttribute(); @@ -135,7 +135,7 @@ class Converter return $this->itemConverter->convert($queryBuilder, $item)->getRaw(); } - protected function applyInCategory(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function applyInCategory(QueryBuilder $queryBuilder, string $attribute, $value): array { $link = $attribute; @@ -196,7 +196,7 @@ class Converter throw new Error("Not supported link '{$link}' in where item."); } - protected function applyIsUserFromTeams(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function applyIsUserFromTeams(QueryBuilder $queryBuilder, string $attribute, $value): array { $link = $attribute; diff --git a/application/Espo/Core/Select/Where/ConverterFactory.php b/application/Espo/Core/Select/Where/ConverterFactory.php index 08fe90de1a..5720347754 100644 --- a/application/Espo/Core/Select/Where/ConverterFactory.php +++ b/application/Espo/Core/Select/Where/ConverterFactory.php @@ -32,6 +32,9 @@ namespace Espo\Core\Select\Where; use Espo\Core\{ Utils\Metadata, InjectableFactory, + Binding\BindingContainer, + Binding\Binder, + Binding\BindingData, }; use Espo\{ @@ -50,33 +53,86 @@ class ConverterFactory $this->metadata = $metadata; } - public function create(string $entityType, User $user) : Converter + public function create(string $entityType, User $user): Converter { - $dateTimeItemTransformerClassName = $this->getDateTimeItemTransformerClassName($entityType); + $dateTimeItemTransformer = $this->createDateTimeItemTranformer($entityType, $user); - $dateTimeItemTransformer = $this->injectableFactory->createWith($dateTimeItemTransformerClassName, [ - 'entityType' => $entityType, - 'user' => $user, - ]); + $itemConverter = $this->createItemConverter($entityType, $user, $dateTimeItemTransformer); - $itemConverterClassName = $this->getItemConverterClassName($entityType); + $className = $this->getConverterClassName($entityType); - $itemConverter = $this->injectableFactory->createWith($itemConverterClassName, [ - 'entityType' => $entityType, - 'user' => $user, - 'dateTimeItemTransformer' => $dateTimeItemTransformer, - ]); + $bindingData = new BindingData(); - $converterClassName = $this->getConverterClassName($entityType); + $binder = new Binder($bindingData); - return $this->injectableFactory->createWith($converterClassName, [ - 'entityType' => $entityType, - 'user' => $user, - 'itemConverter' => $itemConverter, - ]); + $binder + ->bindInstance(User::class, $user); + + $binder + ->for($className) + ->bindValue('$entityType', $entityType) + ->bindInstance(ItemConverter::class, $itemConverter); + + $bindingContainer = new BindingContainer($bindingData); + + return $this->injectableFactory->createWithBinding($className, $bindingContainer); } - private function getConverterClassName(string $entityType) : string + private function createDateTimeItemTranformer(string $entityType, User $user): DateTimeItemTransformer + { + $className = $this->getDateTimeItemTransformerClassName($entityType); + + $bindingData = new BindingData(); + + $binder = new Binder($bindingData); + + $binder + ->bindInstance(User::class, $user); + + $binder + ->for($className) + ->bindValue('$entityType', $entityType); + + $binder + ->for(DateTimeItemTransformer::class) + ->bindValue('$entityType', $entityType); + + $bindingContainer = new BindingContainer($bindingData); + + return $this->injectableFactory->createWithBinding($className, $bindingContainer); + } + + private function createItemConverter( + string $entityType, + User $user, + DateTimeItemTransformer $dateTimeItemTransformer + ): ItemConverter { + + $className = $this->getItemConverterClassName($entityType); + + $bindingData = new BindingData(); + + $binder = new Binder($bindingData); + + $binder + ->bindInstance(User::class, $user); + + $binder + ->for($className) + ->bindValue('$entityType', $entityType) + ->bindInstance(DateTimeItemTransformer::class, $dateTimeItemTransformer); + + $binder + ->for(ItemGeneralConverter::class) + ->bindValue('$entityType', $entityType) + ->bindInstance(DateTimeItemTransformer::class, $dateTimeItemTransformer); + + $bindingContainer = new BindingContainer($bindingData); + + return $this->injectableFactory->createWithBinding($className, $bindingContainer); + } + + private function getConverterClassName(string $entityType): string { $className = $this->metadata->get(['selectDefs', $entityType, 'whereConverterClassName']); @@ -87,7 +143,7 @@ class ConverterFactory return Converter::class; } - private function getItemConverterClassName(string $entityType) : string + private function getItemConverterClassName(string $entityType): string { $className = $this->metadata->get(['selectDefs', $entityType, 'whereItemConverterClassName']); @@ -98,9 +154,10 @@ class ConverterFactory return ItemGeneralConverter::class; } - private function getDateTimeItemTransformerClassName(string $entityType) : string + private function getDateTimeItemTransformerClassName(string $entityType): string { - $className = $this->metadata->get(['selectDefs', $entityType, 'whereDateTimeItemTransformerClassName']); + $className = $this->metadata + ->get(['selectDefs', $entityType, 'whereDateTimeItemTransformerClassName']); if ($className) { return $className; diff --git a/application/Espo/Core/Select/Where/ItemConverter.php b/application/Espo/Core/Select/Where/ItemConverter.php index b85c479803..1021561c0b 100644 --- a/application/Espo/Core/Select/Where/ItemConverter.php +++ b/application/Espo/Core/Select/Where/ItemConverter.php @@ -39,5 +39,5 @@ use Espo\{ */ interface ItemConverter { - public function convert(QueryBuilder $queryBuilder, Item $item) : WhereClauseItem; + public function convert(QueryBuilder $queryBuilder, Item $item): WhereClauseItem; } diff --git a/application/Espo/Core/Select/Where/ItemConverterFactory.php b/application/Espo/Core/Select/Where/ItemConverterFactory.php index f55e677299..b50cbc95c7 100644 --- a/application/Espo/Core/Select/Where/ItemConverterFactory.php +++ b/application/Espo/Core/Select/Where/ItemConverterFactory.php @@ -33,6 +33,9 @@ use Espo\Core\{ Exceptions\Error, InjectableFactory, Utils\Metadata, + Binding\BindingContainer, + Binding\Binder, + Binding\BindingData, }; use Espo\{ @@ -56,7 +59,7 @@ class ItemConverterFactory return (bool) $this->getClassNameForType($type); } - public function createForType(string $type, string $entityType, User $user) : ItemConverter + public function createForType(string $type, string $entityType, User $user): ItemConverter { $className = $this->getClassNameForType($type); @@ -64,25 +67,35 @@ class ItemConverterFactory throw new Error("Where item converter class name is not defined."); } - return $this->injectableFactory->createWith($className, [ - 'entityType' => $entityType, - 'user' => $user, - ]); + $bindingData = new BindingData(); + + $binder = new Binder($bindingData); + + $binder + ->bindInstance(User::class, $user); + + $binder + ->for($className) + ->bindValue('$entityType', $entityType); + + $bindingContainer = new BindingContainer($bindingData); + + return $this->injectableFactory->createWithBinding($className, $bindingContainer); } - protected function getClassNameForType(string $type) : ?string + protected function getClassNameForType(string $type): ?string { return $this->metadata->get([ 'app', 'select', 'whereItemConverterClassNameMap', $type ]); } - public function has(string $entityType, string $attribute, string $type) : bool + public function has(string $entityType, string $attribute, string $type): bool { return (bool) $this->getClassName($entityType, $attribute, $type); } - public function create(string $entityType, string $attribute, string $type, User $user) : ItemConverter + public function create(string $entityType, string $attribute, string $type, User $user): ItemConverter { $className = $this->getClassName($entityType, $attribute, $type); @@ -90,13 +103,23 @@ class ItemConverterFactory throw new Error("Where item converter class name is not defined."); } - return $this->injectableFactory->createWith($className, [ - 'entityType' => $entityType, - 'user' => $user, - ]); + $bindingData = new BindingData(); + + $binder = new Binder($bindingData); + + $binder + ->bindInstance(User::class, $user); + + $binder + ->for($className) + ->bindValue('$entityType', $entityType); + + $bindingContainer = new BindingContainer($bindingData); + + return $this->injectableFactory->createWithBinding($className, $bindingContainer); } - protected function getClassName(string $entityType, string $attribute, string $type) : ?string + protected function getClassName(string $entityType, string $attribute, string $type): ?string { return $this->metadata->get([ 'selectDefs', $entityType, 'whereItemConverterClassNameMap', $attribute . '_' . $type diff --git a/application/Espo/Core/Select/Where/ItemGeneralConverter.php b/application/Espo/Core/Select/Where/ItemGeneralConverter.php index 682a9c4553..b35b017719 100644 --- a/application/Espo/Core/Select/Where/ItemGeneralConverter.php +++ b/application/Espo/Core/Select/Where/ItemGeneralConverter.php @@ -48,7 +48,7 @@ use DateInterval; /** * Converts a where item to a where clause (for ORM). */ -class ItemGeneralConverter +class ItemGeneralConverter implements ItemConverter { protected $entityType; @@ -90,7 +90,7 @@ class ItemGeneralConverter $this->config = $config; } - public function convert(QueryBuilder $queryBuilder, Item $item) : WhereClauseItem + public function convert(QueryBuilder $queryBuilder, Item $item): WhereClauseItem { $type = $item->getType(); $value = $item->getValue(); @@ -187,8 +187,12 @@ class ItemGeneralConverter } protected function groupProcessAndOr( - QueryBuilder $queryBuilder, string $type, ?string $attribute, $value - ) : array { + QueryBuilder $queryBuilder, + string $type, + ?string $attribute, + $value + ): array { + if (!is_array($value)) { throw new Error("Bad where item."); } @@ -213,8 +217,12 @@ class ItemGeneralConverter } protected function groupProcessSubQuery( - QueryBuilder $queryBuilder, string $type, ?string $attribute, $value - ) : array { + QueryBuilder $queryBuilder, + string $type, + ?string $attribute, + $value + ): array { + if (!is_array($value)) { throw new Error("Bad where item."); } @@ -249,8 +257,12 @@ class ItemGeneralConverter } protected function groupProcessColumn( - QueryBuilder $queryBuilder, string $type, string $attribute, $value - ) : array { + QueryBuilder $queryBuilder, + string $type, + string $attribute, + $value + ): array { + $link = $this->metadata->get(['entityDefs', $this->entityType, 'fields', $attribute, 'link']); $column = $this->metadata->get(['entityDefs', $this->entityType, 'fields', $attribute, 'column']); @@ -309,8 +321,11 @@ class ItemGeneralConverter } protected function groupProcessArray( - QueryBuilder $queryBuilder, string $type, string $attribute, $value - ) : array { + QueryBuilder $queryBuilder, + string $type, + string $attribute, + $value + ): array { $arrayValueAlias = 'arrayFilter' . $this->randomStringGenerator->generate(); @@ -469,7 +484,7 @@ class ItemGeneralConverter /** * A complex expression w/o a value. */ - protected function processExpression(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processExpression(QueryBuilder $queryBuilder, string $attribute, $value): array { $key = $attribute; @@ -482,111 +497,111 @@ class ItemGeneralConverter ]; } - protected function processLike(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLike(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '*' => $value, ]; } - protected function processNotLike(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNotLike(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '!*' => $value, ]; } - protected function processEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processEquals(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '=' => $value, ]; } - protected function processOn(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processOn(QueryBuilder $queryBuilder, string $attribute, $value): array { return $this->processEquals($queryBuilder, $attribute, $value); } - protected function processNotEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNotEquals(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '!=' => $value, ]; } - protected function processNotOn(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNotOn(QueryBuilder $queryBuilder, string $attribute, $value): array { return $this->processNotEquals($queryBuilder, $attribute, $value); } - protected function processStartsWith(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processStartsWith(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '*' => $value . '%', ]; } - protected function processEndsWith(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processEndsWith(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '*' => '%' . $value, ]; } - protected function processContains(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processContains(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '*' => '%' . $value . '%', ]; } - protected function processNotContains(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNotContains(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '!*' => '%' . $value . '%', ]; } - protected function processGreaterThan(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processGreaterThan(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '>' => $value, ]; } - protected function processAfter(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processAfter(QueryBuilder $queryBuilder, string $attribute, $value): array { return $this->processGreaterThan($queryBuilder, $attribute, $value); } - protected function processLessThan(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLessThan(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '<' => $value, ]; } - protected function processBefore(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processBefore(QueryBuilder $queryBuilder, string $attribute, $value): array { return $this->processLessThan($queryBuilder, $attribute, $value); } - protected function processGreaterThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processGreaterThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '>=' => $value, ]; } - protected function processLessThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLessThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '<=' => $value, ]; } - protected function processIn(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processIn(QueryBuilder $queryBuilder, string $attribute, $value): array { if (!is_array($value)) { throw new Error("Bad where item 'in'."); @@ -597,7 +612,7 @@ class ItemGeneralConverter ]; } - protected function processNotIn(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNotIn(QueryBuilder $queryBuilder, string $attribute, $value): array { if (!is_array($value)) { throw new Error("Bad where item 'notIn'."); @@ -608,7 +623,7 @@ class ItemGeneralConverter ]; } - protected function processBetween(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processBetween(QueryBuilder $queryBuilder, string $attribute, $value): array { if (!is_array($value) || count($value) < 2) { throw new Error("Bad where item 'between'."); @@ -622,61 +637,61 @@ class ItemGeneralConverter ]; } - protected function processIsNull(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processIsNull(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '=' => null, ]; } - protected function processIsNotNull(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processIsNotNull(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '!=' => null, ]; } - protected function processEver(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processEver(QueryBuilder $queryBuilder, string $attribute, $value): array { return $this->processIsNotNull($queryBuilder, $attribute, $value); } - protected function processIsTrue(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processIsTrue(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '=' => true, ]; } - protected function processIsFalse(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processIsFalse(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '=' => false, ]; } - protected function processToday(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processToday(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '=' => date('Y-m-d'), ]; } - protected function processPast(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processPast(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '<' => date('Y-m-d'), ]; } - protected function processFuture(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processFuture(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ $attribute . '>' => date('Y-m-d'), ]; } - protected function processLastSevenDays(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLastSevenDays(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt1 = new DateTime(); @@ -692,7 +707,7 @@ class ItemGeneralConverter ]; } - protected function processLastXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLastXDays(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt1 = new DateTime(); @@ -710,7 +725,7 @@ class ItemGeneralConverter ]; } - protected function processNextXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNextXDays(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt1 = new DateTime(); @@ -728,7 +743,7 @@ class ItemGeneralConverter ]; } - protected function processOlderThanXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processOlderThanXDays(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -741,7 +756,7 @@ class ItemGeneralConverter ]; } - protected function processAfterXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processAfterXDays(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -754,7 +769,7 @@ class ItemGeneralConverter ]; } - protected function processCurrentMonth(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processCurrentMonth(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -766,7 +781,7 @@ class ItemGeneralConverter ]; } - protected function processLastMonth(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLastMonth(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -778,7 +793,7 @@ class ItemGeneralConverter ]; } - protected function processNextMonth(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNextMonth(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -790,7 +805,7 @@ class ItemGeneralConverter ]; } - protected function processCurrentQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processCurrentQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -806,7 +821,7 @@ class ItemGeneralConverter ]; } - protected function processLastQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLastQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -829,7 +844,7 @@ class ItemGeneralConverter ]; } - protected function processCurrentYear(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processCurrentYear(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -841,7 +856,7 @@ class ItemGeneralConverter ]; } - protected function processLastYear(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLastYear(QueryBuilder $queryBuilder, string $attribute, $value): array { $dt = new DateTime(); @@ -853,7 +868,7 @@ class ItemGeneralConverter ]; } - protected function processCurrentFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processCurrentFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value): array { $dtToday = new DateTime(); $dt = new DateTime(); @@ -874,7 +889,7 @@ class ItemGeneralConverter ]; } - protected function processLastFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLastFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value): array { $dtToday = new DateTime(); $dt = new DateTime(); @@ -897,7 +912,7 @@ class ItemGeneralConverter ]; } - protected function processCurrentFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processCurrentFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array { $dtToday = new DateTime(); $dt = new DateTime(); @@ -927,7 +942,7 @@ class ItemGeneralConverter ]; } - protected function processLastFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLastFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array { $dtToday = new DateTime(); $dt = new DateTime(); @@ -959,7 +974,7 @@ class ItemGeneralConverter ]; } - protected function processIsNotLinked(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processIsNotLinked(QueryBuilder $queryBuilder, string $attribute, $value): array { return [ 'id!=s' => [ @@ -970,7 +985,7 @@ class ItemGeneralConverter ]; } - protected function processIsLinked(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processIsLinked(QueryBuilder $queryBuilder, string $attribute, $value): array { $link = $attribute; @@ -985,7 +1000,7 @@ class ItemGeneralConverter ]; } - protected function processLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value): array { $link = $attribute; @@ -1047,7 +1062,7 @@ class ItemGeneralConverter throw new Error("Bad where item. Not supported relation type."); } - protected function processNotLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value) : array + protected function processNotLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value): array { $link = $attribute; diff --git a/application/Espo/Modules/Crm/Classes/Select/Meeting/Where/DateTimeItemTransformer.php b/application/Espo/Modules/Crm/Classes/Select/Meeting/Where/DateTimeItemTransformer.php index 0de8c77d25..78efff0a22 100644 --- a/application/Espo/Modules/Crm/Classes/Select/Meeting/Where/DateTimeItemTransformer.php +++ b/application/Espo/Modules/Crm/Classes/Select/Meeting/Where/DateTimeItemTransformer.php @@ -39,7 +39,7 @@ use Espo\Core\{ */ class DateTimeItemTransformer extends DateTimeItemTransformerOriginal { - public function transform(Item $item) : Item + public function transform(Item $item): Item { $type = $item->getType(); $value = $item->getValue(); diff --git a/tests/unit/Espo/Core/Select/Where/ConverterFactoryTest.php b/tests/unit/Espo/Core/Select/Where/ConverterFactoryTest.php index 8fc0330e78..e63c292dc3 100644 --- a/tests/unit/Espo/Core/Select/Where/ConverterFactoryTest.php +++ b/tests/unit/Espo/Core/Select/Where/ConverterFactoryTest.php @@ -34,8 +34,12 @@ use Espo\Core\{ Select\Where\Converter, Select\Where\DateTimeItemTransformer, Select\Where\ItemGeneralConverter, + Select\Where\ItemConverter, Utils\Metadata, InjectableFactory, + Binding\BindingContainer, + Binding\Binder, + Binding\BindingData, }; use Espo\{ @@ -44,7 +48,7 @@ use Espo\{ class ConverterFactoryTest extends \PHPUnit\Framework\TestCase { - protected function setUp() : void + protected function setUp(): void { $this->injectableFactory = $this->createMock(InjectableFactory::class); $this->metadata = $this->createMock(Metadata::class); @@ -88,32 +92,69 @@ class ConverterFactoryTest extends \PHPUnit\Framework\TestCase $object = $this->createMock(Converter::class); + $bindingData1 = new BindingData(); + + $binder1 = new Binder($bindingData1); + + $binder1 + ->bindInstance(User::class, $this->user); + + $binder1 + ->for($className1) + ->bindValue('$entityType', $entityType); + + $binder1 + ->for(DateTimeItemTransformer::class) + ->bindValue('$entityType', $entityType); + + $bindingContainer1 = new BindingContainer($bindingData1); + + $bindingData2 = new BindingData(); + + $binder2 = new Binder($bindingData2); + + $binder2 + ->bindInstance(User::class, $this->user); + + $binder2 + ->for($className2) + ->bindValue('$entityType', $entityType) + ->bindInstance(DateTimeItemTransformer::class, $this->dateTimeItemTransformer); + + $binder2 + ->for(ItemGeneralConverter::class) + ->bindValue('$entityType', $entityType) + ->bindInstance(DateTimeItemTransformer::class, $this->dateTimeItemTransformer); + + $bindingContainer2 = new BindingContainer($bindingData2); + + $bindingData3 = new BindingData(); + + $binder3 = new Binder($bindingData3); + + $binder3 + ->bindInstance(User::class, $this->user) + ->for($className3) + ->bindValue('$entityType', $entityType) + ->bindInstance(ItemConverter::class, $this->itemConverter); + + $bindingContainer = new BindingContainer($bindingData3); + $this->injectableFactory ->expects($this->exactly(3)) - ->method('createWith') + ->method('createWithBinding') ->withConsecutive( [ $className1, - [ - 'entityType' => $entityType, - 'user' => $this->user, - ] + $bindingContainer1, ], [ $className2, - [ - 'entityType' => $entityType, - 'user' => $this->user, - 'dateTimeItemTransformer' => $this->dateTimeItemTransformer, - ] + $bindingContainer2, ], [ $className3, - [ - 'entityType' => $entityType, - 'user' => $this->user, - 'itemConverter' => $this->itemConverter, - ] + $bindingContainer, ] ) ->willReturnOnConsecutiveCalls( diff --git a/tests/unit/Espo/Core/Select/Where/ItemConverterFactoryTest.php b/tests/unit/Espo/Core/Select/Where/ItemConverterFactoryTest.php index 0339fdc668..7061c4a44a 100644 --- a/tests/unit/Espo/Core/Select/Where/ItemConverterFactoryTest.php +++ b/tests/unit/Espo/Core/Select/Where/ItemConverterFactoryTest.php @@ -33,6 +33,9 @@ use Espo\Core\{ Select\Where\ItemConverterFactory, Utils\Metadata, InjectableFactory, + Binding\BindingContainer, + Binding\Binder, + Binding\BindingData, }; use Espo\{ @@ -45,7 +48,7 @@ class ItemConverterFactoryTest extends \PHPUnit\Framework\TestCase { private $metadata; - protected function setUp() : void + protected function setUp(): void { $this->injectableFactory = $this->createMock(InjectableFactory::class); $this->metadata = $this->createMock(Metadata::class); @@ -108,15 +111,25 @@ class ItemConverterFactoryTest extends \PHPUnit\Framework\TestCase $object = $this->createMock($className); + $bindingData = new BindingData(); + + $binder = new Binder($bindingData); + + $binder + ->bindInstance(User::class, $this->user); + + $binder + ->for($className) + ->bindValue('$entityType', $entityType); + + $bindingContainer = new BindingContainer($bindingData); + $this->injectableFactory ->expects($this->once()) - ->method('createWith') + ->method('createWithBinding') ->with( $className, - [ - 'entityType' => $entityType, - 'user' => $this->user, - ] + $bindingContainer ) ->willReturn($object); @@ -159,15 +172,25 @@ class ItemConverterFactoryTest extends \PHPUnit\Framework\TestCase $object = $this->createMock($className); + $bindingData = new BindingData(); + + $binder = new Binder($bindingData); + + $binder + ->bindInstance(User::class, $this->user); + + $binder + ->for($className) + ->bindValue('$entityType', $entityType); + + $bindingContainer = new BindingContainer($bindingData); + $this->injectableFactory ->expects($this->once()) - ->method('createWith') + ->method('createWithBinding') ->with( $className, - [ - 'entityType' => $entityType, - 'user' => $this->user, - ] + $bindingContainer ) ->willReturn($object);