Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/Service/QueryModifier/Easy/Modifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
54 changes: 1 addition & 53 deletions src/Service/Request/QueryModifier/Modifier/Base/ModifierBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
7 changes: 0 additions & 7 deletions src/Service/Request/QueryModifier/Modifier/FilterModifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -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?
*
Expand Down
22 changes: 12 additions & 10 deletions src/Service/Request/QueryModifier/Modifier/SortModifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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'])
);
}
}
}
}

Expand Down
42 changes: 20 additions & 22 deletions tests/Service/Request/QueryModifier/Modifier/SortModifierTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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(
'
<database name="modifier_test_db">
<table name="modifier_test">
<column name="name" type="VARCHAR"/>
Expand All @@ -58,15 +64,15 @@ 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()
{
$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()
Expand All @@ -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()
Expand Down Expand Up @@ -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()
Expand All @@ -134,6 +142,7 @@ public function testInexistentRelation()
]),
]));
$mc = new ModifierTestQuery();
$this->expectException(RelationNotFoundException::class);
$m->apply($mc);
$this->assertEquals([], $mc->getOrderByColumns());
}
Expand All @@ -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"
);
}
}