Compare commits

..

No commits in common. "fa4e686f3535acac54e89d7907635250c4a9d525" and "d4d68a029d3d50eb752b44adcb22f84ab1eb4266" have entirely different histories.

5 changed files with 16 additions and 28 deletions

View File

@ -4,7 +4,7 @@ namespace Ulmus\Entity\Sqlite;
use Ulmus\EntityCollection; use Ulmus\EntityCollection;
use Ulmus\Query\{From, Select}; use Ulmus\Query\{From, Select};
use Ulmus\{Attribute\Obj\Table, Repository, Ulmus}; use Ulmus\{Attribute\Obj\Table, Repository};
use Ulmus\Attribute\Property\{Field, Filter, FilterJoin, Relation, Join, Virtual, Where}; use Ulmus\Attribute\Property\{Field, Filter, FilterJoin, Relation, Join, Virtual, Where};
#[Table(name: "sqlite_master")] #[Table(name: "sqlite_master")]
@ -27,14 +27,12 @@ class Schema
#[Field] #[Field]
public ? string $sql; public ? string $sql;
##[Relation("oneToMany", key: "tableName", foreignKey: "tableName", entity: Column::class)]
#[Virtual(method: "filterColumns")] #[Virtual(method: "filterColumns")]
public EntityCollection $columns; public EntityCollection $columns;
public function filterColumns() : EntityCollection public function filterColumns() : EntityCollection
{ {
$adapter = Ulmus::$registeredAdapters[$this->loadedFromAdapter]; return ( new Repository\SqliteRepository(Column::class) )->pragma('table_info', $this->tableName)->collectionFromQuery();
return Column::repository(Repository\SqliteRepository::DEFAULT_ALIAS, $adapter)
->pragma('table_info', $this->tableName)->collectionFromQuery();
} }
} }

View File

@ -3,7 +3,6 @@
namespace Ulmus\Entity\Sqlite; namespace Ulmus\Entity\Sqlite;
use Ulmus\ConnectionAdapter; use Ulmus\ConnectionAdapter;
use Ulmus\EntityCollection;
use Ulmus\Repository; use Ulmus\Repository;
#[\Ulmus\Attribute\Obj\Table(name: "sqlite_master")] #[\Ulmus\Attribute\Obj\Table(name: "sqlite_master")]
@ -11,16 +10,12 @@ class Table extends Schema
{ {
public static function repository(string $alias = Repository::DEFAULT_ALIAS, ConnectionAdapter $adapter = null): Repository public static function repository(string $alias = Repository::DEFAULT_ALIAS, ConnectionAdapter $adapter = null): Repository
{ {
$repository = new class(static::class, $alias, $adapter) extends Repository\SqliteRepository return new class(static::class, $alias, $adapter) extends Repository\SqliteRepository
{ {
public function finalizeQuery(): void public function finalizeQuery(): void
{ {
$this->select(Table::field('tableName'))->groupBy(Table::field('tableName')); $this->select(Table::field('tableName'))->groupBy(Table::field('tableName'));
} }
}; };
$repository->entityClass = static::class;
return $repository;
} }
} }

View File

