From 76ef2c05a132f9f3c3a1a327b94565e2d92581da Mon Sep 17 00:00:00 2001 From: Brooke Bryan Date: Thu, 22 Jan 2015 16:28:26 +0000 Subject: [PATCH] Fix for SET Clause on null equal predicates --- src/Assembler/Segments/PredicateAssembler.php | 2 +- src/Builder/Traits/SetTrait.php | 7 +------ src/Predicate/AbstractOperatorPredicate.php | 6 ++++++ src/Predicate/EqualPredicate.php | 13 +++++++++++++ tests/Statement/UpdateStatementTest.php | 8 ++++++++ 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/Assembler/Segments/PredicateAssembler.php b/src/Assembler/Segments/PredicateAssembler.php index 2a0dd9a..7177473 100644 --- a/src/Assembler/Segments/PredicateAssembler.php +++ b/src/Assembler/Segments/PredicateAssembler.php @@ -72,7 +72,7 @@ public function assemblePredicateSet(PredicateSet $predicate) public function assembleEqualPredicate(EqualPredicate $predicate) { - if($predicate->isNullValue()) + if($predicate->isNullValue() && !$predicate->isOperatorForced()) { return $this->assembleSegment($predicate->getField()) . ' IS NULL'; } diff --git a/src/Builder/Traits/SetTrait.php b/src/Builder/Traits/SetTrait.php index 5be76b3..7fb070b 100644 --- a/src/Builder/Traits/SetTrait.php +++ b/src/Builder/Traits/SetTrait.php @@ -2,7 +2,6 @@ namespace Packaged\QueryBuilder\Builder\Traits; use Packaged\QueryBuilder\Clause\SetClause; -use Packaged\QueryBuilder\Expression\ValueExpression; use Packaged\QueryBuilder\Predicate\EqualPredicate; use Packaged\QueryBuilder\Statement\IStatement; @@ -21,11 +20,7 @@ public function set($field, $value) $this->addClause($set); } - $set->addPredicate( - (new EqualPredicate())->setField($field)->setExpression( - ValueExpression::create($value) - ) - ); + $set->addPredicate(EqualPredicate::create($field, $value)->forceOperator()); return $this; } diff --git a/src/Predicate/AbstractOperatorPredicate.php b/src/Predicate/AbstractOperatorPredicate.php index 23e7407..a7150a6 100644 --- a/src/Predicate/AbstractOperatorPredicate.php +++ b/src/Predicate/AbstractOperatorPredicate.php @@ -22,6 +22,12 @@ abstract class AbstractOperatorPredicate implements IPredicate */ abstract public function getOperator(); + /** + * @param $field + * @param $value + * + * @return static + */ public static function create($field, $value) { $predicate = new static; diff --git a/src/Predicate/EqualPredicate.php b/src/Predicate/EqualPredicate.php index 559ea61..03fc308 100644 --- a/src/Predicate/EqualPredicate.php +++ b/src/Predicate/EqualPredicate.php @@ -3,6 +3,8 @@ class EqualPredicate extends AbstractOperatorPredicate { + protected $_forceOperator = false; + /** * Operator e.g. =, >= > * @return string @@ -11,4 +13,15 @@ public function getOperator() { return '='; } + + public function forceOperator($forced = true) + { + $this->_forceOperator = $forced; + return $this; + } + + public function isOperatorForced() + { + return $this->_forceOperator; + } } diff --git a/tests/Statement/UpdateStatementTest.php b/tests/Statement/UpdateStatementTest.php index d535786..65d2681 100644 --- a/tests/Statement/UpdateStatementTest.php +++ b/tests/Statement/UpdateStatementTest.php @@ -29,6 +29,7 @@ public function testAssemble() ); $statement->set('username', 'john'); + $statement->andWhere( (new LikePredicate())->setField('name')->setExpression( EndsWithExpression::create('Joh') @@ -39,5 +40,12 @@ public function testAssemble() . 'WHERE username IS NOT NULL AND name LIKE "Joh%"', QueryAssembler::stringify($statement) ); + + $statement->set('bob', null); + $this->assertEquals( + 'UPDATE tbl SET username = "john", bob = NULL ' + . 'WHERE username IS NOT NULL AND name LIKE "Joh%"', + QueryAssembler::stringify($statement) + ); } }