Skip to content

Commit

Permalink
Support Select Distinct
Browse files Browse the repository at this point in the history
  • Loading branch information
bajb committed Oct 7, 2014
1 parent f43ceea commit 53890d1
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 2 deletions.
10 changes: 10 additions & 0 deletions src/Builder/QueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,14 @@ public static function select()
$statement->addClause($select);
return $statement;
}

public static function selectDistinct()
{
$select = new SelectClause();
$select->setDistinct(true);
$select->addFields(func_get_args());
$statement = new QueryStatement();
$statement->addClause($select);
return $statement;
}
}
17 changes: 15 additions & 2 deletions src/Clause/SelectClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@
class SelectClause implements IClause
{
protected $_expressions = [];
protected $_distinct = false;

public function setDistinct($distinct = true)
{
$this->_distinct = $distinct;
return $this;
}

public function isDistinct()
{
return (bool)$this->_distinct;
}

public function addExpression(ISelectExpression $expression)
{
Expand Down Expand Up @@ -47,12 +59,13 @@ public function hasExpressions()
*/
public function assemble()
{
$return = $this->getAction() . ($this->isDistinct() ? ' DISTINCT' : '');
if(!$this->hasExpressions())
{
return $this->getAction() . ' *';
return $return . ' *';
}

return $this->getAction() . ' '
return $return . ' '
. implode(', ', mpull($this->getExpressions(), 'assemble'));
}

Expand Down
10 changes: 10 additions & 0 deletions tests/Builder/Expect/QueryBuilderSelectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ public function testSelect()
);
}

public function testSelectDistinct()
{
$query = QueryBuilder::selectDistinct('field', 'field2');

$this->assertEquals(
'SELECT DISTINCT field, field2',
$query->assemble()
);
}

public function testFrom()
{
$query = QueryBuilder::select('field', 'field2');
Expand Down
5 changes: 5 additions & 0 deletions tests/Clause/SelectClauseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public function testAssemble()
$clause->assemble()
);

$clause->clearExpressions();
$clause->addField('first');
$clause->setDistinct(true);
$this->assertEquals('SELECT DISTINCT first', $clause->assemble());

$this->setExpectedException("InvalidArgumentException");
$clause->addField(new \stdClass());
}
Expand Down

0 comments on commit 53890d1

Please sign in to comment.