@ -14,9 +14,6 @@ use Ulmus\{Common\EntityResolver,
trait EntityTrait { trait EntityTrait {
use EventTrait; use EventTrait;
#[Ignore]
public string $loadedFromAdapter;
#[Ignore] #[Ignore]
protected bool $entityStrictFieldsDeclaration = false; protected bool $entityStrictFieldsDeclaration = false;
@ -327,6 +324,7 @@ trait EntityTrait {
#[Ignore] #[Ignore]
public static function field($name, null|string|false $alias = Repository::DEFAULT_ALIAS) : EntityField public static function field($name, null|string|false $alias = Repository::DEFAULT_ALIAS) : EntityField
{ {
$default = ( $alias === false ? '' : Repository::DEFAULT_ALIAS ); # bw compatibility, to be deprecated $default = ( $alias === false ? '' : Repository::DEFAULT_ALIAS ); # bw compatibility, to be deprecated
return new EntityField(static::class, $name, $alias ? Ulmus::repository(static::class)->adapter->adapter()->escapeIdentifier($alias, Adapter\AdapterInterface::IDENTIFIER_FIELD) : $default, Ulmus::resolveEntity(static::class)); return new EntityField(static::class, $name, $alias ? Ulmus::repository(static::class)->adapter->adapter()->escapeIdentifier($alias, Adapter\AdapterInterface::IDENTIFIER_FIELD) : $default, Ulmus::resolveEntity(static::class));

View File

@ -374,12 +374,14 @@ class Repository
public function yield() : \Generator public function yield() : \Generator
{ {
$class = $this->entityClass;
$this->selectSqlQuery(); $this->selectSqlQuery();
$this->finalizeQuery(); $this->finalizeQuery();
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) { foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) {
yield $this->instanciateEntity()->entityFillFromDataset($entityData); yield ( new $class() )->entityFillFromDataset($entityData);
} }
} }
@ -698,7 +700,7 @@ class Repository
} }
} }
if ( ! in_array(WithOptionEnum::SkipJoinFilter, $options) ) { if ( ! in_array(WithOptionEnum::SkipJoinFilter, $options) ) {
foreach ($this->entityResolver->searchFieldAnnotationList($item, [Attribute\Property\FilterJoin::class, FilterJoin::class]) as $filter) { foreach ($this->entityResolver->searchFieldAnnotationList($item, [Attribute\Property\FilterJoin::class, FilterJoin::class]) as $filter) {
call_user_func_array([$this->entityClass, $filter->method], [$join, $item, true]); call_user_func_array([$this->entityClass, $filter->method], [$join, $item, true]);
} }
@ -862,17 +864,14 @@ class Repository
public function collectionFromQuery(? string $entityClass = null) : EntityCollection public function collectionFromQuery(? string $entityClass = null) : EntityCollection
{ {
$entityClass ??= $this->entityClass; $class = $entityClass ?? $this->entityClass;
$entityCollection = $entityClass::entityCollection(); $entityCollection = $class::entityCollection();
$this->finalizeQuery(); $this->finalizeQuery();
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) { foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) {
$entity = $this->instanciateEntity($entityClass); $entityCollection->append( ( new $class() )->resetVirtualProperties()->entityFillFromDataset($entityData) );
$entity->loadedFromAdapter = $this->adapter->name;
$entityCollection->append( $entity->resetVirtualProperties()->entityFillFromDataset($entityData) );
} }
$this->eventExecute(Event\Repository\CollectionFromQueryInterface::class, $entityCollection); $this->eventExecute(Event\Repository\CollectionFromQueryInterface::class, $entityCollection);
@ -1045,11 +1044,9 @@ class Repository
return $this->entityClass::entityCollection(...$arguments); return $this->entityClass::entityCollection(...$arguments);
} }
public function instanciateEntity(? string $entityClass = null) : object public function instanciateEntity() : object
{ {
$entityClass ??= $this->entityClass; return new $this->entityClass();
return new $entityClass;
} }
public function hasFilters() : bool public function hasFilters() : bool
@ -1058,7 +1055,7 @@ class Repository
} }
protected function matchEntity(object $entity) { protected function matchEntity(object $entity) {
return $entity::class === $this->entityClass; return get_class($entity) === $this->entityClass;
} }
protected function finalizeQuery() : void {} protected function finalizeQuery() : void {}

View File

@ -89,7 +89,7 @@ class RelationBuilder
} }
} }
catch(\Throwable $e) { catch(\Throwable $e) {
throw new $e(sprintf("An error occurred while calling method from your #[Virtual] attribute in entity '%s::%s'. Caught '%s'", $this->entity::class, $name, $e->getMessage() )); throw new $e(sprintf("An error occurred while calling method from your #[Virtual] attribute in entity '%s::%s'.", $this->entity::class, $name ));
} }
} }