Skip to content

Commit

Permalink
Optional second parameter (fmt) for Oracle TRUNC function + test. (#301)
Browse files Browse the repository at this point in the history
Oracle TRUNC function fmt parameter is optional
  • Loading branch information
nitso authored and stevelacey committed Sep 26, 2018
1 parent 1d02c58 commit 469f653
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
26 changes: 23 additions & 3 deletions src/Query/Oracle/Trunc.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,53 @@
namespace DoctrineExtensions\Query\Oracle;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\AST\Node;
use Doctrine\ORM\Query\Lexer;

/**
* @author Mohammad ZeinEddin <mohammad@zeineddin.name>
*/
class Trunc extends FunctionNode
{
/**
* @var Node
*/
private $date;

/**
* @var Node
*/
private $fmt;

public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return sprintf(
if ($this->fmt) {
return sprintf(
'TRUNC(%s, %s)',
$sqlWalker->walkArithmeticPrimary($this->date),
$sqlWalker->walkArithmeticPrimary($this->fmt)
);
}

return sprintf(
'TRUNC(%s)',
$sqlWalker->walkArithmeticPrimary($this->date)
);
}

public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$lexer = $parser->getLexer();

$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->date = $parser->ArithmeticExpression();
$parser->match(Lexer::T_COMMA);
$this->fmt = $parser->StringExpression();

if ($lexer->isNextToken(Lexer::T_COMMA)) {
$parser->match(Lexer::T_COMMA);
$this->fmt = $parser->StringExpression();
}

$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
29 changes: 29 additions & 0 deletions tests/Query/Oracle/TruncTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Query\Oracle;

use DoctrineExtensions\Tests\Query\OracleTestCase;

/**
* @author Alexey Kalinin <nitso@yandex.ru>
*/
class TruncTest extends OracleTestCase
{
public function testFullQuery()
{
$dql = 'SELECT TRUNC(d.created, \'YYYY\') FROM DoctrineExtensions\\Tests\\Entities\\Date d';
$q = $this->entityManager->createQuery($dql);

$sql = 'SELECT TRUNC(d0_.created, \'YYYY\') AS sclr_0 FROM Date d0_';
$this->assertEquals($sql, $q->getSql());
}

public function testShortQuery()
{
$dql = 'SELECT TRUNC(d.created) FROM DoctrineExtensions\\Tests\\Entities\\Date d';
$q = $this->entityManager->createQuery($dql);

$sql = 'SELECT TRUNC(d0_.created) AS sclr_0 FROM Date d0_';
$this->assertEquals($sql, $q->getSql());
}
}

0 comments on commit 469f653

Please sign in to comment.