diff --git a/src/Query/Mysql/SubstringIndex.php b/src/Query/Mysql/SubstringIndex.php index 4983cc11..3f722128 100644 --- a/src/Query/Mysql/SubstringIndex.php +++ b/src/Query/Mysql/SubstringIndex.php @@ -2,20 +2,26 @@ namespace DoctrineExtensions\Query\Mysql; -use Doctrine\ORM\Query\AST\Functions\FunctionNode, - Doctrine\ORM\Query\Lexer; +use Doctrine\ORM\Query\AST\Functions\FunctionNode; +use Doctrine\ORM\Query\Lexer; +use Doctrine\ORM\Query\Parser; +use Doctrine\ORM\Query\SqlWalker; /** + * Class SubstringIndex + * @package DoctrineExtensions\Query\Mysql * @author Vas N */ - class SubstringIndex extends FunctionNode { public $string = null; public $delimiter = null; public $count = null; - public function parse(\Doctrine\ORM\Query\Parser $parser) + /** + * @param \Doctrine\ORM\Query\Parser $parser + */ + public function parse(Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); @@ -23,16 +29,20 @@ public function parse(\Doctrine\ORM\Query\Parser $parser) $parser->match(Lexer::T_COMMA); $this->delimiter = $parser->ArithmeticPrimary(); $parser->match(Lexer::T_COMMA); - $this->count = $parser->ArithmeticPrimary(); + $this->count = $parser->ArithmeticExpression(); $parser->match(Lexer::T_CLOSE_PARENTHESIS); } - public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) + /** + * @param \Doctrine\ORM\Query\SqlWalker $sqlWalker + * @return string + */ + public function getSql(SqlWalker $sqlWalker) { - return 'SUBSTRING_INDEX(' . - $this->string->dispatch($sqlWalker) . ', ' . - $this->delimiter->dispatch($sqlWalker) . ', ' . - $this->count->dispatch($sqlWalker) . - ')'; + return sprintf('SUBSTRING_INDEX(%s, %s, %s)', + $this->string->dispatch($sqlWalker), + $this->delimiter->dispatch($sqlWalker), + $this->count->dispatch($sqlWalker) + ); } } diff --git a/tests/Query/Mysql/StringTest.php b/tests/Query/Mysql/StringTest.php index 5c3361d7..2e656617 100644 --- a/tests/Query/Mysql/StringTest.php +++ b/tests/Query/Mysql/StringTest.php @@ -84,14 +84,21 @@ public function testSoundex() ); } + /** + * Test cases for MYSQL SUBSTRING_INDEX function. + */ public function testSubstringIndex() { - $q = $this->entityManager->createQuery("SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2) from DoctrineExtensions\Tests\Entities\Blank"); - - $this->assertEquals( - "SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2) AS sclr_0 FROM Blank b0_", - $q->getSql() - ); + $q = $this->entityManager->createQuery("SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2) from DoctrineExtensions\Tests\Entities\Blank"); + $this->assertEquals("SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2) AS sclr_0 FROM Blank b0_", $q->getSql()); + $q = $this->entityManager->createQuery("SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2) from DoctrineExtensions\Tests\Entities\Blank"); + $this->assertEquals("SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2) AS sclr_0 FROM Blank b0_", $q->getSql()); + $q = $this->entityManager->createQuery("SELECT SUBSTRING_INDEX('www.mysql.com', '.', '-2') from DoctrineExtensions\Tests\Entities\Blank"); + $this->assertEquals("SELECT SUBSTRING_INDEX('www.mysql.com', '.', '-2') AS sclr_0 FROM Blank b0_", $q->getSql()); + $q = $this->entityManager->createQuery("SELECT SUBSTRING_INDEX(b.id, '', '4') from DoctrineExtensions\Tests\Entities\Blank b"); + $this->assertEquals("SELECT SUBSTRING_INDEX(b0_.id, '', '4') AS sclr_0 FROM Blank b0_", $q->getSql()); + $q = $this->entityManager->createQuery("SELECT SUBSTRING_INDEX(b.id, '', -1) from DoctrineExtensions\Tests\Entities\Blank b"); + $this->assertEquals("SELECT SUBSTRING_INDEX(b0_.id, '', -1) AS sclr_0 FROM Blank b0_", $q->getSql()); } /** @@ -99,10 +106,10 @@ public function testSubstringIndex() */ public function testLeast() { - $q = $this->entityManager->createQuery("SELECT LEAST(10,1,4,0.4,0.003) AS lest FROM DoctrineExtensions\Tests\Entities\Blank b"); + $q = $this->entityManager->createQuery("SELECT LEAST(10,1,-4,0.4,0.003) AS lest FROM DoctrineExtensions\Tests\Entities\Blank b"); $this->assertEquals( - 'SELECT LEAST(10, 1, 4, 0.4, 0.003) AS sclr_0 FROM Blank b0_', + 'SELECT LEAST(10, 1, -4, 0.4, 0.003) AS sclr_0 FROM Blank b0_', $q->getSql() );