Skip to content

Commit

Permalink
CQL does not support aliases or parenthesis predicate sets
Browse files Browse the repository at this point in the history
  • Loading branch information
TomK committed Jan 22, 2015
1 parent 1c099ec commit 9182db9
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 5 deletions.
38 changes: 37 additions & 1 deletion src/Assembler/CQL/CqlAssembler.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,28 @@
use Packaged\QueryBuilder\Predicate\LessThanOrEqualPredicate;
use Packaged\QueryBuilder\Predicate\PredicateSet;
use Packaged\QueryBuilder\SelectExpression\AllSelectExpression;
use Packaged\QueryBuilder\SelectExpression\FieldSelectExpression;

class CqlAssembler extends QueryAssembler
{
public function assembleSegment($segment)
{
if($segment instanceof FieldExpression)
if($segment instanceof FieldSelectExpression)
{
return $this->assembleFieldSelect($segment);
}
elseif($segment instanceof FieldExpression)
{
return $this->assembleField($segment);
}
else if($segment instanceof TableExpression)
{
return $this->assembleTableExpression($segment);
}
else if($segment instanceof PredicateSet)
{
return $this->assemblePredicateSet($segment);
}
else if($segment instanceof AllowFilteringClause)
{
return 'ALLOW FILTERING';
Expand Down Expand Up @@ -58,6 +67,33 @@ public function assembleField(FieldExpression $field)
}
}

public function assemblePredicateSet(PredicateSet $predicate)
{
if(!$predicate->hasPredicates())
{
return '';
}

$predicates = $predicate->getPredicates();
foreach($predicates as $p)
{
if($p instanceof PredicateSet)
{
throw new \Exception('Cannot have multiple predicate sets in CQL');
}
}

return implode(
$predicate->getGlue(),
$this->assembleSegments($predicates)
);
}

public function assembleFieldSelect(FieldSelectExpression $field)
{
return '"' . $field->getField()->getField() . '"';
}

public function assembleTableExpression(TableExpression $expr)
{
return '"' . $expr->getTableName() . '"';
Expand Down
41 changes: 37 additions & 4 deletions tests/Assembler/CQL/CqlAssemblerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@
namespace Packaged\Tests\QueryBuilder\Assembler\CQL;

use Packaged\QueryBuilder\Assembler\CQL\CqlAssembler;
use Packaged\QueryBuilder\Clause\WhereClause;
use Packaged\QueryBuilder\Expression\FieldExpression;
use Packaged\QueryBuilder\Expression\NumericExpression;
use Packaged\QueryBuilder\Expression\StringExpression;
use Packaged\QueryBuilder\Expression\TableExpression;
use Packaged\QueryBuilder\Predicate\BetweenPredicate;
use Packaged\QueryBuilder\Predicate\PredicateSet;
use Packaged\QueryBuilder\SelectExpression\AllSelectExpression;
use Packaged\QueryBuilder\SelectExpression\FieldSelectExpression;

class CqlAssemblerTest extends \PHPUnit_Framework_TestCase
{
Expand All @@ -16,31 +19,31 @@ public function testBetween()
$predicate = new BetweenPredicate();
$predicate->setField('field');
$this->assertEquals(
'("field" >= NULL AND "field" <= NULL)',
'"field" >= NULL AND "field" <= NULL',
CqlAssembler::stringify($predicate)
);
$predicate->setValues(
(new NumericExpression())->setValue(1),
(new NumericExpression())->setValue(5)
);
$this->assertEquals(
'("field" >= 1 AND "field" <= 5)',
'"field" >= 1 AND "field" <= 5',
CqlAssembler::stringify($predicate)
);
$predicate->setValues(
(new NumericExpression())->setValue('1'),
(new NumericExpression())->setValue('5')
);
$this->assertEquals(
'("field" >= 1 AND "field" <= 5)',
'"field" >= 1 AND "field" <= 5',
CqlAssembler::stringify($predicate)
);
$predicate->setValues(
(new StringExpression())->setValue('abc'),
(new StringExpression())->setValue('def')
);
$this->assertEquals(
'("field" >= \'abc\' AND "field" <= \'def\')',
'"field" >= \'abc\' AND "field" <= \'def\'',
CqlAssembler::stringify($predicate)
);
}
Expand All @@ -63,6 +66,36 @@ public function testTableName()
);
}

public function testAliasField()
{
$this->assertEquals(
'"myfield"',
CqlAssembler::stringify(
FieldSelectExpression::create('myfield')->setAlias('alias')
)
);
}

/**
* @expectedException \Exception
* @expectedExceptionMessage Cannot have multiple predicate sets in CQL
*/
public function testMultiplePredicates()
{
$where = WhereClause::create();
$set = new PredicateSet();
$set->addPredicate(new PredicateSet());
$where->addPredicate($set);
CqlAssembler::stringify($where);
}

public function testNoPredicates()
{
$where = WhereClause::create();
$where->addPredicate(new PredicateSet());
$this->assertEquals('WHERE ', CqlAssembler::stringify($where));
}

public function testTableExpression()
{
$this->assertEquals(
Expand Down

0 comments on commit 9182db9

Please sign in to comment.