Skip to content

Commit

Permalink
LikePredicate only supports specific Expression types. Add NotLikePre…
Browse files Browse the repository at this point in the history
…dicate
  • Loading branch information
Tom Kay committed Jan 6, 2015
1 parent 636d908 commit 28bcbfd
Show file tree
Hide file tree
Showing 11 changed files with 168 additions and 16 deletions.
10 changes: 10 additions & 0 deletions src/Expression/Like/ContainsExpression.php
@@ -0,0 +1,10 @@
<?php
namespace Packaged\QueryBuilder\Expression\Like;

class ContainsExpression extends CustomLikeExpression
{
public function getValue()
{
return '%' . parent::getValue() . '%';
}
}
9 changes: 9 additions & 0 deletions src/Expression/Like/CustomLikeExpression.php
@@ -0,0 +1,9 @@
<?php
namespace Packaged\QueryBuilder\Expression\Like;

use Packaged\QueryBuilder\Expression\StringExpression;

class CustomLikeExpression extends StringExpression
{

}
10 changes: 10 additions & 0 deletions src/Expression/Like/EndsWithExpression.php
@@ -0,0 +1,10 @@
<?php
namespace Packaged\QueryBuilder\Expression\Like;

class EndsWithExpression extends CustomLikeExpression
{
public function getValue()
{
return parent::getValue() . '%';
}
}
10 changes: 10 additions & 0 deletions src/Expression/Like/StartsWithExpression.php
@@ -0,0 +1,10 @@
<?php
namespace Packaged\QueryBuilder\Expression\Like;

class StartsWithExpression extends CustomLikeExpression
{
public function getValue()
{
return '%' . parent::getValue();
}
}
13 changes: 13 additions & 0 deletions src/Predicate/LikePredicate.php
@@ -1,6 +1,9 @@
<?php
namespace Packaged\QueryBuilder\Predicate;

use Packaged\QueryBuilder\Expression\IExpression;
use Packaged\QueryBuilder\Expression\Like\CustomLikeExpression;

class LikePredicate extends AbstractOperatorPredicate
{
/**
Expand All @@ -11,4 +14,14 @@ public function getOperator()
{
return 'LIKE';
}

public function setExpression(IExpression $value)
{
if(!($value instanceof CustomLikeExpression))
{
throw new \Exception('Invalid Expression Type');
}
$this->_value = $value;
return $this;
}
}
10 changes: 10 additions & 0 deletions src/Predicate/NotLikePredicate.php
@@ -0,0 +1,10 @@
<?php
namespace Packaged\QueryBuilder\Predicate;

class NotLikePredicate extends LikePredicate
{
public function getOperator()
{
return 'NOT LIKE';
}
}
42 changes: 31 additions & 11 deletions tests/Predicate/LikePredicateTest.php
Expand Up @@ -2,9 +2,12 @@
namespace Packaged\Tests\QueryBuilder\Predicate;

use Packaged\QueryBuilder\Assembler\QueryAssembler;
use Packaged\QueryBuilder\Predicate\LikePredicate;
use Packaged\QueryBuilder\Expression\NumericExpression;
use Packaged\QueryBuilder\Expression\Like\ContainsExpression;
use Packaged\QueryBuilder\Expression\Like\CustomLikeExpression;
use Packaged\QueryBuilder\Expression\Like\EndsWithExpression;
use Packaged\QueryBuilder\Expression\Like\StartsWithExpression;
use Packaged\QueryBuilder\Expression\StringExpression;
use Packaged\QueryBuilder\Predicate\LikePredicate;

class LikePredicateTest extends \PHPUnit_Framework_TestCase
{
Expand All @@ -16,34 +19,51 @@ public function testAssemble()
'field LIKE NULL',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression((new NumericExpression())->setValue(1));
$this->assertEquals('field LIKE 1', QueryAssembler::stringify($predicate));
$predicate->setExpression((new NumericExpression())->setValue('1'));
$this->assertEquals('field LIKE 1', QueryAssembler::stringify($predicate));
$predicate->setExpression((new StringExpression())->setValue('abc'));
$predicate->setExpression(CustomLikeExpression::create(1));
$this->assertEquals(
'field LIKE "1"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(CustomLikeExpression::create('1'));
$this->assertEquals(
'field LIKE "1"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(CustomLikeExpression::create('abc'));
$this->assertEquals(
'field LIKE "abc"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression((new StringExpression())->setValue('abc%'));
$predicate->setExpression(EndsWithExpression::create('abc'));
$this->assertEquals(
'field LIKE "abc%"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression((new StringExpression())->setValue('%abc%'));
$predicate->setExpression(ContainsExpression::create('abc'));
$this->assertEquals(
'field LIKE "%abc%"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression((new StringExpression())->setValue('%abc'));
$predicate->setExpression(StartsWithExpression::create('abc'));
$this->assertEquals(
'field LIKE "%abc"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression((new StringExpression())->setValue('a%bc'));
$predicate->setExpression(CustomLikeExpression::create('a%bc'));
$this->assertEquals(
'field LIKE "a%bc"',
QueryAssembler::stringify($predicate)
);
}

/**
* @expectedException \Exception
* @expectedExceptionMessage Invalid Expression Type
*/
public function testInvalidExpression()
{
$predicate = new LikePredicate();
$predicate->setField('field');
$predicate->setExpression(StringExpression::create('a%bc'));
}
}
69 changes: 69 additions & 0 deletions tests/Predicate/NotLikePredicateTest.php
@@ -0,0 +1,69 @@
<?php
namespace Packaged\Tests\QueryBuilder\Predicate;

