- Still WIP on removing annotations

This commit is contained in:
Dave M. 2023-12-04 12:36:06 -05:00
parent 62792e8325
commit d9fa51fa18
5 changed files with 28 additions and 16 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}; use Ulmus\{Attribute\Obj\Table, Repository, Ulmus};
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,12 +27,14 @@ 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
{ {
return ( new Repository\SqliteRepository(Column::class) )->pragma('table_info', $this->tableName)->collectionFromQuery(); $adapter = Ulmus::$registeredAdapters[$this->loadedFromAdapter];
return Column::repository(Repository\SqliteRepository::DEFAULT_ALIAS, $adapter)
->pragma('table_info', $this->tableName)->collectionFromQuery();
} }
} }

View File

@ -3,6 +3,7 @@
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")]
@ -10,12 +11,16 @@ 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
{ {
return new class(static::class, $alias, $adapter) extends Repository\SqliteRepository $repository = 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,6 +14,9 @@ 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;
@ -324,7 +327,6 @@ 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

@ -372,14 +372,12 @@ 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 ( new $class() )->entityFillFromDataset($entityData); yield $this->instanciateEntity()->entityFillFromDataset($entityData);
} }
} }
@ -698,7 +696,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,14 +860,17 @@ class Repository
public function collectionFromQuery(? string $entityClass = null) : EntityCollection public function collectionFromQuery(? string $entityClass = null) : EntityCollection
{ {
$class = $entityClass ?? $this->entityClass; $entityClass ??= $this->entityClass;
$entityCollection = $class::entityCollection(); $entityCollection = $entityClass::entityCollection();
$this->finalizeQuery(); $this->finalizeQuery();
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) { foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) {
$entityCollection->append( ( new $class() )->resetVirtualProperties()->entityFillFromDataset($entityData) ); $entity = $this->instanciateEntity($entityClass);
$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);
@ -1042,9 +1043,11 @@ class Repository
return $this->entityClass::entityCollection(...$arguments); return $this->entityClass::entityCollection(...$arguments);
} }
public function instanciateEntity() : object public function instanciateEntity(? string $entityClass = null) : object
{ {
return new $this->entityClass(); $entityClass ??= $this->entityClass;
return new $entityClass;
} }
public function hasFilters() : bool public function hasFilters() : bool
@ -1053,7 +1056,7 @@ class Repository
} }
protected function matchEntity(object $entity) { protected function matchEntity(object $entity) {
return get_class($entity) === $this->entityClass; return $entity::class === $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'.", $this->entity::class, $name )); 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() ));
} }
} }