From c3d1c773e03e2fd07f1794bf9d9e0692477c8798 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 17 Feb 2022 13:25:25 +0200 Subject: [PATCH] type fixes --- application/Espo/ORM/Collection.php | 2 +- application/Espo/ORM/CollectionFactory.php | 22 ++++++---- application/Espo/ORM/EntityCollection.php | 15 ++++--- .../Espo/ORM/Repository/RDBSelectBuilder.php | 38 +++++++++++------- .../ORM/Repository/RDBTransactionManager.php | 8 ++-- .../Espo/ORM/Repository/Repository.php | 2 + .../Espo/ORM/Repository/RepositoryFactory.php | 3 ++ application/Espo/ORM/SthCollection.php | 31 ++++++++++---- application/Espo/ORM/TransactionManager.php | 10 ++--- .../ORM/Value/GeneralAttributeExtractor.php | 14 ++++++- .../Espo/ORM/Value/GeneralValueFactory.php | 11 ++--- .../Espo/ORM/Value/ValueAccessorFactory.php | 40 +++++++++---------- 12 files changed, 124 insertions(+), 72 deletions(-) diff --git a/application/Espo/ORM/Collection.php b/application/Espo/ORM/Collection.php index 4c000314f2..0c46abc239 100644 --- a/application/Espo/ORM/Collection.php +++ b/application/Espo/ORM/Collection.php @@ -36,7 +36,7 @@ use stdClass; * A collection of entities. * * @template TEntity of Entity - * @extends Traversable + * @extends Traversable */ interface Collection extends Traversable { diff --git a/application/Espo/ORM/CollectionFactory.php b/application/Espo/ORM/CollectionFactory.php index 025769fa8a..072e8aa0e7 100644 --- a/application/Espo/ORM/CollectionFactory.php +++ b/application/Espo/ORM/CollectionFactory.php @@ -29,40 +29,48 @@ namespace Espo\ORM; -use Espo\ORM\{ - Query\Select, -}; +use Espo\ORM\Query\Select; /** * Creates collections. */ class CollectionFactory { - /** - * @var EntityManager - */ - protected $entityManager; + protected EntityManager $entityManager; public function __construct(EntityManager $entityManager) { $this->entityManager = $entityManager; } + /** + * @return EntityCollection + */ public function create(?string $entityType = null, array $data = []): EntityCollection { return new EntityCollection($data, $entityType, $this->entityManager->getEntityFactory()); } + /** + * @return SthCollection + */ public function createFromSql(string $entityType, string $sql): SthCollection { return SthCollection::fromSql($entityType, $sql, $this->entityManager); } + /** + * @return SthCollection + */ public function createFromQuery(Select $query): SthCollection { return SthCollection::fromQuery($query, $this->entityManager); } + /** + * @param SthCollection $sthCollection + * @return EntityCollection + */ public function createFromSthCollection(SthCollection $sthCollection): EntityCollection { return EntityCollection::fromSthCollection($sthCollection); diff --git a/application/Espo/ORM/EntityCollection.php b/application/Espo/ORM/EntityCollection.php index 2ad56d6137..c3d9dfe867 100644 --- a/application/Espo/ORM/EntityCollection.php +++ b/application/Espo/ORM/EntityCollection.php @@ -41,19 +41,22 @@ use InvalidArgumentException; * A standard collection of entities. It allocates a memory for all entities. * * @template TEntity of Entity - * @implements Iterator + * @implements Iterator + * @implements Collection + * @implements ArrayAccess + * @implements SeekableIterator */ class EntityCollection implements Collection, Iterator, Countable, ArrayAccess, SeekableIterator { - private $entityFactory = null; + private ?EntityFactory $entityFactory = null; - private $entityType; + private ?string $entityType; - private $position = 0; + private int $position = 0; - private $isFetched = false; + private bool $isFetched = false; - protected $dataList = []; + protected array $dataList = []; public function __construct( array $dataList = [], diff --git a/application/Espo/ORM/Repository/RDBSelectBuilder.php b/application/Espo/ORM/Repository/RDBSelectBuilder.php index 2060c14edf..d6764fb629 100644 --- a/application/Espo/ORM/Repository/RDBSelectBuilder.php +++ b/application/Espo/ORM/Repository/RDBSelectBuilder.php @@ -52,13 +52,16 @@ use RuntimeException; */ class RDBSelectBuilder { - private $entityManager; + private EntityManager $entityManager; - private $builder; + private SelectBuilder $builder; - private $repository = null; + /** + * @var RDBRepository|null + */ + private ?RDBRepository $repository = null; - private $returnSthCollection = false; + private bool $returnSthCollection = false; public function __construct(EntityManager $entityManager, string $entityType, ?Select $query = null) { @@ -87,20 +90,21 @@ class RDBSelectBuilder } /** - * @param ?array $params @deprecated. Omit it. + * @param ?array $params @deprecated. Omit it. * @phpstan-return Collection */ public function find(?array $params = null): Collection { $query = $this->getMergedParams($params); + /** @var Collection */ $collection = $this->getMapper()->select($query); return $this->handleReturnCollection($collection); } /** - * @param ?array $params @deprecated + * @param ?array $params @deprecated * * @phpstan-return ?TEntity */ @@ -125,7 +129,7 @@ class RDBSelectBuilder /** * Get a number of records. * - * @param ?array $params @deprecated + * @param ?array $params @deprecated */ public function count(?array $params = null): int { @@ -199,7 +203,7 @@ class RDBSelectBuilder * @param Join|string $target * A relation name or table. A relation name should be in camelCase, a table in CamelCase. * @param string|null $alias An alias. - * @param WhereItem|array|null $conditions Join conditions. + * @param WhereItem|array|null $conditions Join conditions. * * @phpstan-return RDBSelectBuilder */ @@ -216,7 +220,7 @@ class RDBSelectBuilder * @param Join|string $target * A relation name or table. A relation name should be in camelCase, a table in CamelCase. * @param string|null $alias An alias. - * @param WhereItem|array|null $conditions Join conditions. + * @param WhereItem|array|null $conditions Join conditions. * * @phpstan-return RDBSelectBuilder */ @@ -273,8 +277,8 @@ class RDBSelectBuilder * * `where(array $clause)` * * `where(string $key, string $value)` * - * @param WhereItem|array|string $clause A key or where clause. - * @param array|string|null $value A value. Omitted if the first argument is not string. + * @param WhereItem|array|string $clause A key or where clause. + * @param scalar[]|scalar|null $value A value. Omitted if the first argument is not string. * * @phpstan-return RDBSelectBuilder */ @@ -293,8 +297,8 @@ class RDBSelectBuilder * * `having(array $clause)` * * `having(string $key, string $value)` * - * @param WhereItem|array|string $clause A key or where clause. - * @param array|string|null $value A value. Omitted if the first argument is not string. + * @param WhereItem|array|string $clause A key or where clause. + * @param scalar[]|scalar|null $value A value. Omitted if the first argument is not string. * * @phpstan-return RDBSelectBuilder */ @@ -391,6 +395,7 @@ class RDBSelectBuilder * @deprecated Use `group` method. * * @phpstan-return RDBSelectBuilder + * @param Expression|Expression[]|string|string[] $groupBy */ public function groupBy($groupBy): self { @@ -398,7 +403,8 @@ class RDBSelectBuilder } /** - * @phpstan-return Collection|SthCollection + * @param Collection $collection + * @return Collection|SthCollection */ protected function handleReturnCollection(Collection $collection): Collection { @@ -410,12 +416,16 @@ class RDBSelectBuilder return $collection; } + /** + * @var \Espo\ORM\EntityCollection + */ return $this->entityManager->getCollectionFactory()->createFromSthCollection($collection); } /** * For backward compatibility. * @todo Remove. + * @param array $params */ protected function getMergedParams(?array $params = null): Select { diff --git a/application/Espo/ORM/Repository/RDBTransactionManager.php b/application/Espo/ORM/Repository/RDBTransactionManager.php index a6f878cd53..95313f43dc 100644 --- a/application/Espo/ORM/Repository/RDBTransactionManager.php +++ b/application/Espo/ORM/Repository/RDBTransactionManager.php @@ -29,9 +29,7 @@ namespace Espo\ORM\Repository; -use Espo\ORM\{ - TransactionManager, -}; +use Espo\ORM\TransactionManager; use RuntimeException; @@ -40,9 +38,9 @@ use RuntimeException; */ class RDBTransactionManager { - private $transactionManager; + private TransactionManager $transactionManager; - private $level = 0; + private int $level = 0; public function __construct(TransactionManager $transactionManager) { diff --git a/application/Espo/ORM/Repository/Repository.php b/application/Espo/ORM/Repository/Repository.php index c4e85eab36..36cc977ed9 100644 --- a/application/Espo/ORM/Repository/Repository.php +++ b/application/Espo/ORM/Repository/Repository.php @@ -56,6 +56,7 @@ interface Repository * Store an entity. * * @phpstan-param TEntity $entity + * @param array $options */ public function save(Entity $entity, array $options = []): void; @@ -63,6 +64,7 @@ interface Repository * Remove an entity. * * @phpstan-param TEntity $entity + * @param array $options */ public function remove(Entity $entity, array $options = []): void; } diff --git a/application/Espo/ORM/Repository/RepositoryFactory.php b/application/Espo/ORM/Repository/RepositoryFactory.php index 02ffdd9fbd..3db283371a 100644 --- a/application/Espo/ORM/Repository/RepositoryFactory.php +++ b/application/Espo/ORM/Repository/RepositoryFactory.php @@ -31,5 +31,8 @@ namespace Espo\ORM\Repository; interface RepositoryFactory { + /** + * @return Repository<\Espo\ORM\Entity> + */ public function create(string $entityType): Repository; } diff --git a/application/Espo/ORM/SthCollection.php b/application/Espo/ORM/SthCollection.php index c76206fbdb..658dbe4ceb 100644 --- a/application/Espo/ORM/SthCollection.php +++ b/application/Espo/ORM/SthCollection.php @@ -36,6 +36,7 @@ use IteratorAggregate; use Countable; use Traversable; use PDO; +use PDOStatement; /** * Reasonable to use when selecting a large number of records. @@ -45,21 +46,25 @@ use PDO; * STH stands for Statement Handle. * * @template TEntity of Entity - * @implements IteratorAggregate + * @implements IteratorAggregate + * @implements Collection */ class SthCollection implements Collection, IteratorAggregate, Countable { - private $entityManager; + private EntityManager $entityManager; - private $entityType; + private string $entityType; - private $query = null; + private ?SelectQuery $query = null; - private $sth = null; + private ?PDOStatement $sth = null; - private $sql = null; + private ?string $sql = null; - private $entityList = []; + /** + * @var Entity[] + */ + private array $entityList = []; private function __construct(EntityManager $entityManager) { @@ -133,6 +138,9 @@ class SthCollection implements Collection, IteratorAggregate, Countable } } + /** + * @return array + */ private function fetchRow() { $this->executeQueryIfNotExecuted(); @@ -160,6 +168,7 @@ class SthCollection implements Collection, IteratorAggregate, Countable /** * @deprecated + * @return array>|\stdClass[] */ public function toArray(bool $itemsAsObjects = false): array { @@ -204,8 +213,12 @@ class SthCollection implements Collection, IteratorAggregate, Countable return $this->entityType; } + /** + * @return self + */ public static function fromQuery(SelectQuery $query, EntityManager $entityManager): self { + /** @var self */ $obj = new self($entityManager); $obj->entityType = $query->getFrom(); @@ -214,8 +227,12 @@ class SthCollection implements Collection, IteratorAggregate, Countable return $obj; } + /** + * @return self + */ public static function fromSql(string $entityType, string $sql, EntityManager $entityManager): self { + /** @var self */ $obj = new self($entityManager); $obj->entityType = $entityType; diff --git a/application/Espo/ORM/TransactionManager.php b/application/Espo/ORM/TransactionManager.php index 2c0d7a9e0f..edac2623b4 100644 --- a/application/Espo/ORM/TransactionManager.php +++ b/application/Espo/ORM/TransactionManager.php @@ -29,9 +29,7 @@ namespace Espo\ORM; -use Espo\ORM\{ - QueryComposer\QueryComposer, -}; +use Espo\ORM\QueryComposer\QueryComposer; use PDO; use RuntimeException; @@ -40,11 +38,11 @@ use Closure; class TransactionManager { - private $level = 0; + private int $level = 0; - private $pdo; + private PDO $pdo; - private $queryComposer; + private QueryComposer $queryComposer; public function __construct(PDO $pdo, QueryComposer $queryComposer) { diff --git a/application/Espo/ORM/Value/GeneralAttributeExtractor.php b/application/Espo/ORM/Value/GeneralAttributeExtractor.php index 9e17d4bb8f..3b115f03b9 100644 --- a/application/Espo/ORM/Value/GeneralAttributeExtractor.php +++ b/application/Espo/ORM/Value/GeneralAttributeExtractor.php @@ -33,10 +33,19 @@ use stdClass; class GeneralAttributeExtractor { - private $factory; + /** + * @var AttributeExtractorFactory + */ + private AttributeExtractorFactory $factory; + /** + * @var array> + */ private $cache = []; + /** + * @param AttributeExtractorFactory $factory + */ public function __construct(AttributeExtractorFactory $factory) { $this->factory = $factory; @@ -56,6 +65,9 @@ class GeneralAttributeExtractor return $extractor->extract($value, $field); } + /** + * @return AttributeExtractor + */ private function getExtractor(string $entityType, string $field): AttributeExtractor { $key = $entityType . '_' . $field; diff --git a/application/Espo/ORM/Value/GeneralValueFactory.php b/application/Espo/ORM/Value/GeneralValueFactory.php index 5f53310fce..c9451035c8 100644 --- a/application/Espo/ORM/Value/GeneralValueFactory.php +++ b/application/Espo/ORM/Value/GeneralValueFactory.php @@ -29,17 +29,18 @@ namespace Espo\ORM\Value; -use Espo\ORM\{ - Entity, -}; +use Espo\ORM\Entity; use RuntimeException; class GeneralValueFactory { - private $valueFactoryFactory; + private ValueFactoryFactory $valueFactoryFactory; - private $factoryCache = []; + /** + * @var array + */ + private array $factoryCache = []; public function __construct(ValueFactoryFactory $valueFactoryFactory) { diff --git a/application/Espo/ORM/Value/ValueAccessorFactory.php b/application/Espo/ORM/Value/ValueAccessorFactory.php index 664a6bad49..2a3d8cfcc2 100644 --- a/application/Espo/ORM/Value/ValueAccessorFactory.php +++ b/application/Espo/ORM/Value/ValueAccessorFactory.php @@ -29,23 +29,27 @@ namespace Espo\ORM\Value; -use Espo\ORM\{ - Entity, - EventDispatcher, -}; +use Espo\ORM\Entity; +use Espo\ORM\EventDispatcher; class ValueAccessorFactory { - private $generalValueFactory = null; + private ?GeneralValueFactory $generalValueFactory = null; - private $generalAttributeExtractor = null; + private ?GeneralAttributeExtractor $generalAttributeExtractor = null; - private $valueFactoryFactory; + private ValueFactoryFactory $valueFactoryFactory; - private $attributeExtractorFactory; + /** + * @var AttributeExtractorFactory + */ + private AttributeExtractorFactory $attributeExtractorFactory; - private $eventDispatcher; + private EventDispatcher $eventDispatcher; + /** + * @param AttributeExtractorFactory $attributeExtractorFactory + */ public function __construct( ValueFactoryFactory $valueFactoryFactory, AttributeExtractorFactory $attributeExtractorFactory, @@ -60,19 +64,17 @@ class ValueAccessorFactory public function create(Entity $entity): ValueAccessor { - $generalValueFactory = $this->getGeneralValueFactory(); - - $generalAttributeExtractor = $this->getGeneralAttributeExtractor(); - - return new ValueAccessor($entity, $generalValueFactory, $generalAttributeExtractor); + return new ValueAccessor( + $entity, + $this->getGeneralValueFactory(), + $this->getGeneralAttributeExtractor() + ); } private function getGeneralValueFactory(): GeneralValueFactory { if (!$this->generalValueFactory) { - $this->generalValueFactory = new GeneralValueFactory( - $this->valueFactoryFactory - ); + $this->generalValueFactory = new GeneralValueFactory($this->valueFactoryFactory); } return $this->generalValueFactory; @@ -81,9 +83,7 @@ class ValueAccessorFactory private function getGeneralAttributeExtractor(): GeneralAttributeExtractor { if (!$this->generalAttributeExtractor) { - $this->generalAttributeExtractor = new GeneralAttributeExtractor( - $this->attributeExtractorFactory - ); + $this->generalAttributeExtractor = new GeneralAttributeExtractor($this->attributeExtractorFactory); } return $this->generalAttributeExtractor;