From 300b9eb443711ca90202ae7cafed8cd0b2ce92c1 Mon Sep 17 00:00:00 2001 From: Royer Date: Wed, 30 Sep 2020 15:18:45 +0200 Subject: [PATCH] fix(filterModifier): fix orderBy on relations refactor(Modifier): delete abstract method applyModifier and set apply method abstract --- src/Service/QueryModifier/Easy/Modifier.php | 7 ++- .../Modifier/Base/ModifierBase.php | 54 +------------------ .../QueryModifier/Modifier/FilterModifier.php | 7 --- .../QueryModifier/Modifier/SortModifier.php | 22 ++++---- .../Modifier/SortModifierTest.php | 42 +++++++-------- 5 files changed, 39 insertions(+), 93 deletions(-) diff --git a/src/Service/QueryModifier/Easy/Modifier.php b/src/Service/QueryModifier/Easy/Modifier.php index 186e257..1ab21a5 100644 --- a/src/Service/QueryModifier/Easy/Modifier.php +++ b/src/Service/QueryModifier/Easy/Modifier.php @@ -80,7 +80,12 @@ public function methodExists($method) public function orderBy(string $dotProperty, $order = Criteria::ASC): ModelCriteria { $property = $this->before($dotProperty); - $this->query = $this->query->orderBy($property, $order); + $method = $this->buildMethodName(__FUNCTION__, $property); + try{ + $this->query = $this->query->{$method}($order); + } catch (\Throwable $e) { + $this->failures[] = $method; + } $this->after(); return $this->query; diff --git a/src/Service/Request/QueryModifier/Modifier/Base/ModifierBase.php b/src/Service/Request/QueryModifier/Modifier/Base/ModifierBase.php index 567d7e6..c992aef 100644 --- a/src/Service/Request/QueryModifier/Modifier/Base/ModifierBase.php +++ b/src/Service/Request/QueryModifier/Modifier/Base/ModifierBase.php @@ -41,17 +41,6 @@ public function __construct(ServerRequestInterface $request) $this->setModifierFromRequest($request); } - /** - * Apply modifiers - * - * @param \Propel\Runtime\ActiveQuery\ModelCriteria $query - * @param string $clause - * @param array $modifier - * - * @return void - */ - abstract protected function applyModifier(ModelCriteria $query, $clause, array $modifier); - /** * Return the name of the modifier * @@ -73,33 +62,7 @@ abstract protected function hasAllRequiredData(array $modifier); * * @param \Propel\Runtime\ActiveQuery\ModelCriteria $query */ - public function apply(ModelCriteria $query) - { - if (!empty($this->modifiers)) { - foreach ($this->modifiers as $modifier) { - if ($this->hasAllRequiredData($modifier)) { - $modifier['property'] = str_replace('/', '.', $modifier['property']); - # Check if the filter is occurring on a related model - if (strpos($modifier['property'], '.') !== false) { - $propertyParts = explode('.', $modifier['property']); - - # The last part is the related property we want to filter with, so remove it from the parts and store into a variable - $propertyField = array_pop($propertyParts); - # The new last part is the relation name - $relationName = array_pop($propertyParts); - - # Apply the modifier - $this->applyModifier($query, $this->buildClause($propertyField, $relationName), $modifier); - } else { - # Apply the modifier - $this->applyModifier($query, - $this->buildClause($modifier['property'], $query->getModelShortName()), - $modifier); - } - } - } - } - } + abstract public function apply(ModelCriteria $query); /** * @param $property @@ -181,21 +144,6 @@ public function setModifierFromRequest(ServerRequestInterface $request) $this->modifiers = $modifiers; } - /** - * @param $property - * @param null $modelOrRelationName - * - * @return string - */ - protected function buildClause($property, $modelOrRelationName) - { - $clause = ucfirst($property); - if ($modelOrRelationName) { - $clause = sprintf('%s.%s', ucfirst($modelOrRelationName), $clause); - } - - return $clause; - } /** * @param $property diff --git a/src/Service/Request/QueryModifier/Modifier/FilterModifier.php b/src/Service/Request/QueryModifier/Modifier/FilterModifier.php index b9236a7..7c95cf0 100644 --- a/src/Service/Request/QueryModifier/Modifier/FilterModifier.php +++ b/src/Service/Request/QueryModifier/Modifier/FilterModifier.php @@ -109,13 +109,6 @@ public function apply(ModelCriteria $query) return $modifierClass; } - /** - * @inheritdoc - */ - protected function applyModifier(ModelCriteria $query, $clause, array $modifier) - { - } - /** * Has the modifier all required data to be applied? * diff --git a/src/Service/Request/QueryModifier/Modifier/SortModifier.php b/src/Service/Request/QueryModifier/Modifier/SortModifier.php index 93d0664..8a7377e 100644 --- a/src/Service/Request/QueryModifier/Modifier/SortModifier.php +++ b/src/Service/Request/QueryModifier/Modifier/SortModifier.php @@ -12,6 +12,7 @@ namespace Eukles\Service\Request\QueryModifier\Modifier; use Eukles\Service\QueryModifier\Easy\Builder\Sort; +use Eukles\Service\QueryModifier\Easy\Modifier; use Eukles\Service\Request\QueryModifier\Modifier\Base\ModifierBase; use Propel\Runtime\ActiveQuery\Criteria; use Propel\Runtime\ActiveQuery\Exception\UnknownColumnException; @@ -65,17 +66,18 @@ public function getName() return self::NAME; } - /** - * @inheritdoc - */ - protected function applyModifier(ModelCriteria $query, $clause, array $modifier) + public function apply(ModelCriteria $query) { - # Apply filter on the last related model query - try { - $query->orderBy($clause, - (empty($modifier['direction']) ? self::DEFAULT_DIRECTION : $modifier['direction'])); - } catch (UnknownColumnException $e) { - } catch (UnknownModelException $e) { + $modifierClass = new Modifier($query); + if (!empty($this->modifiers)) { + foreach ($this->modifiers as $modifier) { + if ($this->hasAllRequiredData($modifier)) { + $modifierClass->orderBy( + $modifier['property'], + (empty($modifier['direction']) ? self::DEFAULT_DIRECTION : $modifier['direction']) + ); + } + } } } diff --git a/tests/Service/Request/QueryModifier/Modifier/SortModifierTest.php b/tests/Service/Request/QueryModifier/Modifier/SortModifierTest.php index 7f252ff..23b9a3a 100644 --- a/tests/Service/Request/QueryModifier/Modifier/SortModifierTest.php +++ b/tests/Service/Request/QueryModifier/Modifier/SortModifierTest.php @@ -16,6 +16,7 @@ use ModifierTestQuery; use PHPUnit\Framework\TestCase; use Propel\Generator\Util\QuickBuilder; +use Propel\Runtime\Map\Exception\RelationNotFoundException; use Test\Eukles\Request; /** @@ -26,12 +27,17 @@ class SortModifierTest extends TestCase { + /** + * @var array to fill on the call of createSelectSql + */ + private $arr; + public function setUp() { if (!class_exists(ModifierTest::class)) { - $b = new QuickBuilder; - $b->setSchema(' + $b->setSchema( + ' @@ -58,7 +64,7 @@ public function testApplyAsc() $m = new SortModifier(new Request(["sort" => json_encode(["property" => "name", "direction" => "asc"])])); $mc = new ModifierTestQuery(); $m->apply($mc); - $this->assertEquals('modifier_test.name ASC', $mc->getOrderByColumns()[0]); + $this->assertEquals($mc->createSelectSql($this->arr), "SELECT FROM ORDER BY modifier_test.name ASC"); } public function testApplyDesc() @@ -66,7 +72,7 @@ public function testApplyDesc() $m = new SortModifier(new Request(["sort" => json_encode(["property" => "name", "direction" => "desc"])])); $mc = new ModifierTestQuery(); $m->apply($mc); - $this->assertEquals('modifier_test.name DESC', $mc->getOrderByColumns()[0]); + $this->assertEquals($mc->createSelectSql($this->arr), "SELECT FROM ORDER BY modifier_test.name DESC"); } public function testApplyMulti() @@ -80,8 +86,10 @@ public function testApplyMulti() ])); $mc = new ModifierTestQuery(); $m->apply($mc); - $this->assertEquals('modifier_test.name ASC', $mc->getOrderByColumns()[0]); - $this->assertEquals('modifier_test.column2 ASC', $mc->getOrderByColumns()[1]); + $this->assertEquals( + $mc->createSelectSql($this->arr), + "SELECT FROM ORDER BY modifier_test.name ASC,modifier_test.column2 ASC" + ); } public function testSetModifierFromRequest() @@ -116,7 +124,7 @@ public function testApplyWithoutDirectionIsDesc() $m = new SortModifier(new Request(["sort" => json_encode(["property" => "name"])])); $mc = new ModifierTestQuery(); $m->apply($mc); - $this->assertEquals('modifier_test.name DESC', $mc->getOrderByColumns()[0]); + $this->assertEquals($mc->createSelectSql($this->arr), "SELECT FROM ORDER BY modifier_test.name DESC"); } public function testGetName() @@ -134,6 +142,7 @@ public function testInexistentRelation() ]), ])); $mc = new ModifierTestQuery(); + $this->expectException(RelationNotFoundException::class); $m->apply($mc); $this->assertEquals([], $mc->getOrderByColumns()); } @@ -149,20 +158,9 @@ public function testRelation() $mc = new ModifierTestQuery(); $mc->joinWithRelationTest(); $m->apply($mc); - $this->assertEquals('relation_test.name ASC', $mc->getOrderByColumns()[0]); - } - - public function testRelationWithSlash() - { - $m = new SortModifier(new Request([ - "sort" => json_encode([ - "property" => "RelationTest/Name", - "direction" => "asc", - ]), - ])); - $mc = new ModifierTestQuery(); - $mc->joinWithRelationTest(); - $m->apply($mc); - $this->assertEquals('relation_test.name ASC', $mc->getOrderByColumns()[0]); + $this->assertEquals( + $mc->createSelectSql($this->arr), + "SELECT modifier_test.name, modifier_test.column2, modifier_test.date, modifier_test.relation_id, relation_test.name, relation_test.column2, relation_test.id FROM modifier_test INNER JOIN relation_test ON (modifier_test.relation_id=relation_test.id) INNER JOIN relation_test _RelationTest ON (modifier_test.relation_id=_RelationTest.id) ORDER BY _RelationTest.name ASC" + ); } }