Skip to content

Commit

Permalink
Stable base libraries for queries + entities
Browse files Browse the repository at this point in the history
  • Loading branch information
iquito committed Dec 15, 2021
1 parent 010d14a commit 18d1c20
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 475 deletions.
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
"symfony/http-kernel": "^5.0|^6.0",
"symfony/finder": "^5.0|^6.0",
"symfony/config": "^5.0|^6.0",
"squirrelphp/queries-bundle": "^0.13",
"squirrelphp/entities": "^0.12"
"squirrelphp/queries-bundle": "^0.14",
"squirrelphp/entities": "^1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.3",
Expand Down
193 changes: 38 additions & 155 deletions tests/TestEntities/UserAddressRepositoryReadOnly.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?php
// phpcs:ignoreFile -- created by SquirrelPHP library, do not alter
// phpcs:ignoreFile -- created by SquirrelPHP entities library, do not alter
/*
* THIS FILE IS AUTOMATICALLY CREATED - DO NOT EDIT, DO NOT COMMIT TO VCS
*
Expand All @@ -12,159 +12,53 @@
*/
// @codeCoverageIgnoreStart

namespace Squirrel\EntitiesBundle\Tests\TestEntities {
use Squirrel\Entities\RepositoryBuilderReadOnlyInterface;
use Squirrel\Entities\RepositoryReadOnlyInterface;

class UserAddressRepositoryReadOnly implements RepositoryBuilderReadOnlyInterface
{
public function __construct(private RepositoryReadOnlyInterface $repository)
{
}

public function count(): \Squirrel\Entities\Builder\CountEntries
{
return new \Squirrel\Entities\Builder\CountEntries($this->repository);
}

public function select(): \Squirrel\Entities\Builder\SquirrelEntitiesBundleTestsTestEntitiesUserAddress\SelectEntries
{
return new \Squirrel\Entities\Builder\SquirrelEntitiesBundleTestsTestEntitiesUserAddress\SelectEntries($this->repository);
}
}
}

