From 469f65355b034b21c9c755e2d46ff2c06164567b Mon Sep 17 00:00:00 2001 From: Alexey Kalinin Date: Wed, 26 Sep 2018 19:18:17 +0300 Subject: [PATCH] Optional second parameter (fmt) for Oracle TRUNC function + test. (#301) Oracle TRUNC function fmt parameter is optional --- src/Query/Oracle/Trunc.php | 26 +++++++++++++++++++++++--- tests/Query/Oracle/TruncTest.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) mode change 100644 => 100755 src/Query/Oracle/Trunc.php create mode 100755 tests/Query/Oracle/TruncTest.php diff --git a/src/Query/Oracle/Trunc.php b/src/Query/Oracle/Trunc.php old mode 100644 new mode 100755 index 888280ae7..629b1c46e --- a/src/Query/Oracle/Trunc.php +++ b/src/Query/Oracle/Trunc.php @@ -3,6 +3,7 @@ namespace DoctrineExtensions\Query\Oracle; use Doctrine\ORM\Query\AST\Functions\FunctionNode; +use Doctrine\ORM\Query\AST\Node; use Doctrine\ORM\Query\Lexer; /** @@ -10,26 +11,45 @@ */ 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); } } diff --git a/tests/Query/Oracle/TruncTest.php b/tests/Query/Oracle/TruncTest.php new file mode 100755 index 000000000..02edefcbb --- /dev/null +++ b/tests/Query/Oracle/TruncTest.php @@ -0,0 +1,29 @@ + + */ +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()); + } +}