Skip to content

Commit

Permalink
Add SQLite Greatest and Least functions
Browse files Browse the repository at this point in the history
GREATEST(2,3) -> MAX(2,3)
LEAST(2,3) -> MIN(2,3)
  • Loading branch information
chvonrohr authored and stevelacey committed Jan 29, 2019
1 parent 469f653 commit 38bbac0
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 0 deletions.
2 changes: 2 additions & 0 deletions config/sqlite.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,10 @@ doctrine:
# field: DoctrineExtensions\Query\Sqlite\Field
# find_in_set: DoctrineExtensions\Query\Sqlite\FindInSet
# group_concat: DoctrineExtensions\Query\Sqlite\GroupConcat
greatest: DoctrineExtensions\Query\Sqlite\Greatest
ifelse: DoctrineExtensions\Query\Sqlite\IfElse
ifnull: DoctrineExtensions\Query\Sqlite\IfNull
least: DoctrineExtensions\Query\Sqlite\Least
# match: DoctrineExtensions\Query\Sqlite\MatchAgainst
# md5: DoctrineExtensions\Query\Sqlite\Md5
# nullif: DoctrineExtensions\Query\Sqlite\NullIf
Expand Down
66 changes: 66 additions & 0 deletions src/Query/Sqlite/Greatest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

namespace DoctrineExtensions\Query\Sqlite;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

/**
* Class Greatest
* @package DoctrineExtensions\Query\Mysql
*
* @author Vas N <phpvas@gmail.com>
* @author Guven Atbakan <guven@atbakan.com>
*/
class Greatest extends FunctionNode
{
private $field = null;

private $values = [];

/**
* @param Parser $parser
*/
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->field = $parser->ArithmeticExpression();
$lexer = $parser->getLexer();

while (count($this->values) < 1 ||
$lexer->lookahead['type'] != Lexer::T_CLOSE_PARENTHESIS) {
$parser->match(Lexer::T_COMMA);
$this->values[] = $parser->ArithmeticExpression();
}

$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}

/**
* @param SqlWalker $sqlWalker
* @return string
*/
public function getSql(SqlWalker $sqlWalker)
{
$query = 'MAX(';

$query .= $this->field->dispatch($sqlWalker);

$query .= ', ';

for ($i = 0; $i < count($this->values); $i++) {
if ($i > 0) {
$query .= ', ';
}

$query .= $this->values[$i]->dispatch($sqlWalker);
}

$query .= ')';

return $query;
}
}
65 changes: 65 additions & 0 deletions src/Query/Sqlite/Least.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

namespace DoctrineExtensions\Query\Sqlite;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

/**
* Class Least
* @package DoctrineExtensions\Query\Mysql
*
* @author Vas N <phpvas@gmail.com>
*/
class Least extends FunctionNode
{
private $field = null;

private $values = [];

/**
* @param Parser $parser
*/
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->field = $parser->ArithmeticExpression();
$lexer = $parser->getLexer();

while (count($this->values) < 1 ||
$lexer->lookahead['type'] != Lexer::T_CLOSE_PARENTHESIS) {
$parser->match(Lexer::T_COMMA);
$this->values[] = $parser->ArithmeticExpression();
}

$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}

/**
* @param SqlWalker $sqlWalker
* @return string
*/
public function getSql(SqlWalker $sqlWalker)
{
$query = 'MIN(';

$query .= $this->field->dispatch($sqlWalker);

$query .= ', ';

for ($i = 0; $i < count($this->values); $i++) {
if ($i > 0) {
$query .= ', ';
}

$query .= $this->values[$i]->dispatch($sqlWalker);
}

$query .= ')';

return $query;
}
}
16 changes: 16 additions & 0 deletions tests/Query/Sqlite/GreatestTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace DoctrineExtensions\Tests\Query\Sqlite;

use DoctrineExtensions\Tests\Query\SqliteTestCase;

class GreatestTest extends SqliteTestCase
{
public function testGreatest()
{
$this->assertDqlProducesSql(
"SELECT Greatest(2, 3) from DoctrineExtensions\Tests\Entities\Blank b",
'SELECT MAX(2, 3) AS sclr_0 FROM Blank b0_'
);
}
}
16 changes: 16 additions & 0 deletions tests/Query/Sqlite/LeastTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace DoctrineExtensions\Tests\Query\Sqlite;

use DoctrineExtensions\Tests\Query\SqliteTestCase;

class LeastTest extends SqliteTestCase
{
public function testLeast()
{
$this->assertDqlProducesSql(
"SELECT LEAST(2, 3) from DoctrineExtensions\Tests\Entities\Blank b",
'SELECT MIN(2, 3) AS sclr_0 FROM Blank b0_'
);
}
}

0 comments on commit 38bbac0

Please sign in to comment.