namespace Squirrel\Entities\Builder\SquirrelEntitiesBundleTestsTestEntitiesUserAddress {
/**
* @implements \Iterator<int,\Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress>
*/
class SelectIterator implements \Squirrel\Queries\Builder\BuilderInterface, \Iterator
class SelectIterator extends \Squirrel\Entities\Builder\SelectIterator
{
private \Squirrel\Entities\Builder\SelectIterator $iteratorInstance;

public function __construct(\Squirrel\Entities\Builder\SelectIterator $iterator)
{
$this->iteratorInstance = $iterator;
}

public function current(): \Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress
{
$entry = $this->iteratorInstance->current();
$entry = parent::current();

if ($entry instanceof \Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress) {
return $entry;
}

throw new \LogicException('Unexpected type encountered - wrong repository might be configured: ' . \get_class($entry));
}

public function next(): void
{
$this->iteratorInstance->next();
}

public function key(): int
{
return $this->iteratorInstance->key();
}

public function valid(): bool
{
return $this->iteratorInstance->valid();
}

public function rewind(): void
{
$this->iteratorInstance->rewind();
}

public function clear(): void
{
$this->iteratorInstance->clear();
}
}

/**
* This class exists to have proper type hints about the object(s) returned in the
* getEntries and getOneEntry functions. All calls are delegated to the
* SelectEntries class - because of the builder pattern we cannot extend SelectEntries
* (because then returning self would return that class instead of this extended class)
* so we instead imitate it. This way the implementation in SelectEntries can change
* and this generated class has no ties to how it "works" or how the repository is used.
* getEntries and getOneEntry functions. The heavy lifting is done by the
* SelectEntries class
*
* @implements \IteratorAggregate<int,\Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress>
*/
class SelectEntries implements \Squirrel\Queries\Builder\BuilderInterface, \IteratorAggregate
class SelectEntries extends \Squirrel\Entities\Builder\SelectEntries
{
private \Squirrel\Entities\Builder\SelectEntries $selectImplementation;

public function __construct(\Squirrel\Entities\RepositoryReadOnlyInterface $repository)
{
$this->selectImplementation = new \Squirrel\Entities\Builder\SelectEntries($repository);
}

public function field(string $onlyGetThisField): self
{
$this->selectImplementation->field($onlyGetThisField);
return $this;
}

/**
* @param string[] $onlyGetTheseFields
*/
public function fields(array $onlyGetTheseFields): self
{
$this->selectImplementation->fields($onlyGetTheseFields);
return $this;
}

/**
* @param array<int|string,mixed> $whereClauses
*/
public function where(array $whereClauses): self
{
$this->selectImplementation->where($whereClauses);
return $this;
}

/**
* @param array<int|string,string>|string $orderByClauses
*/
public function orderBy(array|string $orderByClauses): self
{
$this->selectImplementation->orderBy($orderByClauses);
return $this;
}

public function startAt(int $startAtNumber): self
{
$this->selectImplementation->startAt($startAtNumber);
return $this;
}

public function limitTo(int $numberOfEntries): self
{
$this->selectImplementation->limitTo($numberOfEntries);
return $this;
}

public function blocking(bool $active = true): self
{
$this->selectImplementation->blocking($active);
return $this;
}

/**
* @return \Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress[]
*/
public function getAllEntries(): array
{
return $this->selectImplementation->getAllEntries();
/** @var \Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress[] $entries */
$entries = parent::getAllEntries();

foreach ($entries as $entry) {
if (!($entry instanceof \Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress)) {
throw new \LogicException('Unexpected type encountered - wrong repository might be configured: ' . \get_class($entry));
}
}

return $entries;
}

public function getOneEntry(): ?\Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress
{
$entry = $this->selectImplementation->getOneEntry();
$entry = parent::getOneEntry();

if ($entry instanceof \Squirrel\EntitiesBundle\Tests\TestEntities\UserAddress || $entry === null) {
return $entry;
Expand All @@ -173,49 +67,38 @@ public function getOneEntry(): ?\Squirrel\EntitiesBundle\Tests\TestEntities\User
throw new \LogicException('Unexpected type encountered - wrong repository might be configured: ' . \get_class($entry));
}

/**
* @return array<bool|int|float|string|null>
*/
public function getFlattenedFields(): array
{
return $this->selectImplementation->getFlattenedFields();
}

/**
* @return int[]
*/
public function getFlattenedIntegerFields(): array
public function getIterator(): SelectIterator
{
return $this->selectImplementation->getFlattenedIntegerFields();
return new SelectIterator($this->repository, [
'where' => $this->where,
'order' => $this->orderBy,
'fields' => $this->fields,
'limit' => $this->limitTo,
'offset' => $this->startAt,
'lock' => $this->blocking,
]);
}
}
}

/**
* @return float[]
*/
public function getFlattenedFloatFields(): array
{
return $this->selectImplementation->getFlattenedFloatFields();
}
namespace Squirrel\EntitiesBundle\Tests\TestEntities {
use Squirrel\Entities\RepositoryBuilderReadOnlyInterface;
use Squirrel\Entities\RepositoryReadOnlyInterface;

/**
* @return string[]
*/
public function getFlattenedStringFields(): array
class UserAddressRepositoryReadOnly implements RepositoryBuilderReadOnlyInterface
{
public function __construct(private RepositoryReadOnlyInterface $repository)
{
return $this->selectImplementation->getFlattenedStringFields();
}

/**
* @return bool[]
*/
public function getFlattenedBooleanFields(): array
public function count(): \Squirrel\Entities\Builder\CountEntries
{
return $this->selectImplementation->getFlattenedBooleanFields();
return new \Squirrel\Entities\Builder\CountEntries($this->repository);
}

public function getIterator(): SelectIterator
public function select(): \Squirrel\Entities\Builder\SquirrelEntitiesBundleTestsTestEntitiesUserAddress\SelectEntries
{
return new SelectIterator($this->selectImplementation->getIterator());
return new \Squirrel\Entities\Builder\SquirrelEntitiesBundleTestsTestEntitiesUserAddress\SelectEntries($this->repository);
}
}
}
Expand Down
Loading

0 comments on commit 18d1c20

Please sign in to comment.