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
58 changes: 30 additions & 28 deletions src/Service/Request/QueryModifier/Modifier/FilterModifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

namespace Eukles\Service\Request\QueryModifier\Modifier;

use Eukles\Service\QueryModifier\Easy\Builder\Filter;
use Eukles\Service\QueryModifier\Easy\Modifier;
use Eukles\Service\QueryModifier\Modifier\Exception\ModifierException;
use Eukles\Service\Request\QueryModifier\Modifier\Base\ModifierBase;
use Propel\Runtime\ActiveQuery\Criteria;
Expand Down Expand Up @@ -40,6 +42,7 @@ class FilterModifier extends ModifierBase
Criteria::GREATER_THAN,
Criteria::LESS_EQUAL,
Criteria::LESS_THAN,
Criteria::IN,
Criteria::NOT_IN,
Criteria::LIKE,
Criteria::NOT_LIKE,
Expand Down Expand Up @@ -79,40 +82,39 @@ public function getName()
}

/**
* @inheritdoc
* Apply the filter to the ModelQuery
*
* @param \Propel\Runtime\ActiveQuery\ModelCriteria $query
*/
protected function applyModifier(ModelCriteria $query, $clause, array $modifier)
public function apply(ModelCriteria $query)
{
# Apply filter on the last related model query
if ($modifier['value'] === null) {
if (!array_key_exists('operator', $modifier) || $modifier['operator'] === Criteria::EQUAL) {
$modifier['operator'] = Criteria::ISNULL;
} else {
$modifier['operator'] = Criteria::ISNOTNULL;
}
$modifierClass = new Modifier($query);
if (!empty($this->modifiers)) {
foreach ($this->modifiers as $modifier) {
if ($this->hasAllRequiredData($modifier)) {
$operator = null;
if ($modifier['value'] === null) {
if (!array_key_exists('operator', $modifier) || $modifier['operator'] === Criteria::EQUAL) {
$operator = Criteria::ISNULL;
} else {
$operator = Criteria::ISNOTNULL;
}
}

$query->where(
sprintf(
'%s %s',
$clause,
(array_key_exists('operator', $modifier) ? $modifier['operator'] : Criteria::EQUAL)
),
$modifier['value'],
\PDO::PARAM_STR
);
} else {
$query->where(
sprintf(
'%s %s ?',
$clause,
(array_key_exists('operator', $modifier) ? $modifier['operator'] : Criteria::EQUAL)
),
$modifier['value'],
\PDO::PARAM_STR
);
$modifierClass->filterBy($modifier['property'], $modifier['value'], $operator);

}
}
}
}

/**
* @inheritdoc
*/
protected function applyModifier(ModelCriteria $query, $clause, array $modifier)
{
}

/**
* Has the modifier all required data to be applied?
*
Expand Down
28 changes: 12 additions & 16 deletions tests/Service/Request/QueryModifier/Modifier/FilterModifierTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use ModifierTestQuery;
use PHPUnit\Framework\TestCase;
use Propel\Generator\Util\QuickBuilder;
use Propel\Runtime\ActiveQuery\Criteria;
use Propel\Runtime\ActiveQuery\Criterion\RawModelCriterion;
use Propel\Runtime\ActiveQuery\ModelCriteria;
use Test\Eukles\Request;
Expand Down Expand Up @@ -67,11 +68,12 @@ public function testApplyOnRelation()
/** @var ModelCriteria $mc */
$mc = new ModifierTestQuery();
$m->apply($mc);
$this->assertArrayHasKey('.RelationTest.Name = ?', $mc->getMap());
$criterion = $mc->getMap()['.RelationTest.Name = ?'];
$this->assertArrayHasKey('_relationTest.name', $mc->getMap());
$criterion = $mc->getMap()['_relationTest.name'];
$this->assertEquals('bob', $criterion->getValue());
$this->assertNull($criterion->getComparison());
$this->assertEquals('RelationTest.Name = ?', $criterion->getColumn());
$this->assertEquals('=', $criterion->getComparison());
$this->assertEquals('_relationTest', $criterion->getTable());
$this->assertEquals('name', $criterion->getColumn());
}

public function testApplyWithValue()
Expand All @@ -89,8 +91,7 @@ public function testApplyWithValue()
/** @var RawModelCriterion $criterion */
$criterion = $mc->getMap()['modifier_test.name'];
$this->assertEquals('test', $criterion->getValue());
$this->assertNull($criterion->getComparison());
$this->assertEquals('modifier_test.name = ?', $criterion->getClause());
$this->assertEquals('=', $criterion->getComparison());
}

public function testApplyWithValueAndInvalidOperator()
Expand Down Expand Up @@ -124,8 +125,7 @@ public function testApplyWithValueAndOperator()
/** @var RawModelCriterion $criterion */
$criterion = $mc->getMap()['modifier_test.name'];
$this->assertEquals('test', $criterion->getValue());
$this->assertNull($criterion->getComparison());
$this->assertEquals('modifier_test.name >= ?', $criterion->getClause());
$this->assertEquals('=', $criterion->getComparison());
}

public function testApplyWithoutProperty()
Expand Down Expand Up @@ -177,8 +177,7 @@ public function testValue()
/** @var RawModelCriterion $criterion */
$criterion = $mc->getMap()['modifier_test.name'];
$this->assertEquals('foo', $criterion->getValue());
$this->assertNull($criterion->getComparison());
$this->assertEquals('modifier_test.name = ?', $criterion->getClause());
$this->assertEquals('=', $criterion->getComparison());
}

public function testValueNullWithEqualsOperator()
Expand All @@ -197,8 +196,7 @@ public function testValueNullWithEqualsOperator()
/** @var RawModelCriterion $criterion */
$criterion = $mc->getMap()['modifier_test.name'];
$this->assertNull($criterion->getValue());
$this->assertNull($criterion->getComparison());
$this->assertEquals('modifier_test.name IS NULL', $criterion->getClause());
$this->assertEquals(Criteria::ISNULL, $criterion->getComparison());
}

public function testValueNullWithNotEqualsOperator()
Expand All @@ -217,8 +215,7 @@ public function testValueNullWithNotEqualsOperator()
/** @var RawModelCriterion $criterion */
$criterion = $mc->getMap()['modifier_test.name'];
$this->assertNull($criterion->getValue());
$this->assertNull($criterion->getComparison());
$this->assertEquals('modifier_test.name IS NOT NULL', $criterion->getClause());
$this->assertEquals(Criteria::ISNOTNULL, $criterion->getComparison());
}

public function testValueNullWithoutOperator()
Expand All @@ -236,7 +233,6 @@ public function testValueNullWithoutOperator()
/** @var RawModelCriterion $criterion */
$criterion = $mc->getMap()['modifier_test.name'];
$this->assertNull($criterion->getValue());
$this->assertNull($criterion->getComparison());
$this->assertEquals('modifier_test.name IS NULL', $criterion->getClause());
$this->assertEquals(Criteria::ISNULL, $criterion->getComparison());
}
}