From eea3efeb95a9fcbca999093711b36b789b433dc1 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 22 Mar 2022 14:06:21 +0200 Subject: [PATCH] type fixes --- .../Filters/PortalOnlyAccount.php | 2 +- .../Core/Select/Applier/Appliers/Order.php | 4 +- .../Espo/Core/Select/Helpers/FieldHelper.php | 2 +- application/Espo/Core/Select/SearchParams.php | 2 +- .../Espo/Core/Select/SelectBuilder.php | 37 ++++++++++++++++++ .../Core/Select/Text/FullTextSearchData.php | 38 +++++++++++++------ .../Text/FullTextSearchDataComposer.php | 2 +- .../Espo/Core/Select/Where/Checker.php | 2 +- application/Espo/Core/Select/Where/Item.php | 24 +++++++----- .../Espo/Core/Select/Where/Scanner.php | 2 +- .../Espo/Core/Select/Where/CheckerTest.php | 4 +- .../Espo/Core/Select/Where/ScannerTest.php | 4 +- 12 files changed, 88 insertions(+), 35 deletions(-) diff --git a/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyAccount.php b/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyAccount.php index 8c4053c65d..7c118e17fd 100644 --- a/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyAccount.php +++ b/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyAccount.php @@ -52,7 +52,7 @@ class PortalOnlyAccount implements Filter { $orGroup = []; - $accountIdList = $this->user->getLinkMultipleIdList('accounts'); + $accountIdList = $this->user->getLinkMultipleIdList('accounts') ?? []; $contactId = $this->user->get('contactId'); if (count($accountIdList)) { diff --git a/application/Espo/Core/Select/Applier/Appliers/Order.php b/application/Espo/Core/Select/Applier/Appliers/Order.php index 6157d7313e..75dd30137b 100644 --- a/application/Espo/Core/Select/Applier/Appliers/Order.php +++ b/application/Espo/Core/Select/Applier/Appliers/Order.php @@ -110,10 +110,10 @@ class Order if (!$order) { $order = $this->metadataProvider->getDefaultOrder($this->entityType); - if (strtolower($order) === 'desc') { + if ($order && strtolower($order) === 'desc') { $order = SearchParams::ORDER_DESC; } - else if (strtolower($order) === 'asc') { + else if ($order && strtolower($order) === 'asc') { $order = SearchParams::ORDER_ASC; } else if ($order !== null) { diff --git a/application/Espo/Core/Select/Helpers/FieldHelper.php b/application/Espo/Core/Select/Helpers/FieldHelper.php index 2b3cf161f4..1a215803df 100644 --- a/application/Espo/Core/Select/Helpers/FieldHelper.php +++ b/application/Espo/Core/Select/Helpers/FieldHelper.php @@ -52,7 +52,7 @@ class FieldHelper private function getSeed(): Entity { - return $this->seed ?? $this->entityManager->getEntity($this->entityType); + return $this->seed ?? $this->entityManager->getNewEntity($this->entityType); } public function hasAssignedUsersField(): bool diff --git a/application/Espo/Core/Select/SearchParams.php b/application/Espo/Core/Select/SearchParams.php index c4688ce9b4..c389b73bc3 100644 --- a/application/Espo/Core/Select/SearchParams.php +++ b/application/Espo/Core/Select/SearchParams.php @@ -216,7 +216,7 @@ class SearchParams return $obj; } - public function withWhere(?WhereItem $where): self + public function withWhere(WhereItem $where): self { $obj = clone $this; diff --git a/application/Espo/Core/Select/SelectBuilder.php b/application/Espo/Core/Select/SelectBuilder.php index aecaecc327..97aa0eb1e9 100644 --- a/application/Espo/Core/Select/SelectBuilder.php +++ b/application/Espo/Core/Select/SelectBuilder.php @@ -186,6 +186,7 @@ class SelectBuilder $this->applyAdditional(); + /** @var QueryBuilder */ return $this->queryBuilder; } @@ -348,6 +349,9 @@ class SelectBuilder private function applyPrimaryFilter(): void { + assert($this->queryBuilder !== null); + assert($this->primaryFilter !== null); + $this->createPrimaryFilterApplier() ->apply( $this->queryBuilder, @@ -357,6 +361,8 @@ class SelectBuilder private function applyBoolFilterList(): void { + assert($this->queryBuilder !== null); + $this->createBoolFilterListApplier() ->apply( $this->queryBuilder, @@ -366,6 +372,9 @@ class SelectBuilder private function applyTextFilter(): void { + assert($this->queryBuilder !== null); + assert($this->textFilter !== null); + $noFullTextSearch = false; if ($this->searchParams && $this->searchParams->noFullTextSearch()) { @@ -384,6 +393,8 @@ class SelectBuilder private function applyAccessControlFilter(): void { + assert($this->queryBuilder !== null); + $this->createAccessControlFilterApplier() ->apply( $this->queryBuilder @@ -392,6 +403,8 @@ class SelectBuilder private function applyDefaultOrder(): void { + assert($this->queryBuilder !== null); + $order = null; if ($this->searchParams) { @@ -419,6 +432,8 @@ class SelectBuilder private function applyWhereItem(WhereItem $whereItem): void { + assert($this->queryBuilder !== null); + $params = WhereParams::fromArray([ 'applyPermissionCheck' => $this->applyWherePermissionCheck, 'forbidComplexExpressions' => $this->applyComplexExpressionsForbidden, @@ -438,6 +453,8 @@ class SelectBuilder return; } + assert($this->queryBuilder !== null); + if ( !$this->applyDefaultOrder && ($this->searchParams->getOrderBy() || $this->searchParams->getOrder()) @@ -483,6 +500,8 @@ class SelectBuilder private function applyAdditional(): void { + assert($this->queryBuilder !== null); + if (count($this->additionalApplierClassNameList) === 0) { return; } @@ -506,6 +525,8 @@ class SelectBuilder private function createWhereApplier(): WhereApplier { + assert($this->entityType !== null); + /** @var WhereApplier */ return $this->applierFactory->create( $this->entityType, @@ -516,6 +537,8 @@ class SelectBuilder private function createSelectApplier(): SelectApplier { + assert($this->entityType !== null); + /** @var SelectApplier */ return $this->applierFactory->create( $this->entityType, @@ -526,6 +549,8 @@ class SelectBuilder private function createOrderApplier(): OrderApplier { + assert($this->entityType !== null); + /** @var OrderApplier */ return $this->applierFactory->create( $this->entityType, @@ -536,6 +561,8 @@ class SelectBuilder private function createLimitApplier(): LimitApplier { + assert($this->entityType !== null); + /** @var LimitApplier */ return $this->applierFactory->create( $this->entityType, @@ -546,6 +573,8 @@ class SelectBuilder private function createAccessControlFilterApplier(): AccessControlFilterApplier { + assert($this->entityType !== null); + /** @var AccessControlFilterApplier */ return $this->applierFactory->create( $this->entityType, @@ -556,6 +585,8 @@ class SelectBuilder private function createTextFilterApplier(): TextFilterApplier { + assert($this->entityType !== null); + /** @var TextFilterApplier */ return $this->applierFactory->create( $this->entityType, @@ -566,6 +597,8 @@ class SelectBuilder private function createPrimaryFilterApplier(): PrimaryFilterApplier { + assert($this->entityType !== null); + /** @var PrimaryFilterApplier */ return $this->applierFactory->create( $this->entityType, @@ -576,6 +609,8 @@ class SelectBuilder private function createBoolFilterListApplier(): BoolFilterListApplier { + assert($this->entityType !== null); + /** @var BoolFilterListApplier */ return $this->applierFactory->create( $this->entityType, @@ -586,6 +621,8 @@ class SelectBuilder private function createAdditionalApplier(): AdditionalApplier { + assert($this->entityType !== null); + /** @var AdditionalApplier */ return $this->applierFactory->create( $this->entityType, diff --git a/application/Espo/Core/Select/Text/FullTextSearchData.php b/application/Espo/Core/Select/Text/FullTextSearchData.php index 209be89f5e..044ec35ebc 100644 --- a/application/Espo/Core/Select/Text/FullTextSearchData.php +++ b/application/Espo/Core/Select/Text/FullTextSearchData.php @@ -33,20 +33,28 @@ use InvalidArgumentException; class FullTextSearchData { - private ?string $expression = null; + private string $expression; /** - * @var ?string[] + * @var string[] */ - private ?array $fieldList = null; + private array $fieldList; /** - * @var ?string[] + * @var string[] */ - private ?array $columnList = null; + private array $columnList; - private function __construct() + /** + * @param string $expression + * @param string[] $fieldList + * @param string[] $columnList + */ + public function __construct(string $expression, array $fieldList, array $columnList) { + $this->expression = $expression; + $this->fieldList = $fieldList; + $this->columnList = $columnList; } /** @@ -54,9 +62,19 @@ class FullTextSearchData */ public static function fromArray(array $params): self { - $object = new self(); + $expression = $params['expression'] ?? null; - $object->expression = $params['expression'] ?? null; + if (!$expression || !is_string($expression)) { + throw new InvalidArgumentException("Bad expression."); + } + + $object = new self( + $expression, + $params['fieldList'] ?? [], + $params['columnList'] ?? [] + ); + + $object->expression = $expression; $object->fieldList = $params['fieldList'] ?? []; $object->columnList = $params['columnList'] ?? []; @@ -66,10 +84,6 @@ class FullTextSearchData } } - if (!$object->expression || !is_string($object->expression)) { - throw new InvalidArgumentException("Bad expression."); - } - return $object; } diff --git a/application/Espo/Core/Select/Text/FullTextSearchDataComposer.php b/application/Espo/Core/Select/Text/FullTextSearchDataComposer.php index b17847a43a..0278d9e11b 100644 --- a/application/Espo/Core/Select/Text/FullTextSearchDataComposer.php +++ b/application/Espo/Core/Select/Text/FullTextSearchDataComposer.php @@ -171,7 +171,7 @@ class FullTextSearchDataComposer $filter = trim($filter); } - $expression = $function . ':(' . implode(', ', $fullTextSearchColumnList) . ', ' . "'{$filter}'" . ')'; + $expression = $function . ':(' . implode(', ', $fullTextSearchColumnList ?? []) . ', ' . "'{$filter}'" . ')'; return FullTextSearchData::fromArray([ 'expression' => $expression, diff --git a/application/Espo/Core/Select/Where/Checker.php b/application/Espo/Core/Select/Where/Checker.php index 1fef7dafa8..fff1611b71 100644 --- a/application/Espo/Core/Select/Where/Checker.php +++ b/application/Espo/Core/Select/Where/Checker.php @@ -223,7 +223,7 @@ class Checker private function getSeed(): Entity { - return $this->seed ?? $this->entityManager->getEntity($this->entityType); + return $this->seed ?? $this->entityManager->getNewEntity($this->entityType); } /** diff --git a/application/Espo/Core/Select/Where/Item.php b/application/Espo/Core/Select/Where/Item.php index 59e2a3352d..07d9716481 100644 --- a/application/Espo/Core/Select/Where/Item.php +++ b/application/Espo/Core/Select/Where/Item.php @@ -38,7 +38,7 @@ class Item public const TYPE_OR = 'or'; - private ?string $type = null; + private string $type; private ?string $attribute = null; @@ -71,16 +71,24 @@ class Item self::TYPE_AND, ]; - private function __construct() {} + private function __construct(string $type) + { + $this->type = $type; + } /** * @param array $params */ public static function fromRaw(array $params): self { - $obj = new self(); + $type = $params['type'] ?? null; + + if (!$type) { + throw new InvalidArgumentException("No 'type' in where item."); + } + + $obj = new self($type); - $obj->type = $params['type'] ?? null; $obj->attribute = $params['attribute'] ?? $params['field'] ?? null; $obj->value = $params['value'] ?? null; $obj->dateTime = $params['dateTime'] ?? false; @@ -94,10 +102,6 @@ class Item } } - if (!$obj->type) { - throw new InvalidArgumentException("No 'type' in where item."); - } - if ( !$obj->attribute && !in_array($obj->type, $obj->noAttributeTypeList) @@ -131,7 +135,6 @@ class Item } /** - * * @return array{ * type: string, * value: mixed, @@ -142,7 +145,6 @@ class Item */ public function getRaw(): array { - /** @var string */ $type = $this->type; $raw = [ @@ -170,6 +172,8 @@ class Item */ public function getType(): string { + assert($this->type !== null); + return $this->type; } diff --git a/application/Espo/Core/Select/Where/Scanner.php b/application/Espo/Core/Select/Where/Scanner.php index 04981316af..731abb6124 100644 --- a/application/Espo/Core/Select/Where/Scanner.php +++ b/application/Espo/Core/Select/Where/Scanner.php @@ -156,7 +156,7 @@ class Scanner private function getSeed(string $entityType): Entity { if (!isset($this->seedHash[$entityType])) { - $this->seedHash[$entityType] = $this->entityManager->getEntity($entityType); + $this->seedHash[$entityType] = $this->entityManager->getNewEntity($entityType); } return $this->seedHash[$entityType]; diff --git a/tests/unit/Espo/Core/Select/Where/CheckerTest.php b/tests/unit/Espo/Core/Select/Where/CheckerTest.php index a43f0610ae..246f0cb666 100644 --- a/tests/unit/Espo/Core/Select/Where/CheckerTest.php +++ b/tests/unit/Espo/Core/Select/Where/CheckerTest.php @@ -65,13 +65,13 @@ class CheckerTest extends \PHPUnit\Framework\TestCase $this->entityManager ->expects($this->any()) - ->method('getEntity') + ->method('getNewEntity') ->with($this->entityType) ->willReturn($this->entity); $this->entityManager ->expects($this->any()) - ->method('getEntity') + ->method('getNewEntity') ->with($this->foreignEntityType) ->willReturn($this->foreignEntity); } diff --git a/tests/unit/Espo/Core/Select/Where/ScannerTest.php b/tests/unit/Espo/Core/Select/Where/ScannerTest.php index 1cc49971fb..b2ff357a59 100644 --- a/tests/unit/Espo/Core/Select/Where/ScannerTest.php +++ b/tests/unit/Espo/Core/Select/Where/ScannerTest.php @@ -30,14 +30,12 @@ namespace tests\unit\Espo\Core\Select\Where; use Espo\{ - Core\Exceptions\Error, Core\Select\Where\Scanner, Core\Select\Where\Item, ORM\EntityManager, ORM\BaseEntity as Entity, ORM\Query\Select as Query, ORM\Query\SelectBuilder as QueryBuilder, - ORM\QueryComposer\BaseQueryComposer as QueryComposer, }; class ScannerTest extends \PHPUnit\Framework\TestCase @@ -68,7 +66,7 @@ class ScannerTest extends \PHPUnit\Framework\TestCase $this->entityManager ->expects($this->any()) - ->method('getEntity') + ->method('getNewEntity') ->with($this->entityType) ->willReturn($this->entity); }