From 9e228b831f9f04b473b42aab3d11f548edfca66e Mon Sep 17 00:00:00 2001 From: I3ekka Date: Tue, 10 Oct 2017 19:40:29 +0200 Subject: [PATCH 1/4] Added unit test for adding invokables as where condition --- test/Sql/DeleteTest.php | 20 ++++++++++++++++++++ test/Sql/SelectTest.php | 20 ++++++++++++++++++++ test/Sql/UpdateTest.php | 20 ++++++++++++++++++++ test/TestAsset/WhereInvokable.php | 27 +++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 test/TestAsset/WhereInvokable.php diff --git a/test/Sql/DeleteTest.php b/test/Sql/DeleteTest.php index 30d63757b4..f99acbe6ba 100644 --- a/test/Sql/DeleteTest.php +++ b/test/Sql/DeleteTest.php @@ -13,6 +13,7 @@ use Zend\Db\Sql\Predicate\IsNotNull; use Zend\Db\Sql\TableIdentifier; use Zend\Db\Sql\Where; +use ZendTest\Db\TestAsset\WhereInvokable; class DeleteTest extends \PHPUnit_Framework_TestCase { @@ -105,6 +106,25 @@ public function testWhere() }); } + /** + * @testdox unit test: test where will accept invokable classes + * @covers Zend\Db\Sql\Update::where + */ + public function testWhereArgumentCanBeInvokable() + { + $select = new Delete; + $select->where(new WhereInvokable('bar')); + + /** @var Where $where */ + $where = $select->getRawState('where'); + $predicates = $where->getPredicates(); + $expressionData = $predicates[0][1]->getExpressionData(); + + $this->assertEquals(1, count($predicates)); + $this->assertEquals('foo', $expressionData[0][1][0]); + $this->assertEquals('bar', $expressionData[0][1][1]); + } + /** * @covers Zend\Db\Sql\Delete::prepareStatement */ diff --git a/test/Sql/SelectTest.php b/test/Sql/SelectTest.php index 050b6a8b27..46c752da7c 100644 --- a/test/Sql/SelectTest.php +++ b/test/Sql/SelectTest.php @@ -19,6 +19,7 @@ use Zend\Db\Sql\TableIdentifier; use Zend\Db\Sql\Where; use ZendTest\Db\TestAsset\TrustingSql92Platform; +use ZendTest\Db\TestAsset\WhereInvokable; class SelectTest extends \PHPUnit_Framework_TestCase { @@ -348,6 +349,25 @@ public function testWhereArgument1IsClosure() }); } + /** + * @testdox unit test: test where will accept invokable classes + * @covers Zend\Db\Sql\Select::where + */ + public function testWhereArgumentCanBeInvokable() + { + $select = new Select; + $select->where(new WhereInvokable('bar')); + + /** @var Where $where */ + $where = $select->getRawState('where'); + $predicates = $where->getPredicates(); + $expressionData = $predicates[0][1]->getExpressionData(); + + $this->assertEquals(1, count($predicates)); + $this->assertEquals('foo', $expressionData[0][1][0]); + $this->assertEquals('bar', $expressionData[0][1][1]); + } + /** * @testdox unit test: Test where() will accept any Predicate object as-is * @covers Zend\Db\Sql\Select::where diff --git a/test/Sql/UpdateTest.php b/test/Sql/UpdateTest.php index a2e9b8a3d4..26e99af788 100644 --- a/test/Sql/UpdateTest.php +++ b/test/Sql/UpdateTest.php @@ -15,6 +15,7 @@ use Zend\Db\Sql\Expression; use Zend\Db\Sql\TableIdentifier; use ZendTest\Db\TestAsset\TrustingSql92Platform; +use ZendTest\Db\TestAsset\WhereInvokable; class UpdateTest extends \PHPUnit_Framework_TestCase { @@ -168,6 +169,25 @@ public function testGetRawState() $this->assertInstanceOf('Zend\Db\Sql\Where', $this->update->getRawState('where')); } + /** + * @testdox unit test: test where will accept invokable classes + * @covers Zend\Db\Sql\Update::where + */ + public function testWhereArgumentCanBeInvokable() + { + $select = new Update; + $select->where(new WhereInvokable('bar')); + + /** @var Where $where */ + $where = $select->getRawState('where'); + $predicates = $where->getPredicates(); + $expressionData = $predicates[0][1]->getExpressionData(); + + $this->assertEquals(1, count($predicates)); + $this->assertEquals('foo', $expressionData[0][1][0]); + $this->assertEquals('bar', $expressionData[0][1][1]); + } + /** * @covers Zend\Db\Sql\Update::prepareStatement */ diff --git a/test/TestAsset/WhereInvokable.php b/test/TestAsset/WhereInvokable.php new file mode 100644 index 0000000000..8b0f7db791 --- /dev/null +++ b/test/TestAsset/WhereInvokable.php @@ -0,0 +1,27 @@ +value = $value; + } + + public function __invoke($select) + { + /** @var Select $select */ + $select->where->addPredicate(new Like('foo', $this->value)); + } + +} \ No newline at end of file From 2a7faacce7dd7758b723646c36f590718068d4f7 Mon Sep 17 00:00:00 2001 From: I3ekka Date: Tue, 10 Oct 2017 19:40:58 +0200 Subject: [PATCH 2/4] Changed PredicateSet to allow invokables as where condition --- src/Sql/Predicate/PredicateSet.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Sql/Predicate/PredicateSet.php b/src/Sql/Predicate/PredicateSet.php index 2e06383b1f..ee5313add2 100644 --- a/src/Sql/Predicate/PredicateSet.php +++ b/src/Sql/Predicate/PredicateSet.php @@ -78,7 +78,7 @@ public function addPredicates($predicates, $combination = self::OP_AND) $this->addPredicate($predicates, $combination); return $this; } - if ($predicates instanceof \Closure) { + if ($predicates instanceof \Closure || is_callable($predicates)) { $predicates($this); return $this; } From 774e9f6dcb9760e61acb3943ca8d813262d920d9 Mon Sep 17 00:00:00 2001 From: I3ekka Date: Tue, 10 Oct 2017 20:25:42 +0200 Subject: [PATCH 3/4] Added DocBlock --- test/TestAsset/WhereInvokable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/TestAsset/WhereInvokable.php b/test/TestAsset/WhereInvokable.php index 8b0f7db791..5a332dad34 100644 --- a/test/TestAsset/WhereInvokable.php +++ b/test/TestAsset/WhereInvokable.php @@ -7,6 +7,7 @@ class WhereInvokable { + /** @var string */ private $value; /** @@ -20,7 +21,6 @@ public function __construct($value) public function __invoke($select) { - /** @var Select $select */ $select->where->addPredicate(new Like('foo', $this->value)); } From fccc7110358358d0bf2f70d7eb075df13ccf0152 Mon Sep 17 00:00:00 2001 From: I3ekka Date: Tue, 10 Oct 2017 20:26:12 +0200 Subject: [PATCH 4/4] avoid namespace lookup for is_callable function --- src/Sql/Predicate/PredicateSet.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Sql/Predicate/PredicateSet.php b/src/Sql/Predicate/PredicateSet.php index ee5313add2..71cfe6a182 100644 --- a/src/Sql/Predicate/PredicateSet.php +++ b/src/Sql/Predicate/PredicateSet.php @@ -78,7 +78,7 @@ public function addPredicates($predicates, $combination = self::OP_AND) $this->addPredicate($predicates, $combination); return $this; } - if ($predicates instanceof \Closure || is_callable($predicates)) { + if ($predicates instanceof \Closure || \is_callable($predicates)) { $predicates($this); return $this; }