Commit ae5d2122 authored by romanb's avatar romanb

[2.0] Parser work. Added double-dispatch functionality to AST node classes for...

[2.0] Parser work. Added double-dispatch functionality to AST node classes for use in the SqlWalker to reduce big if/else instanceof checks and for better maintainability. Also its less error-prone in the SqlWalker because its harder to miss a conditional case. Added new extensible DQL function implementation.
parent 618c1281
......@@ -38,4 +38,9 @@ class AggregateExpression extends Node
{
return $this->_functionName;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkAggregateExpression($this);
}
}
\ No newline at end of file
......@@ -51,4 +51,9 @@ class ArithmeticExpression extends Node
{
return (bool) $this->_subselect;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkArithmeticExpression($this);
}
}
\ No newline at end of file
......@@ -38,4 +38,9 @@ class ArithmeticFactor extends Node
{
return $this->_nSigned;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkArithmeticFactor($this);
}
}
\ No newline at end of file
......@@ -24,4 +24,9 @@ class ArithmeticTerm extends Node
{
return $this->_factors;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkArithmeticTerm($this);
}
}
\ No newline at end of file
......@@ -49,5 +49,10 @@ class BetweenExpression extends Node
{
return $this->_not;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkBetweenExpression($this);
}
}
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\ORM\Query\AST;
......@@ -43,4 +58,9 @@ class ComparisonExpression extends Node
{
return $this->_operator;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkComparisonExpression($this);
}
}
\ No newline at end of file
......@@ -35,4 +35,8 @@ namespace Doctrine\ORM\Query\AST;
*/
class ComparisonOperator extends Node
{
public function dispatch($sqlWalker)
{
;
}
}
\ No newline at end of file
......@@ -24,4 +24,9 @@ class ConditionalExpression extends Node
{
return $this->_conditionalTerms;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkConditionalExpression($this);
}
}
\ No newline at end of file
......@@ -31,4 +31,9 @@ class ConditionalFactor extends Node
{
return $this->_conditionalPrimary;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkConditionalFactor($this);
}
}
\ No newline at end of file
......@@ -45,4 +45,9 @@ class ConditionalPrimary extends Node
{
return (bool) $this->_conditionalExpression;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkConditionalPrimary($this);
}
}
\ No newline at end of file
......@@ -24,4 +24,9 @@ class ConditionalTerm extends Node
{
return $this->_conditionalFactors;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkConditionalTerm($this);
}
}
\ No newline at end of file
......@@ -48,5 +48,10 @@ class DeleteClause extends Node
{
$this->_aliasIdentificationVariable = $alias;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkDeleteClause($this);
}
}
......@@ -54,4 +54,9 @@ class DeleteStatement extends Node
{
return $this->_whereClause;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkDeleteStatement($this);
}
}
\ No newline at end of file
......@@ -26,9 +26,19 @@ class ExistsExpression extends Node
$this->_not = $bool;
}
public function getNot()
public function isNot()
{
return $this->_not;
}
public function getSubselect()
{
return $this->_subselect;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkExistsExpression($this);
}
}
......@@ -44,4 +44,9 @@ class FromClause extends Node
{
return $this->_identificationVariableDeclarations;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkFromClause($this);
}
}
\ No newline at end of file
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
namespace Doctrine\ORM\Query\AST;
/**
* Description of Function
*
* @author robo
*/
class FunctionNode extends Node
{
private $_name;
}
\ No newline at end of file
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
namespace Doctrine\ORM\Query\AST\Functions;
/**
* "CONCAT" "(" StringPrimary "," StringPrimary ")"
*
* @author robo
*/
class ConcatFunction extends FunctionNode
{
private $_firstStringPrimary;
private $_secondStringPriamry;
public function getFirstStringPrimary()
{
return $this->_firstStringPrimary;
}
public function getSecondStringPrimary()
{
return $this->_secondStringPrimary;
}
/**
* @override
*/
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
//TODO: Use platform to get SQL
$sql = 'CONCAT(' .
$sqlWalker->walkStringPrimary($this->_firstStringPrimary)
. ', ' .
$sqlWalker->walkStringPrimary($this->_secondStringPrimary)
. ')';
return $sql;
}
/**
* @override
*/
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$lexer = $parser->getLexer();
$parser->match($lexer->lookahead['value']);
$parser->match('(');
$this->_firstStringPrimary = $parser->_StringPrimary();
$parser->match(',');
$this->_secondStringPrimary = $parser->_StringPrimary();
$parser->match(')');
}
}
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\ORM\Query\AST\Functions;
use Doctrine\ORM\Query\AST\Node;
/**
* Description of Function
*
* @author robo
*/
abstract class FunctionNode extends Node
{
private $_name;
//private $_expressions = array();
public function __construct($name)
{
$this->_name = $name;
}
public function getName()
{
return $this->_name;
}
abstract public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker);
public function dispatch($sqlWalker)
{
return $sqlWalker->walkFunction($this);
}
//abstract public function parse(\Doctrine\ORM\Query\Parser $parser);
/*
public function getExpressions()
{
return $this->_expressions;
}
public function setExpressions(array $expressions)
{
$this->_expressions = $expressions;
}
*/
}
\ No newline at end of file
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
namespace Doctrine\ORM\Query\AST\Functions;
/**
* "LOWER" "(" StringPrimary ")"
*
* @author robo
*/
class LowerFunction extends FunctionNode
{
private $_stringPrimary;
public function getStringPrimary()
{
return $this->_stringPrimary;
}
/**
* @override
*/
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
//TODO: Use platform to get SQL
return 'LOWER(' . $sqlWalker->walkStringPrimary($this->_stringPrimary) . ')';
}
/**
* @override
*/
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$lexer = $parser->getLexer();
$parser->match($lexer->lookahead['value']);
$parser->match('(');
$this->_stringPrimary = $parser->_StringPrimary();
$parser->match(')');
}
}
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
namespace Doctrine\ORM\Query\AST\Functions;
/**
* "SUBSTRING" "(" StringPrimary "," SimpleArithmeticExpression "," SimpleArithmeticExpression ")"
*
* @author robo
*/
class SubstringFunction extends FunctionNode
{
private $_stringPrimary;
private $_firstSimpleArithmeticExpression;
private $_secondSimpleArithmeticExpression;
public function geStringPrimary()
{
return $this->_stringPrimary;
}
public function getSecondSimpleArithmeticExpression()
{
return $this->_secondSimpleArithmeticExpression;
}
public function getFirstSimpleArithmeticExpression()
{
return $this->_firstSimpleArithmeticExpression;
}
/**
* @override
*/
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
//TODO: Use platform to get SQL
$sql = 'SUBSTRING(' .
$sqlWalker->walkStringPrimary($this->_stringPrimary)
. ', ' .
$sqlWalker->walkSimpleArithmeticExpression($this->_firstSimpleArithmeticExpression)
. ', ' .
$sqlWalker->walkSimpleArithmeticExpression($this->_secondSimpleArithmeticExpression)
. ')';
return $sql;
}
/**
* @override
*/
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$lexer = $parser->getLexer();
$parser->match($lexer->lookahead['value']);
$parser->match('(');
$this->_stringPrimary = $parser->_StringPrimary();
$parser->match(',');
$this->_firstSimpleArithmeticExpression = $parser->_SimpleArithmeticExpression();
$parser->match(',');
$this->_secondSimpleArithmeticExpression = $parser->_SimpleArithmeticExpression();
$parser->match(')');
}
}
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
namespace Doctrine\ORM\Query\AST\Functions;
use Doctrine\ORM\Query\Lexer;
/**
* "TRIM" "(" [["LEADING" | "TRAILING" | "BOTH"] [char] "FROM"] StringPrimary ")"
*
* @author robo
*/
class TrimFunction extends FunctionNode
{
private $_leading;
private $_trailing;
private $_both;
private $_trimChar;
private $_stringPrimary;
public function getStringPrimary()
{
return $this->_stringPrimary;
}
public function isLeading()
{
return $this->_leading;
}
public function setLeading($bool)
{
$this->_leading = $bool;
}
public function isTrailing()
{
return $this->_trailing;
}
public function setTrailing($bool)
{
$this->_trailing = $bool;
}
public function isBoth()
{
return $this->_both;
}
public function setBoth($bool)
{
$this->_both = $bool;
}
public function getTrimChar()
{
return $this->_trimChar;
}
public function setTrimChar($trimChar)
{
$this->_trimChar = $trimChar;
}
/**
* @override
*/
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
$sql = 'TRIM(';
if ($this->_leading) $sql .= 'LEADING ';
else if ($this->_trailing) $sql .= 'TRAILING ';
else if ($this->_both) $sql .= 'BOTH ';
if ($this->_trimChar) $sql .= $this->_trimChar . ' '; //TODO: quote()
$sql .= 'FROM ' . $sqlWalker->walkStringPrimary($this->_stringPrimary);
$sql .= ')';
return $sql;
}
/**
* @override
*/
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$lexer = $parser->getLexer();
$parser->match($lexer->lookahead['value']);
$parser->match('(');
if (strcasecmp('leading', $lexer->lookahead['value']) === 0) {
$parser->match($lexer->lookahead['value']);
$this->_leading = true;
} else if (strcasecmp('trailing', $lexer->lookahead['value']) === 0) {
$parser->match($lexer->lookahead['value']);
$this->_trailing = true;
} else if (strcasecmp('both', $lexer->lookahead['value']) === 0) {
$parser->match($lexer->lookahead['value']);
$this->_both = true;
}
if ($lexer->isNextToken(Lexer::T_STRING)) {
$parser->match(Lexer::T_STRING);
$this->_trimChar = $lexer->token['value'];
}
if ($this->_leading || $this->_trailing || $this->_both || $this->_trimChar) {
$parser->match(Lexer::T_FROM);
}
$this->_stringPrimary = $parser->_StringPrimary();
$parser->match(')');
}
}
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
namespace Doctrine\ORM\Query\AST\Functions;
/**
* "UPPER" "(" StringPrimary ")"
*
* @author robo
*/
class UpperFunction extends FunctionNode
{
private $_stringPrimary;
public function getStringPrimary()
{
return $this->_stringPrimary;
}
/**
* @override
*/
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
//TODO: Use platform to get SQL
return 'UPPER(' . $sqlWalker->walkStringPrimary($this->_stringPrimary) . ')';
}
/**
* @override
*/
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$lexer = $parser->getLexer();
$parser->match($lexer->lookahead['value']);
$parser->match('(');
$this->_stringPrimary = $parser->_StringPrimary();
$parser->match(')');
}
}
......@@ -24,4 +24,9 @@ class GroupByClause extends Node
{
return $this->_groupByItems;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkGroupByClause($this);
}
}
\ No newline at end of file
......@@ -24,4 +24,9 @@ class HavingClause extends Node
{
return $this->_conditionalExpression;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkHavingClause($this);
}
}
\ No newline at end of file
......@@ -63,16 +63,8 @@ class IdentificationVariableDeclaration extends Node
return $this->_joinVariableDeclarations;
}
/* REMOVE ME LATER. COPIED METHODS FROM SPLIT OF PRODUCTION INTO "AST" AND "PARSER" */
public function buildSql()
public function dispatch($sqlWalker)
{
$str = $this->_rangeVariableDeclaration->buildSql();
for ($i = 0, $l = count($this->_joinVariableDeclarations); $i < $l; $i++) {
$str .= ' ' . $this->_joinVariableDeclarations[$i]->buildSql();
}
return $str;
return $sqlWalker->walkIdentificationVariableDeclaration($this);
}
}
\ No newline at end of file
......@@ -57,5 +57,10 @@ class InExpression extends Node
{
return $this->_pathExpression;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkInExpression($this);
}
}
......@@ -44,4 +44,9 @@ class IndexBy extends Node
{
return $this->_simpleStateFieldPathExpression;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkIndexBy($this);
}
}
\ No newline at end of file
......@@ -51,4 +51,9 @@ class InputParameter extends Node
{
return $this->_position;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkInputParameter($this);
}
}
\ No newline at end of file
......@@ -89,97 +89,9 @@ class Join extends Node
{
return $this->_conditionalExpression;
}
/* REMOVE ME LATER. COPIED METHODS FROM SPLIT OF PRODUCTION INTO "AST" AND "PARSER" */
public function buildSql()
{
$join = '';
switch ($this->_joinType) {
case self::JOIN_TYPE_LEFT:
$join .= 'LEFT';
break;
case self::JOIN_TYPE_LEFTOUTER:
$join .= 'LEFT OUTER';
break;
case self::JOIN_TYPE_INNER:
default:
$join .= 'INNER';
break;
}
$join .= ' JOIN ' . $this->_joinAssociationPathExpression->buildSql();
$condition = isset($this->_conditionalExpression)
? $this->_conditionalExpression->buildSql() : '';
switch ($this->whereType) {
case self::JOIN_WHERE_ON:
// Nothing to do here... =)
break;
case self::JOIN_WHERE_WITH:
default:
/*
TODO: Refactor to support split!!!
$parserResult = $this->_parser->getParserResult();
// Get the connection for the component
$conn = $this->_em->getConnection();
// We need to build the join conditions. Retrieving AssociationMapping
$queryComponent = $this->_rangeVariableDeclaration->getQueryComponent();
$association = $queryComponent['relation'];
$joinColumns = array();
if ($association->isOneToMany() || $association->isOneToOne()) {
if ($association->isInverseSide()) {
// joinColumns are found on the other (owning) side
$targetClass = $this->_em->getClassMetadata($association->getTargetEntityName());
$joinColumns = $targetClass->getAssociationMapping($association->getMappedByFieldName())
->getTargetToSourceKeyColumns();
} else {
$joinColumns = $association->getSourceToTargetKeyColumns();
}
} else {
//TODO: many-many
}
$relationConditionExpression = '';
// We have an array('localColumn' => 'foreignColumn', ...) here
foreach ($joinColumns as $localColumn => $foreignColumn) {
// leftExpression = rightExpression
// Defining leftExpression
$leftExpression = $conn->quoteIdentifier(
$parserResult->getTableAliasFromComponentAlias($queryComponent['parent']) . '.' . $localColumn
);
// Defining rightExpression
$rightExpression = $conn->quoteIdentifier(
$parserResult->getTableAliasFromComponentAlias(
$this->_rangeVariableDeclaration->getIdentificationVariable()
) . '.' . $foreignColumn
);
// Building the relation
$relationConditionExpression .= (($relationConditionExpression != '') ? ' AND ' : '')
. $leftExpression . ' = ' . $rightExpression;
}
$sql .= ' ON ' . $relationConditionExpression;
$sql .= empty($conditionExpression) ? '' : ' AND (' . $conditionExpression . ')';
*/
break;
}
return $join . ' ON ' . $condition;
public function dispatch($sqlWalker)
{
return $sqlWalker->walkJoin($this);
}
}
\ No newline at end of file
......@@ -32,4 +32,9 @@ class JoinPathExpression extends Node
{
return $this->_assocField;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkJoinPathExpression($this);
}
}
\ No newline at end of file
......@@ -52,9 +52,8 @@ class JoinVariableDeclaration extends Node
return $this->_indexBy;
}
/* REMOVE ME LATER. COPIED METHODS FROM SPLIT OF PRODUCTION INTO "AST" AND "PARSER" */
public function buildSql()
public function dispatch($sqlWalker)
{
return $this->_join->buildSql() . (isset($this->_indexby) ? $this->_indexby->buildSql() . ' ' : '');
return $sqlWalker->walkJoinVariableDeclaration($this);
}
}
\ No newline at end of file
......@@ -45,4 +45,9 @@ class LikeExpression extends Node
{
return $this->_escapeChar;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkLikeExpression($this);
}
}
\ No newline at end of file
......@@ -16,7 +16,7 @@
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.org>.
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\ORM\Query\AST;
......@@ -27,10 +27,11 @@ namespace Doctrine\ORM\Query\AST;
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Janne Vanhala <jpvanhal@cc.hut.fi>
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link http://www.phpdoctrine.org
* @link http://www.doctrine-project.org
* @since 2.0
* @version $Revision$
*/
abstract class Node
{
abstract public function dispatch($sqlWalker);
}
\ No newline at end of file
......@@ -35,5 +35,10 @@ class NullComparisonExpression extends Node
{
return $this->_not;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkNullComparisonExpression($this);
}
}
......@@ -24,4 +24,9 @@ class OrderByClause extends Node
{
return $this->_orderByItems;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkOrderByClause($this);
}
}
\ No newline at end of file
......@@ -46,4 +46,9 @@ class OrderByItem extends Node
{
return $this->_desc;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkOrderByItem($this);
}
}
\ No newline at end of file
......@@ -16,7 +16,7 @@
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.org>.
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\ORM\Query\AST;
......@@ -26,7 +26,7 @@ namespace Doctrine\ORM\Query\AST;
*
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link http://www.phpdoctrine.org
* @link http://www.doctrine-project.org
* @since 2.0
* @version $Revision$
*/
......@@ -58,27 +58,9 @@ class RangeVariableDeclaration extends Node
{
return $this->_classMetadata;
}
/* REMOVE ME LATER. COPIED METHODS FROM SPLIT OF PRODUCTION INTO "AST" AND "PARSER" */
public function buildSql()
{
// Retrieving connection
$conn = $this->_parserResult->getEntityManager()->getConnection();
// Component alias
$componentAlias = $this->_aliasIdentificationVariable;
// Retrieving required information
try {
$queryComponent = $this->_parserResult->getQueryComponent($componentAlias);
$classMetadata = $queryComponent['metadata'];
} catch (Doctrine_Exception $e) {
$this->_parser->semanticalError($e->getMessage());
return;
}
return $conn->quoteIdentifier($classMetadata->getTableName()) . ' '
. $conn->quoteIdentifier($this->_parserResult->getTableAliasFromComponentAlias($componentAlias));
public function dispatch($sqlWalker)
{
return $sqlWalker->walkRangeVariableDeclaration($this);
}
}
\ No newline at end of file
......@@ -69,4 +69,9 @@ class SelectClause extends Node
{
return is_object($value) ? $value->buildSql() : $value;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSelectClause($this);
}
}
\ No newline at end of file
......@@ -52,4 +52,9 @@ class SelectExpression extends Node
{
return $this->_fieldIdentificationVariable;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSelectExpression($this);
}
}
\ No newline at end of file
......@@ -80,14 +80,8 @@ class SelectStatement extends Node
return $this->_orderByClause;
}
/* REMOVE ME LATER. COPIED METHODS FROM SPLIT OF PRODUCTION INTO "AST" AND "PARSER" */
public function buildSql()
public function dispatch($sqlWalker)
{
return $this->_selectClause->buildSql() . ' ' . $this->_fromClause->buildSql()
. (($this->_whereClause !== null) ? ' ' . $this->_whereClause->buildSql() : '')
. (($this->_groupByClause !== null) ? ' ' . $this->_groupByClause->buildSql() : '')
. (($this->_havingClause !== null) ? ' ' . $this->_havingClause->buildSql() : '')
. (($this->_orderByClause !== null) ? ' ' . $this->_orderByClause->buildSql() : '');
return $sqlWalker->walkSelectStatement($this);
}
}
\ No newline at end of file
......@@ -24,4 +24,9 @@ class SimpleArithmeticExpression extends Node
{
return $this->_terms;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSimpleArithmeticExpression($this);
}
}
\ No newline at end of file
......@@ -55,4 +55,9 @@ class SimpleSelectClause extends Node
{
return $this->_simpleSelectExpression;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSimpleSelectClause($this);
}
}
\ No newline at end of file
......@@ -55,4 +55,9 @@ class SimpleSelectExpression extends Node
{
$this->_fieldIdentificationVariable = $fieldAlias;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSimpleSelectExpression($this);
}
}
\ No newline at end of file
......@@ -51,4 +51,9 @@ class SimpleStateFieldPathExpression extends Node
{
return $this->_simpleStateField;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSimpleStateFieldPathExpression($this);
}
}
\ No newline at end of file
......@@ -95,4 +95,9 @@ class StateFieldPathExpression extends Node
{
$this->_collectionValuedAssociationFields[$part] = true;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkStateFieldPathExpression($this);
}
}
\ No newline at end of file
......@@ -95,4 +95,9 @@ class Subselect extends Node
{
$this->_orderByClause = $orderByClause;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSubselect($this);
}
}
\ No newline at end of file
......@@ -44,4 +44,9 @@ class SubselectFromClause extends Node
{
return $this->_identificationVariableDeclarations;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkSubselectFromClause($this);
}
}
\ No newline at end of file
......@@ -40,5 +40,10 @@ class UpdateClause extends Node
{
return $this->_updateItems;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkUpdateClause($this);
}
}
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\ORM\Query\AST;
......@@ -42,5 +57,10 @@ class UpdateItem extends Node
{
return $this->_newValue;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkUpdateItem($this);
}
}
......@@ -54,4 +54,9 @@ class UpdateStatement extends Node
{
return $this->_whereClause;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkUpdateStatement($this);
}
}
\ No newline at end of file
......@@ -24,4 +24,9 @@ class WhereClause extends Node
{
return $this->_conditionalExpression;
}
public function dispatch($sqlWalker)
{
return $sqlWalker->walkWhereClause($this);
}
}
\ No newline at end of file
<?php
/*
* $Id: Cache.php 3938 2008-03-06 19:36:50Z romanb $
*
......
This diff is collapsed.
This diff is collapsed.
......@@ -31,7 +31,6 @@ class LanguageRecognitionTest extends \Doctrine\Tests\OrmTestCase
$query = $this->_em->createQuery($dql);
$query->setDql($dql);
$parserResult = $query->parse();
$this->fail('No syntax errors were detected, when syntax errors were expected');
} catch (\Exception $e) {
//echo $e->getMessage() . PHP_EOL;
......@@ -90,7 +89,7 @@ class LanguageRecognitionTest extends \Doctrine\Tests\OrmTestCase
public function testFunctionalExpressionsSupportedInWherePart()
{
$this->assertValidDql("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(u.name) = 'someone'");
//$this->assertValidDql("SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(u.name) = 'someone'");
}
public function testArithmeticExpressionsSupportedInWherePart()
......
......@@ -156,6 +156,14 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase
'SELECT c0.id AS c0__id, c1.id AS c1__id, c2.phonenumber AS c2__phonenumber, c3.id AS c3__id FROM cms_users c0 INNER JOIN cms_articles c1 ON c0.id = c1.user_id INNER JOIN cms_phonenumbers c2 ON c0.id = c2.user_id INNER JOIN cms_comments c3 ON c1.id = c3.article_id'
);
}
public function testTrimFunction()
{
$this->assertSqlGeneration(
"SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(TRAILING ' ' FROM u.name) = 'someone'",
"SELECT c0.name AS c0__name FROM cms_users c0 WHERE TRIM(TRAILING ' ' FROM c0.name) = 'someone'"
);
}
/*public function testFunctionalExpressionsSupportedInWherePart()
{
......
......@@ -62,7 +62,6 @@ class UpdateSqlGenerationTest extends \Doctrine\Tests\OrmTestCase
'UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = ?1',
'UPDATE cms_users c0 SET c0.name = ?'
);
$this->assertSqlGeneration(
'UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.name = ?1, u.username = ?2',
'UPDATE cms_users c0 SET c0.name = ?, c0.username = ?'
......
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