Commit 4ab2ba7d authored by romanb's avatar romanb

[2.0] More progress on the DQL parser. Added glimpse() method for the...

[2.0] More progress on the DQL parser. Added glimpse() method for the scanner/lexer that is equivalent to peek() immediately followed by resetPeek().
parent 3f60b8b5
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* LikeExpression ::= StringExpression ["NOT"] "LIKE" string ["ESCAPE" char]
*
* @author robo
*/
class Doctrine_ORM_Query_AST_LikeExpression extends Doctrine_ORM_Query_AST
{
private $_stringExpr;
private $_isNot;
private $_stringPattern;
private $_escapeChar;
public function __construct($stringExpr, $stringPattern, $isNot = false, $escapeChar = null)
{
$this->_stringExpr = $stringExpr;
$this->_stringPattern = $stringPattern;
$this->_isNot = $isNot;
$this->_escapeChar = $escapeChar;
}
public function isNot()
{
return $this->_isNot;
}
public function getStringExpression()
{
return $this->_stringExpr;
}
public function getStringPattern()
{
return $this->_stringPattern;
}
public function getEscapeChar()
{
return $this->_escapeChar;
}
}
...@@ -235,6 +235,7 @@ class Doctrine_ORM_Query_Parser ...@@ -235,6 +235,7 @@ class Doctrine_ORM_Query_Parser
// Check for end of string // Check for end of string
if ($this->lookahead !== null) { if ($this->lookahead !== null) {
var_dump($this->lookahead);
$this->syntaxError('end of string'); $this->syntaxError('end of string');
} }
...@@ -995,10 +996,29 @@ class Doctrine_ORM_Query_Parser ...@@ -995,10 +996,29 @@ class Doctrine_ORM_Query_Parser
{ {
$condPrimary = new Doctrine_ORM_Query_AST_ConditionalPrimary; $condPrimary = new Doctrine_ORM_Query_AST_ConditionalPrimary;
if ($this->_isNextToken('(')) { if ($this->_isNextToken('(')) {
$numUnmatched = 1;
$peek = $this->_scanner->peek();
while ($numUnmatched > 0) {
if ($peek['value'] == ')') {
--$numUnmatched;
} else if ($peek['value'] == '(') {
++$numUnmatched;
}
$peek = $this->_scanner->peek();
}
$this->_scanner->resetPeek();
//TODO: This is not complete, what about LIKE/BETWEEN/...etc?
$comparisonOps = array("=", "<", "<=", "<>", ">", ">=", "!=");
if (in_array($peek['value'], $comparisonOps)) {
$condPrimary->setSimpleConditionalExpression($this->_SimpleConditionalExpression());
} else {
$this->match('('); $this->match('(');
$conditionalExpression = $this->_ConditionalExpression(); $conditionalExpression = $this->_ConditionalExpression();
$this->match(')'); $this->match(')');
$condPrimary->setConditionalExpression($conditionalExpression); $condPrimary->setConditionalExpression($conditionalExpression);
}
} else { } else {
$condPrimary->setSimpleConditionalExpression($this->_SimpleConditionalExpression()); $condPrimary->setSimpleConditionalExpression($this->_SimpleConditionalExpression());
} }
...@@ -1014,8 +1034,7 @@ class Doctrine_ORM_Query_Parser ...@@ -1014,8 +1034,7 @@ class Doctrine_ORM_Query_Parser
private function _SimpleConditionalExpression() private function _SimpleConditionalExpression()
{ {
if ($this->_isNextToken(Doctrine_ORM_Query_Token::T_NOT)) { if ($this->_isNextToken(Doctrine_ORM_Query_Token::T_NOT)) {
$token = $this->_scanner->peek(); $token = $this->_scanner->glimpse();
$this->_scanner->resetPeek();
} else { } else {
$token = $this->lookahead; $token = $this->lookahead;
} }
...@@ -1051,6 +1070,8 @@ class Doctrine_ORM_Query_Parser ...@@ -1051,6 +1070,8 @@ class Doctrine_ORM_Query_Parser
default: default:
$this->syntaxError(); $this->syntaxError();
} }
} else if ($token['value'] == '(') {
return $this->_ComparisonExpression();
} else { } else {
switch ($token['type']) { switch ($token['type']) {
case Doctrine_ORM_Query_Token::T_INTEGER: case Doctrine_ORM_Query_Token::T_INTEGER:
...@@ -1109,6 +1130,12 @@ class Doctrine_ORM_Query_Parser ...@@ -1109,6 +1130,12 @@ class Doctrine_ORM_Query_Parser
$terms = array(); $terms = array();
$terms[] = $this->_ArithmeticTerm(); $terms[] = $this->_ArithmeticTerm();
while ($this->lookahead['value'] == '+' || $this->lookahead['value'] == '-') { while ($this->lookahead['value'] == '+' || $this->lookahead['value'] == '-') {
if ($this->lookahead['value'] == '+') {
$this->match('+');
} else {
$this->match('-');
}
$terms[] = $this->token['value'];
$terms[] = $this->_ArithmeticTerm(); $terms[] = $this->_ArithmeticTerm();
} }
return new Doctrine_ORM_Query_AST_SimpleArithmeticExpression($terms); return new Doctrine_ORM_Query_AST_SimpleArithmeticExpression($terms);
...@@ -1122,6 +1149,12 @@ class Doctrine_ORM_Query_Parser ...@@ -1122,6 +1149,12 @@ class Doctrine_ORM_Query_Parser
$factors = array(); $factors = array();
$factors[] = $this->_ArithmeticFactor(); $factors[] = $this->_ArithmeticFactor();
while ($this->lookahead['value'] == '*' || $this->lookahead['value'] == '/') { while ($this->lookahead['value'] == '*' || $this->lookahead['value'] == '/') {
if ($this->lookahead['value'] == '*') {
$this->match('*');
} else {
$this->match('/');
}
$factors[] = $this->token['value'];
$factors[] = $this->_ArithmeticFactor(); $factors[] = $this->_ArithmeticFactor();
} }
return new Doctrine_ORM_Query_AST_ArithmeticTerm($factors); return new Doctrine_ORM_Query_AST_ArithmeticTerm($factors);
...@@ -1148,16 +1181,27 @@ class Doctrine_ORM_Query_Parser ...@@ -1148,16 +1181,27 @@ class Doctrine_ORM_Query_Parser
*/ */
private function _ArithmeticPrimary() private function _ArithmeticPrimary()
{ {
if ($this->lookahead['type'] === Doctrine_ORM_Query_Token::T_IDENTIFIER) {
return $this->_StateFieldPathExpression();
}
if ($this->lookahead['value'] === '(') { if ($this->lookahead['value'] === '(') {
return $this->_SimpleArithmeticExpression(); $this->match('(');
$expr = $this->_SimpleArithmeticExpression();
$this->match(')');
return $expr;
} }
if ($this->lookahead['type'] === Doctrine_ORM_Query_Token::T_INPUT_PARAMETER) { switch ($this->lookahead['type']) {
case Doctrine_ORM_Query_Token::T_IDENTIFIER:
return $this->_StateFieldPathExpression();
case Doctrine_ORM_Query_Token::T_INPUT_PARAMETER:
$this->match($this->lookahead['value']); $this->match($this->lookahead['value']);
return new Doctrine_ORM_Query_AST_InputParameter($this->token['value']); return new Doctrine_ORM_Query_AST_InputParameter($this->token['value']);
case Doctrine_ORM_Query_Token::T_STRING:
case Doctrine_ORM_Query_Token::T_INTEGER:
case Doctrine_ORM_Query_Token::T_FLOAT:
$this->match($this->lookahead['value']);
return $this->token['value'];
default:
$this->syntaxError();
} }
throw new Doctrine_Exception("Not yet implemented.");
//TODO... //TODO...
} }
...@@ -1194,8 +1238,71 @@ class Doctrine_ORM_Query_Parser ...@@ -1194,8 +1238,71 @@ class Doctrine_ORM_Query_Parser
$this->match('='); $this->match('=');
return '<>'; return '<>';
default: default:
$this->_parser->syntaxError('=, <, <=, <>, >, >=, !='); $this->syntaxError('=, <, <=, <>, >, >=, !=');
break; break;
} }
} }
/**
* LikeExpression ::= StringExpression ["NOT"] "LIKE" string ["ESCAPE" char]
*/
private function _LikeExpression()
{
$stringExpr = $this->_StringExpression();
$isNot = false;
if ($this->lookahead['type'] === Doctrine_ORM_Query_Token::T_NOT) {
$this->match(Doctrine_ORM_Query_Token::T_NOT);
$isNot = true;
}
$this->match(Doctrine_ORM_Query_Token::T_LIKE);
$this->match(Doctrine_ORM_Query_Token::T_STRING);
$stringPattern = $this->token['value'];
$escapeChar = null;
if ($this->lookahead['type'] === Doctrine_ORM_Query_Token::T_ESCAPE) {
$this->match(Doctrine_ORM_Query_Token::T_ESCAPE);
var_dump($this->lookahead);
//$this->match(Doctrine_ORM_Query_Token::T_)
//$escapeChar =
}
return new Doctrine_ORM_Query_AST_LikeExpression($stringExpr, $stringPattern, $isNot, $escapeChar);
}
/**
* StringExpression ::= StringPrimary | "(" Subselect ")"
*/
private function _StringExpression()
{
if ($this->lookahead['value'] === '(') {
$peek = $this->_scanner->peek();
$this->_scanner->resetPeek();
if ($peek['type'] === Doctrine_ORM_Query_Token::T_SELECT) {
return $this->_Subselect();
}
}
return $this->_StringPrimary();
}
/**
* StringPrimary ::= StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression
*/
private function _StringPrimary()
{
if ($this->lookahead['type'] === Doctrine_ORM_Query_Token::T_IDENTIFIER) {
$peek = $this->_scanner->peek();
$this->_scanner->resetPeek();
if ($peek['value'] == '.') {
return $this->_StateFieldPathExpression();
} else if ($peek['value'] == '(') {
//TODO... FunctionsReturningStrings or AggregateExpression
} else {
$this->syntaxError("'.' or '('");
}
} else if ($this->lookahead['type'] === Doctrine_ORM_Query_Token::T_STRING) {
//TODO...
} else if ($this->lookahead['type'] === Doctrine_ORM_Query_Token::T_INPUT_PARAMETER) {
//TODO...
} else {
$this->syntaxError('StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression');
}
}
} }
...@@ -91,7 +91,7 @@ class Doctrine_ORM_Query_Scanner ...@@ -91,7 +91,7 @@ class Doctrine_ORM_Query_Scanner
'[a-z_][a-z0-9_]*', '[a-z_][a-z0-9_]*',
'(?:[0-9]+(?:[,\.][0-9]+)*)(?:e[+-]?[0-9]+)?', '(?:[0-9]+(?:[,\.][0-9]+)*)(?:e[+-]?[0-9]+)?',
"'(?:[^']|'')*'", "'(?:[^']|'')*'",
'\?[0-9]+|:[a-z]+' '\?[0-9]+|:[a-z][a-z0-9_]+'
); );
$regex = '/(' . implode(')|(', $patterns) . ')|\s+|(.)/i'; $regex = '/(' . implode(')|(', $patterns) . ')|\s+|(.)/i';
} }
...@@ -179,7 +179,9 @@ class Doctrine_ORM_Query_Scanner ...@@ -179,7 +179,9 @@ class Doctrine_ORM_Query_Scanner
} }
/** /**
* @todo Doc * Moves the lookahead token forward.
*
* @return array|null The next token or NULL if there are no more tokens ahead.
*/ */
public function peek() public function peek()
{ {
...@@ -190,6 +192,18 @@ class Doctrine_ORM_Query_Scanner ...@@ -190,6 +192,18 @@ class Doctrine_ORM_Query_Scanner
} }
} }
/**
* Peeks at the next token, returns it and immediately resets the peek.
*
* @return array|null The next token or NULL if there are no more tokens ahead.
*/
public function glimpse()
{
$peek = $this->peek();
$this->_peek = 0;
return $peek;
}
/** /**
* @todo Doc * @todo Doc
*/ */
...@@ -212,7 +226,6 @@ class Doctrine_ORM_Query_Scanner ...@@ -212,7 +226,6 @@ class Doctrine_ORM_Query_Scanner
public function next() public function next()
{ {
$this->_peek = 0; $this->_peek = 0;
if (isset($this->_tokens[$this->_position])) { if (isset($this->_tokens[$this->_position])) {
return $this->_tokens[$this->_position++]; return $this->_tokens[$this->_position++];
} else { } else {
......
...@@ -153,7 +153,7 @@ class Doctrine_ORM_Query_SqlWalker ...@@ -153,7 +153,7 @@ class Doctrine_ORM_Query_SqlWalker
$sql .= $sqlTableAlias . '.' . $class->getColumnName($fieldName) . $sql .= $sqlTableAlias . '.' . $class->getColumnName($fieldName) .
' AS ' . $sqlTableAlias . '__' . $class->getColumnName($fieldName); ' AS ' . $sqlTableAlias . '__' . $class->getColumnName($fieldName);
} else if ($pathExpression->isSimpleStateFieldAssociationPathExpression()) { } else if ($pathExpression->isSimpleStateFieldAssociationPathExpression()) {
echo "HERE!!"; throw new Doctrine_Exception("Not yet implemented.");
} else { } else {
throw new Doctrine_ORM_Query_Exception("Encountered invalid PathExpression during SQL construction."); throw new Doctrine_ORM_Query_Exception("Encountered invalid PathExpression during SQL construction.");
} }
...@@ -175,6 +175,7 @@ class Doctrine_ORM_Query_SqlWalker ...@@ -175,6 +175,7 @@ class Doctrine_ORM_Query_SqlWalker
$columnName = $qComp['metadata']->getColumnName($fieldName); $columnName = $qComp['metadata']->getColumnName($fieldName);
$sql .= $aggExpr->getFunctionName() . '('; $sql .= $aggExpr->getFunctionName() . '(';
if ($aggExpr->isDistinct()) $sql .= 'DISTINCT ';
$sql .= $this->_dqlToSqlAliasMap[$dqlAlias] . '.' . $columnName; $sql .= $this->_dqlToSqlAliasMap[$dqlAlias] . '.' . $columnName;
$sql .= ') AS dctrn__' . $alias; $sql .= ') AS dctrn__' . $alias;
} }
...@@ -229,18 +230,16 @@ class Doctrine_ORM_Query_SqlWalker ...@@ -229,18 +230,16 @@ class Doctrine_ORM_Query_SqlWalker
{ {
$sql = ' WHERE '; $sql = ' WHERE ';
$condExpr = $whereClause->getConditionalExpression(); $condExpr = $whereClause->getConditionalExpression();
foreach ($condExpr->getConditionalTerms() as $term) { $sql .= implode(' OR ', array_map(array(&$this, 'walkConditionalTerm'),
$sql .= $this->walkConditionalTerm($term); $condExpr->getConditionalTerms()));
}
return $sql; return $sql;
} }
public function walkConditionalTerm($condTerm) public function walkConditionalTerm($condTerm)
{ {
$sql = ''; $sql = '';
foreach ($condTerm->getConditionalFactors() as $factor) { $sql .= implode(' AND ', array_map(array(&$this, 'walkConditionalFactor'),
$sql .= $this->walkConditionalFactor($factor); $condTerm->getConditionalFactors()));
}
return $sql; return $sql;
} }
...@@ -254,9 +253,25 @@ class Doctrine_ORM_Query_SqlWalker ...@@ -254,9 +253,25 @@ class Doctrine_ORM_Query_SqlWalker
if ($simpleCond instanceof Doctrine_ORM_Query_AST_ComparisonExpression) { if ($simpleCond instanceof Doctrine_ORM_Query_AST_ComparisonExpression) {
$sql .= $this->walkComparisonExpression($simpleCond); $sql .= $this->walkComparisonExpression($simpleCond);
} }
else if ($simpleCond instanceof Doctrine_ORM_Query_AST_LikeExpression) {
$sql .= $this->walkLikeExpression($simpleCond);
}
// else if ... // else if ...
} else if ($primary->isConditionalExpression()) {
$sql .= '(' . implode(' OR ', array_map(array(&$this, 'walkConditionalTerm'),
$primary->getConditionalExpression()->getConditionalTerms())) . ')';
}
return $sql;
} }
public function walkLikeExpression($likeExpr)
{
$sql = '';
$stringExpr = $likeExpr->getStringExpression();
if ($stringExpr instanceof Doctrine_ORM_Query_AST_PathExpression) {
$sql .= $this->walkPathExpression($stringExpr);
} //TODO else...
$sql .= ' LIKE ' . $likeExpr->getStringPattern();
return $sql; return $sql;
} }
...@@ -288,18 +303,19 @@ class Doctrine_ORM_Query_SqlWalker ...@@ -288,18 +303,19 @@ class Doctrine_ORM_Query_SqlWalker
public function walkArithmeticTerm($term) public function walkArithmeticTerm($term)
{ {
$sql = ''; if (is_string($term)) return $term;
foreach ($term->getArithmeticFactors() as $factor) { return implode(' ', array_map(array(&$this, 'walkArithmeticFactor'),
$sql .= $this->walkArithmeticFactor($factor); $term->getArithmeticFactors()));
}
return $sql;
} }
public function walkArithmeticFactor($factor) public function walkArithmeticFactor($factor)
{ {
if (is_string($factor)) return $factor;
$sql = ''; $sql = '';
$primary = $factor->getArithmeticPrimary(); $primary = $factor->getArithmeticPrimary();
if ($primary instanceof Doctrine_ORM_Query_AST_PathExpression) { if (is_numeric($primary)) {
$sql .= $primary;
} else if ($primary instanceof Doctrine_ORM_Query_AST_PathExpression) {
$sql .= $this->walkPathExpression($primary); $sql .= $this->walkPathExpression($primary);
} else if ($primary instanceof Doctrine_ORM_Query_AST_InputParameter) { } else if ($primary instanceof Doctrine_ORM_Query_AST_InputParameter) {
if ($primary->isNamed()) { if ($primary->isNamed()) {
...@@ -307,6 +323,8 @@ class Doctrine_ORM_Query_SqlWalker ...@@ -307,6 +323,8 @@ class Doctrine_ORM_Query_SqlWalker
} else { } else {
$sql .= '?'; $sql .= '?';
} }
} else if ($primary instanceof Doctrine_ORM_Query_AST_SimpleArithmeticExpression) {
$sql .= '(' . $this->walkSimpleArithmeticExpression($primary) . ')';
} }
// else... // else...
...@@ -314,6 +332,12 @@ class Doctrine_ORM_Query_SqlWalker ...@@ -314,6 +332,12 @@ class Doctrine_ORM_Query_SqlWalker
return $sql; return $sql;
} }
public function walkSimpleArithmeticExpression($simpleArithmeticExpr)
{
return implode(' ', array_map(array(&$this, 'walkArithmeticTerm'),
$simpleArithmeticExpr->getArithmeticTerms()));
}
public function walkPathExpression($pathExpr) public function walkPathExpression($pathExpr)
{ {
$sql = ''; $sql = '';
......
...@@ -239,7 +239,7 @@ ComparisonExpression ::= ArithmeticExpression ComparisonOperator ( Quantifie ...@@ -239,7 +239,7 @@ ComparisonExpression ::= ArithmeticExpression ComparisonOperator ( Quantifie
DatetimeExpression ComparisonOperator (DatetimeExpression | QuantifiedExpression) | DatetimeExpression ComparisonOperator (DatetimeExpression | QuantifiedExpression) |
EntityExpression ("=" | "<>") (EntityExpression | QuantifiedExpression) EntityExpression ("=" | "<>") (EntityExpression | QuantifiedExpression)
InExpression ::= StateFieldPathExpression ["NOT"] "IN" "(" (Literal {"," Literal}* | Subselect) ")" InExpression ::= StateFieldPathExpression ["NOT"] "IN" "(" (Literal {"," Literal}* | Subselect) ")"
LikeExpression ::= ["NOT"] "LIKE" string ["ESCAPE" char] LikeExpression ::= StringExpression ["NOT"] "LIKE" string ["ESCAPE" char]
NullComparisonExpression ::= (SingleValuedPathExpression | InputParameter) "IS" ["NOT"] "NULL" NullComparisonExpression ::= (SingleValuedPathExpression | InputParameter) "IS" ["NOT"] "NULL"
ExistsExpression ::= ["NOT"] "EXISTS" "(" Subselect ")" ExistsExpression ::= ["NOT"] "EXISTS" "(" Subselect ")"
ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!=" ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!="
......
...@@ -110,7 +110,7 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase ...@@ -110,7 +110,7 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase
); );
} }
public function testWhereClauseInSelect() public function testWhereClauseInSelectWithPositionalParameter()
{ {
$this->assertSqlGeneration( $this->assertSqlGeneration(
'select u from ForumUser u where u.id = ?1', 'select u from ForumUser u where u.id = ?1',
...@@ -118,36 +118,88 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase ...@@ -118,36 +118,88 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase
); );
} }
/* public function testAggregateFunctionWithDistinctInSelect() public function testWhereClauseInSelectWithNamedParameter()
{ {
$this->assertSqlGeneration( $this->assertSqlGeneration(
'SELECT COUNT(DISTINCT u.name) FROM CmsUser u', 'select u from ForumUser u where u.username = :name',
'SELECT COUNT(DISTINCT cu.name) AS dctrn__0 FROM cms_user cu WHERE 1 = 1' 'SELECT fu.id AS fu__id, fu.username AS fu__username FROM ForumUser fu WHERE fu.username = :name'
); );
} }
public function testWhereANDClauseInSelectWithNamedParameter()
{
$this->assertSqlGeneration(
'select u from ForumUser u where u.username = :name and u.username = :name2',
'SELECT fu.id AS fu__id, fu.username AS fu__username FROM ForumUser fu WHERE fu.username = :name AND fu.username = :name2'
);
}
public function testFunctionalExpressionsSupportedInWherePart() public function testCombinedWhereClauseInSelectWithNamedParameter()
{ {
$this->assertSqlGeneration( $this->assertSqlGeneration(
"SELECT u.name FROM CmsUser u WHERE TRIM(u.name) = 'someone'", 'select u from ForumUser u where (u.username = :name OR u.username = :name2) AND u.id = :id',
// String quoting in the SQL usually depends on the database platform. 'SELECT fu.id AS fu__id, fu.username AS fu__username FROM ForumUser fu WHERE (fu.username = :name OR fu.username = :name2) AND fu.id = :id'
// This test works with a mock connection which uses ' for string quoting.
"SELECT cu.name AS cu__name FROM cms_user cu WHERE TRIM(cu.name) = 'someone'"
); );
} }
public function testAggregateFunctionWithDistinctInSelect()
{
$this->assertSqlGeneration(
'SELECT COUNT(DISTINCT u.name) FROM CmsUser u',
'SELECT COUNT(DISTINCT cu.name) AS dctrn__0 FROM CmsUser cu'
);
}
// Ticket #668 // Ticket #668
public function testKeywordUsageInStringParam() public function testKeywordUsageInStringParam()
{ {
$this->assertSqlGeneration( $this->assertSqlGeneration(
"SELECT u.name FROM CmsUser u WHERE u.name LIKE '%foo OR bar%'", "SELECT u.name FROM CmsUser u WHERE u.name LIKE '%foo OR bar%'",
"SELECT cu.name AS cu__name FROM cms_user cu WHERE cu.name LIKE '%foo OR bar%'" "SELECT cu.name AS cu__name FROM CmsUser cu WHERE cu.name LIKE '%foo OR bar%'"
); );
} }
public function testArithmeticExpressionsSupportedInWherePart()
{
$this->assertSqlGeneration(
'SELECT u FROM CmsUser u WHERE ((u.id + 5000) * u.id + 3) < 10000000',
'SELECT cu.id AS cu__id, cu.status AS cu__status, cu.username AS cu__username, cu.name AS cu__name FROM CmsUser cu WHERE ((cu.id + 5000) * cu.id + 3) < 10000000'
);
}
public function testPlainJoinWithoutClause()
{
$this->assertSqlGeneration(
'SELECT u.id, a.id from CmsUser u LEFT JOIN u.articles a',
'SELECT cu.id AS cu__id, ca.id AS ca__id FROM CmsUser cu LEFT JOIN CmsArticle ca ON cu.id = ca.user_id'
);
$this->assertSqlGeneration(
'SELECT u.id, a.id from CmsUser u JOIN u.articles a',
'SELECT cu.id AS cu__id, ca.id AS ca__id FROM CmsUser cu INNER JOIN CmsArticle ca ON cu.id = ca.user_id'
);
}
public function testDeepJoin()
{
$this->assertSqlGeneration(
'SELECT u.id, a.id, p, c.id from CmsUser u JOIN u.articles a JOIN u.phonenumbers p JOIN a.comments c',
'SELECT cu.id AS cu__id, ca.id AS ca__id, cp.phonenumber AS cp__phonenumber, cc.id AS cc__id FROM CmsUser cu INNER JOIN CmsArticle ca ON cu.id = ca.user_id INNER JOIN CmsPhonenumber cp ON cu.id = cp.user_id INNER JOIN CmsComment cc ON ca.id = cc.article_id'
);
}
/*
public function testFunctionalExpressionsSupportedInWherePart()
{
$this->assertSqlGeneration(
"SELECT u.name FROM CmsUser u WHERE TRIM(u.name) = 'someone'",
// String quoting in the SQL usually depends on the database platform.
// This test works with a mock connection which uses ' for string quoting.
"SELECT cu.name AS cu__name FROM cms_user cu WHERE TRIM(cu.name) = 'someone'"
);
}
*/
/*
// Ticket #973 // Ticket #973
public function testSingleInValueWithoutSpace() public function testSingleInValueWithoutSpace()
{ {
...@@ -168,15 +220,6 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase ...@@ -168,15 +220,6 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase
} }
public function testArithmeticExpressionsSupportedInWherePart()
{
$this->assertSqlGeneration(
'SELECT u.* FROM CmsUser u WHERE ((u.id + 5000) * u.id + 3) < 10000000',
'SELECT cu.id AS cu__id, cu.status AS cu__status, cu.username AS cu__username, cu.name AS cu__name FROM cms_user cu WHERE ((cu.id + 5000) * cu.id + 3) < 10000000'
);
}
public function testInExpressionSupportedInWherePart() public function testInExpressionSupportedInWherePart()
{ {
$this->assertSqlGeneration( $this->assertSqlGeneration(
...@@ -194,17 +237,5 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase ...@@ -194,17 +237,5 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase
); );
} }
public function testPlainJoinWithoutClause()
{
$this->assertSqlGeneration(
'SELECT u.id, a.id from CmsUser u LEFT JOIN u.articles a',
'SELECT cu.id AS cu__id, ca.id AS ca__id FROM cms_user cu LEFT JOIN cms_article ca ON cu.id = ca.user_id WHERE 1 = 1'
);
$this->assertSqlGeneration(
'SELECT u.id, a.id from CmsUser u JOIN u.articles a',
'SELECT cu.id AS cu__id, ca.id AS ca__id FROM cms_user cu INNER JOIN cms_article ca ON cu.id = ca.user_id WHERE 1 = 1'
);
}
*/ */
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment