- Multiple bug fixes related to notes 2.x
This commit is contained in:
1 parent
f3be11a590
commit
bd9078230d
9 files changed
+69
-73
No files matched your search
+41
-39
@@ -2,16 +2,9 @@
|
||||
|
||||
namespace Ulmus;
|
||||
|
||||
use Ulmus\Annotation\Property\{Field,
|
||||
OrderBy,
|
||||
Where,
|
||||
Having,
|
||||
Relation,
|
||||
Filter,
|
||||
Join,
|
||||
FilterJoin,
|
||||
WithJoin,
|
||||
Relation\Ignore as RelationIgnore};
|
||||
use Ulmus\Attribute\Property\{
|
||||
Field, OrderBy, Where, Having, Relation, Filter, Join, FilterJoin, WithJoin
|
||||
};
|
||||
use Ulmus\Common\EntityResolver;
|
||||
use Ulmus\Repository\WithOptionEnum;
|
||||
|
||||
@@ -88,7 +81,16 @@ class Repository
|
||||
$this->select( "DISTINCT COUNT(*) OVER ()" );
|
||||
}
|
||||
else {
|
||||
$this->select(Common\Sql::function("COUNT", '*'));
|
||||
$pk = Ulmus::resolveEntity($this->entityClass)->getPrimaryKeyField();
|
||||
|
||||
if (count($pk) === 1) {
|
||||
$field = key($pk);
|
||||
|
||||
$this->select(Common\Sql::function('COUNT', Common\Sql::raw("DISTINCT " . $this->entityClass::field($field))));
|
||||
}
|
||||
else {
|
||||
$this->select(Common\Sql::function('COUNT', Common\Sql::raw('*')));
|
||||
}
|
||||
}
|
||||
|
||||
$this->selectSqlQuery();
|
||||
@@ -362,7 +364,7 @@ class Repository
|
||||
$dataset = $this->generateDatasetDiff($entity, $oldValues);
|
||||
|
||||
foreach($dataset as $field => $value) {
|
||||
if ( false === ( $this->entityResolver->searchFieldAnnotation($field, [ Attribute\Property\Field::class, Field::class ], false)->readonly ?? false ) ) {
|
||||
if ( false === ( $this->entityResolver->searchFieldAnnotation($field, [ Field::class, Field::class ], false)->readonly ?? false ) ) {
|
||||
$intersect[$field] = $field;
|
||||
}
|
||||
}
|
||||
@@ -395,7 +397,7 @@ class Repository
|
||||
$prependField and ($prependField .= "$");
|
||||
|
||||
foreach ($entity::resolveEntity()->fieldList(Common\EntityResolver::KEY_COLUMN_NAME, true) as $key => $field) {
|
||||
if (null === $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Attribute\Property\Relation\Ignore::class, RelationIgnore::class ])) {
|
||||
if (null === $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Relation\Ignore::class ])) {
|
||||
$this->select(sprintf("%s.$key as {$prependField}{$field->name}", $this->escapeIdentifier($alias)));
|
||||
}
|
||||
}
|
||||
@@ -408,7 +410,7 @@ class Repository
|
||||
$fieldlist = [];
|
||||
|
||||
foreach ($entity::resolveEntity()->fieldList(Common\EntityResolver::KEY_COLUMN_NAME, true) as $key => $field) {
|
||||
if (null === $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Attribute\Property\Relation\Ignore::class, RelationIgnore::class ])) {
|
||||
if (null === $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Relation\Ignore::class ])) {
|
||||
$fieldlist[] = $key;
|
||||
$fieldlist[] = $entity::field($field->name, $this->escapeIdentifier($alias));
|
||||
}
|
||||
@@ -623,26 +625,26 @@ class Repository
|
||||
$this->joined[$item] = true;
|
||||
}
|
||||
|
||||
$annotation = $this->entityResolver->searchFieldAnnotation($item, [ Attribute\Property\Join::class ]) ?:
|
||||
$this->entityResolver->searchFieldAnnotation($item, [ Attribute\Property\Relation::class ]);
|
||||
$attribute = $this->entityResolver->searchFieldAnnotation($item, [ Join::class ]) ?:
|
||||
$this->entityResolver->searchFieldAnnotation($item, [ Relation::class ]);
|
||||
|
||||
$isRelation = ( $annotation instanceof Relation ) || ($annotation instanceof Attribute\Property\Relation);
|
||||
$isRelation = ( $attribute instanceof Relation ) || ($attribute instanceof Relation);
|
||||
|
||||
if ($isRelation && ( $annotation->isManyToMany() )) {
|
||||
if ($isRelation && ( $attribute->isManyToMany() )) {
|
||||
throw new \Exception("Many-to-many relation can not be preloaded within joins.");
|
||||
}
|
||||
|
||||
if ( $annotation ) {
|
||||
$alias = $annotation->alias ?? $item;
|
||||
if ( $attribute ) {
|
||||
$alias = $attribute->alias ?? $item;
|
||||
|
||||
$entity = $annotation->entity ?? $this->entityResolver->reflectedClass->getProperties(true)[$item]->getTypes()[0]->type;
|
||||
$entity = $attribute->entity ?? $this->entityResolver->reflectedClass->getProperties(true)[$item]->getTypes()[0]->type;
|
||||
|
||||
foreach($entity::resolveEntity()->fieldList(Common\EntityResolver::KEY_COLUMN_NAME, true) as $key => $field) {
|
||||
if ( null === $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Attribute\Property\Relation\Ignore::class ]) ) {
|
||||
if ( null === $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Relation\Ignore::class ]) ) {
|
||||
$escAlias = $this->escapeIdentifier($alias);
|
||||
$fieldName = $this->escapeIdentifier($key);
|
||||
|
||||
$name = $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Attribute\Property\Field::class ])->name ?? $field->name;
|
||||
$name = $entity::resolveEntity()->searchFieldAnnotation($field->name, [ Field::class ])->name ?? $field->name;
|
||||
|
||||
|
||||
$this->select("$escAlias.$fieldName as $alias\${$name}");
|
||||
@@ -652,7 +654,7 @@ class Repository
|
||||
$this->open();
|
||||
|
||||
if ( ! in_array(WithOptionEnum::SkipWhere, $options)) {
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Attribute\Property\Where::class ] ) as $condition) {
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Where::class ] ) as $condition) {
|
||||
if ( is_object($condition->field) && ( $condition->field->entityClass !== $entity ) ) {
|
||||
$this->where(is_object($condition->field) ? $condition->field : $entity::field($condition->field), $condition->getValue(), $condition->operator);
|
||||
}
|
||||
@@ -660,26 +662,26 @@ class Repository
|
||||
}
|
||||
|
||||
if ( ! in_array(WithOptionEnum::SkipHaving, $options)) {
|
||||
foreach ($this->entityResolver->searchFieldAnnotationList($item, [ Attribute\Property\Having::class ]) as $condition) {
|
||||
foreach ($this->entityResolver->searchFieldAnnotationList($item, [ Having::class ]) as $condition) {
|
||||
$this->having(is_object($condition->field) ? $condition->field : $entity::field($condition->field), $condition->getValue(), $condition->operator);
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! in_array(WithOptionEnum::SkipFilter, $options)) {
|
||||
foreach ($this->entityResolver->searchFieldAnnotationList($item, [ Attribute\Property\Filter::class ]) as $filter) {
|
||||
foreach ($this->entityResolver->searchFieldAnnotationList($item, [ Filter::class ]) as $filter) {
|
||||
call_user_func_array([$this->entityClass, $filter->method], [$this, $item, true]);
|
||||
}
|
||||
}
|
||||
|
||||
$this->close();
|
||||
|
||||
$key = is_string($annotation->key) ? $this->entityClass::field($annotation->key) : $annotation->key;
|
||||
$key = is_string($attribute->key) ? $this->entityClass::field($attribute->key) : $attribute->key;
|
||||
|
||||
$foreignKey = is_string($annotation->foreignKey) ? $entity::field($annotation->foreignKey, $alias) : $annotation->foreignKey;
|
||||
$foreignKey = is_string($attribute->foreignKey) ? $entity::field($attribute->foreignKey, $alias) : $attribute->foreignKey;
|
||||
|
||||
$this->join("LEFT", $entity::resolveEntity()->tableName(), $key, $foreignKey, $alias, function($join) use ($item, $entity, $alias, $options) {
|
||||
if ( ! in_array(WithOptionEnum::SkipJoinWhere, $options)) {
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Attribute\Property\Where::class ]) as $condition) {
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Where::class ]) as $condition) {
|
||||
if ( ! is_object($condition->field) ) {
|
||||
$field = $this->entityClass::field($condition->field);
|
||||
}
|
||||
@@ -697,14 +699,14 @@ class Repository
|
||||
}
|
||||
|
||||
if ( ! in_array(WithOptionEnum::SkipJoinFilter, $options) ) {
|
||||
foreach ($this->entityResolver->searchFieldAnnotationList($item, [ Attribute\Property\FilterJoin::class ]) as $filter) {
|
||||
foreach ($this->entityResolver->searchFieldAnnotationList($item, [ FilterJoin::class ]) as $filter) {
|
||||
call_user_func_array([$this->entityClass, $filter->method], [$join, $item, true]);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
throw new \Exception("Referenced field `$item` which do not exist or do not contain a valid @Join or @Relation annotation.");
|
||||
throw new \Exception("Referenced field `$item` which do not exist or do not contain a valid @Join or @Relation attribute.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -724,7 +726,7 @@ class Repository
|
||||
|
||||
# Apply FILTER annotation to this too !
|
||||
foreach(array_filter((array) $fields) as $item) {
|
||||
if ( $relation = $this->entityResolver->searchFieldAnnotation($item, [ Attribute\Property\Relation::class ]) ) {
|
||||
if ( $relation = $this->entityResolver->searchFieldAnnotation($item, [ Relation::class ]) ) {
|
||||
$alias = $relation->alias ?? $item;
|
||||
|
||||
if ( $relation->isManyToMany() ) {
|
||||
@@ -745,11 +747,11 @@ class Repository
|
||||
|
||||
# $relation->isManyToMany() and $repository->selectJsonEntity($relation->bridge, $relation->bridgeField, true);
|
||||
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Attribute\Property\Where::class ]) as $condition) {
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Where::class ]) as $condition) {
|
||||
$repository->where(is_object($condition->field) ? $condition->field : $entity::field($condition->field), $condition->getValue(), $condition->operator);
|
||||
}
|
||||
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Attribute\Property\Having::class ] ) as $condition) {
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, [ Having::class ] ) as $condition) {
|
||||
$repository->having(is_object($condition->field) ? $condition->field : $entity::field($condition->field), $condition->getValue(), $condition->operator);
|
||||
}
|
||||
|
||||
@@ -766,7 +768,7 @@ class Repository
|
||||
$this->select("(" . $r = Common\Sql::raw($repository->queryBuilder->render() . ") as $item\$collection"));
|
||||
}
|
||||
else {
|
||||
throw new \Exception("You referenced field `$item` which do not exist or do not contain a valid @Join annotation.");
|
||||
throw new \Exception("You referenced field `$item` which do not exist or do not contain a valid @Join attribute.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -776,9 +778,9 @@ class Repository
|
||||
public function loadCollectionRelation(EntityCollection $collection, array|string $fields) : void
|
||||
{
|
||||
foreach ((array)$fields as $name) {
|
||||
if (null !== ($relation = $this->entityResolver->searchFieldAnnotation($name, [ Attribute\Property\Relation::class ] ))) {
|
||||
$order = $this->entityResolver->searchFieldAnnotationList($name, [ Attribute\Property\OrderBy::class ]);
|
||||
$where = $this->entityResolver->searchFieldAnnotationList($name, [ Attribute\Property\Where::class ]);
|
||||
if (null !== ($relation = $this->entityResolver->searchFieldAnnotation($name, [ Relation::class ] ))) {
|
||||
$order = $this->entityResolver->searchFieldAnnotationList($name, [ OrderBy::class ]);
|
||||
$where = $this->entityResolver->searchFieldAnnotationList($name, [ Where::class ]);
|
||||
|
||||
$baseEntity = $relation->entity ?? $relation->bridge ?? $this->entityResolver->properties[$name]['type'];
|
||||
$baseEntityResolver = $baseEntity::resolveEntity();
|
||||
@@ -789,7 +791,7 @@ class Repository
|
||||
$repository = $baseEntity::repository();
|
||||
|
||||
foreach ($baseEntityResolver->fieldList(Common\EntityResolver::KEY_COLUMN_NAME, true) as $key => $field) {
|
||||
if (null === $baseEntityResolver->searchFieldAnnotation($field->name, [ Attribute\Property\Relation\Ignore::class ])) {
|
||||
if (null === $baseEntityResolver->searchFieldAnnotation($field->name, [ Relation\Ignore::class ])) {
|
||||
$repository->select($baseEntityResolver->entityClass::field($key));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user