Skip to content

Commit

Permalink
SUBSTRING_INDEX accepts non-strings
Browse files Browse the repository at this point in the history
  • Loading branch information
pnvasanth authored and stevelacey committed May 18, 2017
1 parent f070436 commit 8a3ffc0
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 19 deletions.
32 changes: 21 additions & 11 deletions src/Query/Mysql/SubstringIndex.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,47 @@

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 <[email protected]>
*/

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);
$this->string = $parser->ArithmeticPrimary();
$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)
);
}
}
23 changes: 15 additions & 8 deletions tests/Query/Mysql/StringTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,25 +84,32 @@ 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());
}

/**
* Test case for MYSQL Comparison function LEAST.
*/
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()
);

Expand Down

0 comments on commit 8a3ffc0

Please sign in to comment.