diff --git a/src/Service/Request/QueryModifier/Modifier/FilterModifier.php b/src/Service/Request/QueryModifier/Modifier/FilterModifier.php index c54dd84..ab0e3f5 100644 --- a/src/Service/Request/QueryModifier/Modifier/FilterModifier.php +++ b/src/Service/Request/QueryModifier/Modifier/FilterModifier.php @@ -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; @@ -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, @@ -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? * diff --git a/tests/Service/Request/QueryModifier/Modifier/FilterModifierTest.php b/tests/Service/Request/QueryModifier/Modifier/FilterModifierTest.php index 140d55c..04002fd 100644 --- a/tests/Service/Request/QueryModifier/Modifier/FilterModifierTest.php +++ b/tests/Service/Request/QueryModifier/Modifier/FilterModifierTest.php @@ -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; @@ -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() @@ -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() @@ -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() @@ -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() @@ -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() @@ -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() @@ -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()); } }