From 0f08d792433a596ae1ea63d8da8714be3c4b06f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Mon, 19 Dec 2022 19:13:19 +0100 Subject: [PATCH] Fix Field to SQL convert when materialized field is available --- src/Model/AggregateModel.php | 8 +++++- src/Model/EntityFieldPair.php | 3 +++ src/Persistence/Sql/MaterializedField.php | 30 +++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/Persistence/Sql/MaterializedField.php diff --git a/src/Model/AggregateModel.php b/src/Model/AggregateModel.php index f8e9117e16..a565d6c4a9 100644 --- a/src/Model/AggregateModel.php +++ b/src/Model/AggregateModel.php @@ -10,6 +10,7 @@ use Atk4\Data\Model; use Atk4\Data\Persistence; use Atk4\Data\Persistence\Sql\Expression; +use Atk4\Data\Persistence\Sql\MaterializedField; use Atk4\Data\Persistence\Sql\Query; /** @@ -90,6 +91,11 @@ public function setGroupBy(array $fields, array $aggregateExpressions = []) $seed['expr'] = $this->table->expr($seed['expr'], $exprArgs); + // convert base model fields to aliases, they are always already materialized as the base model is SQL inner table + foreach ($seed['expr']->args['custom'] as $argK => $argV) { + $seed['expr']->args['custom'][$argK] = new MaterializedField($this->table, $argV); + } + $this->addExpression($name, $seed); } @@ -160,7 +166,7 @@ protected function initQueryGrouping(Query $query): void if ($field instanceof Expression) { $expression = $field; } else { - $expression = $this->table->getField($field)->shortName /* TODO shortName should be used by DSQL automatically when in GROUP BY, HAVING, ... */; + $expression = new MaterializedField($this->table, $this->table->getField($field)); /* TODO shortName should be used by DSQL automatically when in GROUP BY, HAVING, ... */; } $query->group($expression); diff --git a/src/Model/EntityFieldPair.php b/src/Model/EntityFieldPair.php index 6765209e48..0a12b8ef0d 100644 --- a/src/Model/EntityFieldPair.php +++ b/src/Model/EntityFieldPair.php @@ -4,6 +4,7 @@ namespace Atk4\Data\Model; +use Atk4\Core\WarnDynamicPropertyTrait; use Atk4\Data\Field; use Atk4\Data\Model; @@ -13,6 +14,8 @@ */ class EntityFieldPair { + use WarnDynamicPropertyTrait; + /** @var TModel */ private $entity; /** @var string */ diff --git a/src/Persistence/Sql/MaterializedField.php b/src/Persistence/Sql/MaterializedField.php new file mode 100644 index 0000000000..6d6153951f --- /dev/null +++ b/src/Persistence/Sql/MaterializedField.php @@ -0,0 +1,30 @@ +getOwner()->assertIsModel($context); + + $this->field = $field; + } + + public function getDsqlExpression(Expression $expression): Expression + { + return $expression->expr('{}', [$this->field->shortName]); + } +}