use Packaged\QueryBuilder\Assembler\QueryAssembler;
use Packaged\QueryBuilder\Expression\Like\ContainsExpression;
use Packaged\QueryBuilder\Expression\Like\CustomLikeExpression;
use Packaged\QueryBuilder\Expression\Like\EndsWithExpression;
use Packaged\QueryBuilder\Expression\Like\StartsWithExpression;
use Packaged\QueryBuilder\Expression\StringExpression;
use Packaged\QueryBuilder\Predicate\NotLikePredicate;

class NotLikePredicateTest extends \PHPUnit_Framework_TestCase
{
public function testAssemble()
{
$predicate = new NotLikePredicate();
$predicate->setField('field');
$this->assertEquals(
'field NOT LIKE NULL',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(CustomLikeExpression::create(1));
$this->assertEquals(
'field NOT LIKE "1"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(CustomLikeExpression::create('1'));
$this->assertEquals(
'field NOT LIKE "1"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(CustomLikeExpression::create('abc'));
$this->assertEquals(
'field NOT LIKE "abc"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(EndsWithExpression::create('abc'));
$this->assertEquals(
'field NOT LIKE "abc%"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(ContainsExpression::create('abc'));
$this->assertEquals(
'field NOT LIKE "%abc%"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(StartsWithExpression::create('abc'));
$this->assertEquals(
'field NOT LIKE "%abc"',
QueryAssembler::stringify($predicate)
);
$predicate->setExpression(CustomLikeExpression::create('a%bc'));
$this->assertEquals(
'field NOT LIKE "a%bc"',
QueryAssembler::stringify($predicate)
);
}

/**
* @expectedException \Exception
* @expectedExceptionMessage Invalid Expression Type
*/
public function testInvalidExpression()
{
$predicate = new NotLikePredicate();
$predicate->setField('field');
$predicate->setExpression(StringExpression::create('a%bc'));
}
}
4 changes: 2 additions & 2 deletions tests/Statement/DeleteStatementTest.php
Expand Up @@ -4,7 +4,7 @@
use Packaged\QueryBuilder\Assembler\QueryAssembler;
use Packaged\QueryBuilder\Clause\DeleteClause;
use Packaged\QueryBuilder\Clause\WhereClause;
use Packaged\QueryBuilder\Expression\StringExpression;
use Packaged\QueryBuilder\Expression\Like\EndsWithExpression;
use Packaged\QueryBuilder\Predicate\LikePredicate;
use Packaged\QueryBuilder\Predicate\NotEqualPredicate;
use Packaged\QueryBuilder\Statement\DeleteStatement;
Expand Down Expand Up @@ -33,7 +33,7 @@ public function testAssemble()

$where->addPredicate(
(new LikePredicate())->setField('name')->setExpression(
(new StringExpression())->setValue('Joh%')
EndsWithExpression::create('Joh')
)
);
$this->assertEquals(
Expand Down
4 changes: 2 additions & 2 deletions tests/Statement/QueryStatementTest.php
Expand Up @@ -10,8 +10,8 @@
use Packaged\QueryBuilder\Clause\SelectClause;
use Packaged\QueryBuilder\Clause\WhereClause;
use Packaged\QueryBuilder\Expression\FieldExpression;
use Packaged\QueryBuilder\Expression\Like\EndsWithExpression;
use Packaged\QueryBuilder\Expression\NumericExpression;
use Packaged\QueryBuilder\Expression\StringExpression;
use Packaged\QueryBuilder\Predicate\LessThanPredicate;
use Packaged\QueryBuilder\Predicate\LikePredicate;
use Packaged\QueryBuilder\Predicate\NotEqualPredicate;
Expand Down Expand Up @@ -47,7 +47,7 @@ public function testAssemble()

$where->addPredicate(
(new LikePredicate())->setField('name')->setExpression(
(new StringExpression())->setValue('Joh%')
EndsWithExpression::create('Joh')
)
);
$this->assertEquals(
Expand Down
3 changes: 2 additions & 1 deletion tests/Statement/UpdateStatementTest.php
Expand Up @@ -5,6 +5,7 @@
use Packaged\QueryBuilder\Clause\SetClause;
use Packaged\QueryBuilder\Clause\UpdateClause;
use Packaged\QueryBuilder\Clause\WhereClause;
use Packaged\QueryBuilder\Expression\Like\EndsWithExpression;
use Packaged\QueryBuilder\Expression\StringExpression;
use Packaged\QueryBuilder\Expression\TableExpression;
use Packaged\QueryBuilder\Predicate\EqualPredicate;
Expand Down Expand Up @@ -41,7 +42,7 @@ public function testAssemble()

$where->addPredicate(
(new LikePredicate())->setField('name')->setExpression(
(new StringExpression())->setValue('Joh%')
EndsWithExpression::create('Joh')
)
);
$this->assertEquals(
Expand Down

0 comments on commit 28bcbfd

Please sign in to comment.