Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
efca7941
Commit
efca7941
authored
Aug 21, 2008
by
guilhermeblanco
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DQL Parser refactorings and enhancements. Finished basic drat of Join support.
parent
d8b76a54
Changes
33
Show whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
320 additions
and
459 deletions
+320
-459
Entity.php
lib/Doctrine/Entity.php
+38
-38
AbstractResult.php
lib/Doctrine/Query/AbstractResult.php
+1
-1
Parser.php
lib/Doctrine/Query/Parser.php
+3
-1
BetweenExpression.php
lib/Doctrine/Query/Production/BetweenExpression.php
+6
-16
ComparisonExpression.php
lib/Doctrine/Query/Production/ComparisonExpression.php
+7
-15
ComparisonOperator.php
lib/Doctrine/Query/Production/ComparisonOperator.php
+1
-10
ConditionalExpression.php
lib/Doctrine/Query/Production/ConditionalExpression.php
+2
-15
ConditionalFactor.php
lib/Doctrine/Query/Production/ConditionalFactor.php
+2
-13
ConditionalPrimary.php
lib/Doctrine/Query/Production/ConditionalPrimary.php
+5
-4
ConditionalTerm.php
lib/Doctrine/Query/Production/ConditionalTerm.php
+2
-15
ExistsExpression.php
lib/Doctrine/Query/Production/ExistsExpression.php
+2
-13
Expression.php
lib/Doctrine/Query/Production/Expression.php
+2
-15
FieldIdentificationVariable.php
...Doctrine/Query/Production/FieldIdentificationVariable.php
+5
-13
FromClause.php
lib/Doctrine/Query/Production/FromClause.php
+2
-15
IdentificationVariable.php
lib/Doctrine/Query/Production/IdentificationVariable.php
+0
-17
IdentificationVariableDeclaration.php
...ne/Query/Production/IdentificationVariableDeclaration.php
+15
-52
InExpression.php
lib/Doctrine/Query/Production/InExpression.php
+6
-21
IndexBy.php
lib/Doctrine/Query/Production/IndexBy.php
+5
-14
Join.php
lib/Doctrine/Query/Production/Join.php
+49
-16
JoinVariableDeclaration.php
lib/Doctrine/Query/Production/JoinVariableDeclaration.php
+70
-0
LikeExpression.php
lib/Doctrine/Query/Production/LikeExpression.php
+6
-15
NullComparisonExpression.php
lib/Doctrine/Query/Production/NullComparisonExpression.php
+2
-12
PathExpressionEndingWithAsterisk.php
...ine/Query/Production/PathExpressionEndingWithAsterisk.php
+4
-13
QuantifiedExpression.php
lib/Doctrine/Query/Production/QuantifiedExpression.php
+4
-14
RangeVariableDeclaration.php
lib/Doctrine/Query/Production/RangeVariableDeclaration.php
+28
-26
SelectClause.php
lib/Doctrine/Query/Production/SelectClause.php
+4
-16
SelectExpression.php
lib/Doctrine/Query/Production/SelectExpression.php
+19
-0
SelectStatement.php
lib/Doctrine/Query/Production/SelectStatement.php
+12
-31
SimpleConditionalExpression.php
...Doctrine/Query/Production/SimpleConditionalExpression.php
+4
-15
WhereClause.php
lib/Doctrine/Query/Production/WhereClause.php
+2
-11
SqlBuilder.php
lib/Doctrine/Query/SqlBuilder.php
+1
-1
query-language.txt
query-language.txt
+2
-1
SelectSqlGenerationTest.php
tests/Orm/Query/SelectSqlGenerationTest.php
+9
-0
No files found.
lib/Doctrine/Entity.php
View file @
efca7941
...
...
@@ -23,7 +23,7 @@
/**
* Base class for all Entities (objects with persistent state in a RDBMS that are
* managed by Doctrine). Kind of a Layer Sup
t
ertype.
* managed by Doctrine). Kind of a Layer Supertype.
*
* NOTE: Methods that are intended for internal use only but must be public
* are marked INTERNAL: and begin with an underscore "_" to indicate that they
...
...
lib/Doctrine/Query/AbstractResult.php
View file @
efca7941
...
...
@@ -123,7 +123,7 @@ abstract class Doctrine_Query_AbstractResult
*/
public
function
getQueryComponent
(
$componentAlias
)
{
if
(
!
isset
(
$this
->
_queryComponents
[
$componentAlias
]
))
{
if
(
!
array_key_exists
(
$componentAlias
,
$this
->
_queryComponents
))
{
throw
new
Doctrine_Query_Exception
(
'Unknown query component '
.
$componentAlias
);
}
...
...
lib/Doctrine/Query/Parser.php
View file @
efca7941
...
...
@@ -173,7 +173,9 @@ class Doctrine_Query_Parser
/**
* @todo [TODO] Document these!
* Moves the parser scanner to next token
*
* @return void
*/
public
function
next
()
{
...
...
lib/Doctrine/Query/Production/BetweenExpression.php
View file @
efca7941
...
...
@@ -66,30 +66,20 @@ class Doctrine_Query_Production_BetweenExpression extends Doctrine_Query_Product
.
$this
->
_fromExpression
->
buildSql
()
.
' AND '
.
$this
->
_toExpression
->
buildSql
();
}
/**
* Visitor support.
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_fromExpression
->
accept
(
$visitor
);
$this
->
_toExpression
->
accept
(
$visitor
);
$visitor
->
visitBetweenExpression
(
$this
);
}
/* Getters */
public
function
isNot
()
{
return
$this
->
_not
;
}
public
function
getFromExpression
()
{
return
$this
->
_fromExpression
;
}
public
function
getToExpression
()
{
return
$this
->
_toExpression
;
...
...
lib/Doctrine/Query/Production/ComparisonExpression.php
View file @
efca7941
...
...
@@ -24,6 +24,7 @@
*
* @package Doctrine
* @subpackage Query
* @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
...
...
@@ -72,29 +73,20 @@ class Doctrine_Query_Production_ComparisonExpression extends Doctrine_Query_Prod
);
}
/**
* Visitor support.
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_expression
->
accept
(
$visitor
);
$visitor
->
visitComparisonExpression
(
$this
);
}
/* Getters */
public
function
getOperator
()
{
return
$this
->
_operator
;
}
public
function
getExpression
()
{
return
$this
->
_expression
;
}
public
function
isSubselect
()
{
return
$this
->
_isSubselect
;
...
...
lib/Doctrine/Query/Production/ComparisonOperator.php
View file @
efca7941
...
...
@@ -24,6 +24,7 @@
*
* @package Doctrine
* @subpackage Query
* @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
...
...
@@ -78,14 +79,4 @@ class Doctrine_Query_Production_ComparisonOperator extends Doctrine_Query_Produc
break
;
}
}
/**
* Visitor support.
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitComparisonOperator
(
$this
);
}
}
lib/Doctrine/Query/Production/ConditionalExpression.php
View file @
efca7941
...
...
@@ -70,21 +70,8 @@ class Doctrine_Query_Production_ConditionalExpression extends Doctrine_Query_Pro
return
$value
->
buildSql
();
}
/**
* Visitor support.
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
foreach
(
$this
->
_conditionalTerms
as
$term
)
{
$term
->
accept
(
$visitor
);
}
$visitor
->
visitConditionalExpression
(
$this
);
}
/* Getters */
public
function
getConditionalTerms
()
{
return
$this
->
_conditionalTerms
;
...
...
lib/Doctrine/Query/Production/ConditionalFactor.php
View file @
efca7941
...
...
@@ -61,19 +61,8 @@ class Doctrine_Query_Production_ConditionalFactor extends Doctrine_Query_Product
return
'NOT '
.
$this
->
_conditionalPrimary
->
buildSql
();
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_conditionalPrimary
->
accept
(
$visitor
);
$visitor
->
visitConditionalFactor
(
$this
);
}
/* Getters */
public
function
getConditionalPrimary
()
{
return
$this
->
_conditionalPrimary
;
...
...
lib/Doctrine/Query/Production/ConditionalPrimary.php
View file @
efca7941
...
...
@@ -99,9 +99,10 @@ class Doctrine_Query_Production_ConditionalPrimary extends Doctrine_Query_Produc
return
false
;
}
public
function
accept
(
$visitor
)
/* Getters */
public
function
getConditionalExpression
()
{
$this
->
_conditionalExpression
->
accept
(
$visitor
);
$visitor
->
visitConditionalPrimary
(
$this
);
return
$this
->
_conditionalExpression
;
}
}
lib/Doctrine/Query/Production/ConditionalTerm.php
View file @
efca7941
...
...
@@ -70,21 +70,8 @@ class Doctrine_Query_Production_ConditionalTerm extends Doctrine_Query_Productio
return
$value
->
buildSql
();
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
foreach
(
$this
->
_conditionalFactors
as
$factor
)
{
$factor
->
accept
(
$visitor
);
}
$visitor
->
visitConditionalTerm
(
$this
);
}
/* Getters */
public
function
getConditionalFactors
()
{
return
$this
->
_conditionalFactors
;
...
...
lib/Doctrine/Query/Production/ExistsExpression.php
View file @
efca7941
...
...
@@ -52,19 +52,8 @@ class Doctrine_Query_Production_ExistsExpression extends Doctrine_Query_Producti
return
'EXISTS ('
.
$this
->
_subselect
->
buildSql
()
.
')'
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_subselect
->
accept
(
$visitor
);
$visitor
->
visitExistsExpression
(
$this
);
}
/* Getters */
public
function
getSubselect
()
{
return
$this
->
_subselect
;
...
...
lib/Doctrine/Query/Production/Expression.php
View file @
efca7941
...
...
@@ -87,21 +87,8 @@ class Doctrine_Query_Production_Expression extends Doctrine_Query_Production
return
(
is_string
(
$value
)
?
$value
:
$value
->
buildSql
());
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
foreach
(
$this
->
_terms
as
$term
)
{
$term
->
accept
(
$visitor
);
}
$visitor
->
visitExpression
(
$this
);
}
/* Getters */
public
function
getTerms
()
{
return
$this
->
_terms
;
...
...
lib/Doctrine/Query/Production/FieldIdentificationVariable.php
View file @
efca7941
...
...
@@ -24,6 +24,7 @@
*
* @package Doctrine
* @subpackage Query
* @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
...
...
@@ -75,23 +76,14 @@ class Doctrine_Query_Production_FieldIdentificationVariable extends Doctrine_Que
.
Doctrine_Query_Production
::
SQLALIAS_SEPARATOR
.
$idx
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitFieldIdentificationVariable
(
$this
);
}
/* Getters */
public
function
getFieldAlias
()
{
return
$this
->
_fieldAlias
;
}
public
function
getColumnAlias
()
{
return
$this
->
_columnAlias
;
...
...
lib/Doctrine/Query/Production/FromClause.php
View file @
efca7941
...
...
@@ -72,21 +72,8 @@ class Doctrine_Query_Production_FromClause extends Doctrine_Query_Production
return
$value
->
buildSql
();
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
foreach
(
$this
->
_identificationVariableDeclaration
as
$decl
)
{
$decl
->
accept
(
$visitor
);
}
$visitor
->
visitFromClause
(
$this
);
}
/* Getters */
public
function
getIdentificationVariableDeclarations
()
{
return
$this
->
_identificationVariableDeclaration
;
...
...
lib/Doctrine/Query/Production/IdentificationVariable.php
View file @
efca7941
...
...
@@ -62,21 +62,4 @@ class Doctrine_Query_Production_IdentificationVariable extends Doctrine_Query_Pr
return
$this
->
_componentAlias
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitIdentificationVariable
(
$this
);
}
/* Getters */
public
function
getComponentAlias
()
{
return
$this
->
_componentAlias
;
}
}
lib/Doctrine/Query/Production/IdentificationVariableDeclaration.php
View file @
efca7941
...
...
@@ -20,7 +20,7 @@
*/
/**
* IdentificationVariableDeclaration = RangeVariableDeclaration [IndexBy] {Join
[IndexBy]
}
* IdentificationVariableDeclaration = RangeVariableDeclaration [IndexBy] {Join
VariableDeclaration
}
*
* @package Doctrine
* @subpackage Query
...
...
@@ -37,7 +37,7 @@ class Doctrine_Query_Production_IdentificationVariableDeclaration extends Doctri
protected
$_indexBy
;
protected
$_
rel
ations
=
array
();
protected
$_
joinVariableDeclar
ations
=
array
();
public
function
syntax
(
$paramHolder
)
...
...
@@ -45,7 +45,7 @@ class Doctrine_Query_Production_IdentificationVariableDeclaration extends Doctri
$this
->
_rangeVariableDeclaration
=
$this
->
AST
(
'RangeVariableDeclaration'
,
$paramHolder
);
if
(
$this
->
_isNextToken
(
Doctrine_Query_Token
::
T_INDEX
))
{
$paramHolder
->
set
(
'componentAlias'
,
$this
->
_rangeVariableDeclaration
);
$paramHolder
->
set
(
'componentAlias'
,
$this
->
_rangeVariableDeclaration
->
getIdentificationVariable
()
);
$this
->
_indexBy
=
$this
->
AST
(
'IndexBy'
,
$paramHolder
);
$paramHolder
->
remove
(
'componentAlias'
);
}
...
...
@@ -55,75 +55,38 @@ class Doctrine_Query_Production_IdentificationVariableDeclaration extends Doctri
$this
->
_isNextToken
(
Doctrine_Query_Token
::
T_INNER
)
||
$this
->
_isNextToken
(
Doctrine_Query_Token
::
T_JOIN
)
)
{
$i
=
count
(
$this
->
_relations
);
$this
->
_relations
[
$i
][
'join'
]
=
$this
->
AST
(
'Join'
,
$paramHolder
);
if
(
$this
->
_isNextToken
(
Doctrine_Query_Token
::
T_INDEX
))
{
$paramHolder
->
set
(
'componentAlias'
,
$this
->
_relations
[
$i
][
'join'
]
->
getRangeVariableDeclaration
());
$this
->
_relations
[
$i
][
'indexBy'
]
=
$this
->
AST
(
'IndexBy'
,
$paramHolder
);
$paramHolder
->
remove
(
'componentAlias'
);
}
$this
->
_joinVariableDeclarations
[]
=
$this
->
AST
(
'JoinVariableDeclaration'
,
$paramHolder
);
}
}
public
function
buildSql
()
{
// We need to bring the queryComponent and get things from there.
$parserResult
=
$this
->
_parser
->
getParserResult
();
$queryComponent
=
$parserResult
->
getQueryComponent
(
$this
->
_rangeVariableDeclaration
);
$str
=
$this
->
_rangeVariableDeclaration
->
buildSql
();
// Retrieving connection
$conn
=
$this
->
_em
->
getConnection
();
$str
=
$conn
->
quoteIdentifier
(
$queryComponent
[
'metadata'
]
->
getTableName
())
.
' '
.
$conn
->
quoteIdentifier
(
$parserResult
->
getTableAliasFromComponentAlias
(
$this
->
_rangeVariableDeclaration
));
for
(
$i
=
0
,
$l
=
count
(
$this
->
_relations
);
$i
<
$l
;
$i
++
)
{
$str
.=
$this
->
_relations
[
$i
][
'join'
]
->
buildSql
()
.
' '
.
((
isset
(
$this
->
_relations
[
$i
][
'indexby'
]))
?
$this
->
_relations
[
$i
][
'indexby'
]
->
buildSql
()
.
' '
:
''
);
for
(
$i
=
0
,
$l
=
count
(
$this
->
_joinVariableDeclarations
);
$i
<
$l
;
$i
++
)
{
$str
.=
' '
.
$this
->
_joinVariableDeclarations
[
$i
]
->
buildSql
();
}
return
$str
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_rangeVariableDeclaration
->
accept
(
$visitor
);
if
(
$this
->
_indexBy
)
{
$this
->
_indexBy
->
accept
(
$visitor
);
}
foreach
(
$this
->
_relations
as
$relation
)
{
if
(
$relation
[
'join'
])
{
$relation
[
'join'
]
->
accept
(
$visitor
);
}
if
(
$relation
[
'indexby'
])
{
$relation
[
'indexby'
]
->
accept
(
$visitor
);
}
}
$visitor
->
visitIdentificationVariable
(
$this
);
}
/* Getters */
public
function
getRangeVariableDeclaration
()
{
return
$this
->
_rangeVariableDeclaration
;
}
public
function
getIndexBy
()
{
return
$this
->
_indexBy
;
}
public
function
getRelations
()
public
function
getJoinVariableDeclarations
()
{
return
$this
->
_
rel
ations
;
return
$this
->
_
joinVariableDeclar
ations
;
}
}
lib/Doctrine/Query/Production/InExpression.php
View file @
efca7941
...
...
@@ -88,35 +88,20 @@ class Doctrine_Query_Production_InExpression extends Doctrine_Query_Production
return
$value
->
buildSql
();
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
if
(
$this
->
_subselect
!==
null
)
{
$this
->
_subselect
->
accept
(
$visitor
);
}
else
{
foreach
(
$this
->
_atoms
as
$atom
)
{
$atom
->
accept
(
$visitor
);
}
}
$visitor
->
visitInExpression
(
$this
);
}
/* Getters */
public
function
isNot
()
{
return
$this
->
_not
;
}
public
function
getSubselect
()
{
return
$this
->
_subselect
;
}
public
function
getAtoms
()
{
return
$this
->
_atoms
;
...
...
lib/Doctrine/Query/Production/IndexBy.php
View file @
efca7941
...
...
@@ -24,6 +24,7 @@
*
* @package Doctrine
* @subpackage Query
* @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
...
...
@@ -95,7 +96,6 @@ class Doctrine_Query_Production_IndexBy extends Doctrine_Query_Production
);
}
$queryComponent
[
'map'
]
=
$this
->
_fieldName
;
$parserResult
->
setQueryComponent
(
$this
->
_componentAlias
,
$queryComponent
);
}
...
...
@@ -106,23 +106,14 @@ class Doctrine_Query_Production_IndexBy extends Doctrine_Query_Production
return
''
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitIndexBy
(
$this
);
}
/* Getters */
public
function
getComponentAlias
()
{
return
$this
->
_componentAlias
;
}
public
function
getFieldName
()
{
return
$this
->
_fieldName
;
...
...
lib/Doctrine/Query/Production/Join.php
View file @
efca7941
...
...
@@ -24,6 +24,7 @@
*
* @package Doctrine
* @subpackage Query
* @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
...
...
@@ -74,36 +75,68 @@ class Doctrine_Query_Production_Join extends Doctrine_Query_Production
public
function
buildSql
()
{
return
''
;
$parserResult
=
$this
->
_parser
->
getParserResult
();
// Get the connection for the component
$conn
=
$this
->
_em
->
getConnection
();
$sql
=
$this
->
_joinType
.
' JOIN '
.
$this
->
_rangeVariableDeclaration
->
buildSql
();
$conditionExpression
=
isset
(
$this
->
_conditionExpression
)
?
$this
->
_conditionExpression
->
buildSql
()
:
''
;
if
(
$this
->
_whereType
==
'ON'
)
{
return
$sql
.
' ON '
.
$conditionExpression
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitJoin
(
$this
);
// We need to build the relationship conditions. Retrieving AssociationMapping
$queryComponent
=
$this
->
_rangeVariableDeclaration
->
getQueryComponent
();
$relationColumns
=
$queryComponent
[
'relation'
]
->
getSourceToTargetKeyColumns
();
$relationConditionExpression
=
''
;
// We have an array('localColumn' => 'foreignColumn', ...) here
foreach
(
$relationColumns
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
;
}
return
$sql
.
' ON '
.
$relationConditionExpression
.
' AND ('
.
$conditionExpression
.
')'
;
}
/* Getters */
/* Getters */
public
function
getJoinType
()
{
return
$this
->
_joinType
;
}
public
function
getRangeVariableDeclaration
()
{
return
$this
->
_rangeVariableDeclaration
;
}
public
function
getWhereType
()
{
return
$this
->
_whereType
;
}
public
function
getConditionalExpression
()
{
return
$this
->
_conditionalExpression
;
...
...
lib/Doctrine/Query/Production/JoinVariableDeclaration.php
0 → 100755
View file @
efca7941
<?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.phpdoctrine.org>.
*/
/**
* JoinVariableDeclaration = Join [IndexBy]
*
* @package Doctrine
* @subpackage Query
* @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
* @since 2.0
* @version $Revision$
*/
class
Doctrine_Query_Production_JoinVariableDeclaration
extends
Doctrine_Query_Production
{
protected
$_join
;
protected
$_indexBy
;
public
function
syntax
(
$paramHolder
)
{
$this
->
_join
=
$this
->
AST
(
'Join'
,
$paramHolder
);
if
(
$this
->
_isNextToken
(
Doctrine_Query_Token
::
T_INDEX
))
{
$paramHolder
->
set
(
'componentAlias'
,
$this
->
_join
->
getRangeVariableDeclaration
()
->
getIdentificationVariable
());
$this
->
_indexBy
=
$this
->
AST
(
'IndexBy'
,
$paramHolder
);
$paramHolder
->
remove
(
'componentAlias'
);
}
}
public
function
buildSql
()
{
return
$this
->
_join
->
buildSql
()
.
' '
.
(
isset
(
$this
->
_indexby
)
?
$this
->
_indexby
->
buildSql
()
.
' '
:
''
);
}
/* Getters */
public
function
getJoin
()
{
return
$this
->
_join
;
}
public
function
getIndexBy
()
{
return
$this
->
_indexBy
;
}
}
\ No newline at end of file
lib/Doctrine/Query/Production/LikeExpression.php
View file @
efca7941
...
...
@@ -70,29 +70,20 @@ class Doctrine_Query_Production_LikeExpression extends Doctrine_Query_Production
.
((
$this
->
_escapeString
!==
null
)
?
' ESCAPE '
.
$this
->
_escapeString
:
''
);
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_expression
->
accept
(
$visitor
);
$visitor
->
visitLikeExpression
(
$this
);
}
/* Getters */
public
function
isNot
()
{
return
$this
->
_not
;
}
public
function
getExpression
()
{
return
$this
->
_expression
;
}
public
function
getEscapeString
()
{
return
$this
->
_escapeString
;
...
...
lib/Doctrine/Query/Production/NullComparisonExpression.php
View file @
efca7941
...
...
@@ -56,18 +56,8 @@ class Doctrine_Query_Production_NullComparisonExpression extends Doctrine_Query_
return
'IS '
.
((
$this
->
_not
)
?
'NOT '
:
''
)
.
'NULL'
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitNullComparisonExpression
(
$this
);
}
/* Getters */
public
function
isNot
()
{
return
$this
->
_not
;
...
...
lib/Doctrine/Query/Production/PathExpressionEndingWithAsterisk.php
View file @
efca7941
...
...
@@ -154,23 +154,14 @@ class Doctrine_Query_Production_PathExpressionEndingWithAsterisk extends Doctrin
return
$str
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitPathExpressionEndingWithAsterisk
(
$this
);
}
/* Getters */
public
function
getIdentifiers
()
{
return
$this
->
_identifiers
;
}
public
function
getQueryComponent
()
{
return
$this
->
_queryComponent
;
...
...
lib/Doctrine/Query/Production/QuantifiedExpression.php
View file @
efca7941
...
...
@@ -70,24 +70,14 @@ class Doctrine_Query_Production_QuantifiedExpression extends Doctrine_Query_Prod
return
$this
->
_type
.
' ('
.
$this
->
_subselect
->
buildSql
()
.
')'
;
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_subselect
->
accept
(
$visitor
);
$visitor
->
visitQuantifiedExpression
(
$this
);
}
/* Getters */
public
function
getType
()
{
return
$this
->
_type
;
}
public
function
getSubselect
()
{
return
$this
->
_subselect
;
...
...
lib/Doctrine/Query/Production/RangeVariableDeclaration.php
View file @
efca7941
...
...
@@ -35,6 +35,8 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
{
protected
$_identifiers
=
array
();
protected
$_queryComponent
;
protected
$_identificationVariable
;
...
...
@@ -99,14 +101,19 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
$this
->
_semanticalWithSingleIdentifier
();
}
}
return
$this
->
_identificationVariable
;
}
public
function
buildSql
()
{
return
''
;
// We need to bring the queryComponent and get things from there.
$parserResult
=
$this
->
_parser
->
getParserResult
();
// Retrieving connection
$conn
=
$this
->
_em
->
getConnection
();
return
$conn
->
quoteIdentifier
(
$this
->
_queryComponent
[
'metadata'
]
->
getTableName
())
.
' '
.
$conn
->
quoteIdentifier
(
$parserResult
->
getTableAliasFromComponentAlias
(
$this
->
_identificationVariable
));
}
...
...
@@ -123,7 +130,7 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
$classMetadata
=
$this
->
_em
->
getClassMetadata
(
$componentName
);
// Building queryComponent
$queryComponent
=
array
(
$
this
->
_
queryComponent
=
array
(
'metadata'
=>
$classMetadata
,
'parent'
=>
null
,
'relation'
=>
null
,
...
...
@@ -144,7 +151,7 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
//echo "Identification Variable: " .$this->_identificationVariable . "\n";
$tableAlias
=
$parserResult
->
generateTableAlias
(
$classMetadata
->
getClassName
());
$parserResult
->
setQueryComponent
(
$this
->
_identificationVariable
,
$queryComponent
);
$parserResult
->
setQueryComponent
(
$this
->
_identificationVariable
,
$
this
->
_
queryComponent
);
$parserResult
->
setTableAlias
(
$tableAlias
,
$this
->
_identificationVariable
);
}
...
...
@@ -158,8 +165,8 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
// Retrieve the base component
try
{
$queryComponent
=
$parserResult
->
getQueryComponent
(
$this
->
_identifiers
[
0
]);
$classMetadata
=
$queryComponent
[
'metadata'
];
$
this
->
_
queryComponent
=
$parserResult
->
getQueryComponent
(
$this
->
_identifiers
[
0
]);
$classMetadata
=
$
this
->
_
queryComponent
[
'metadata'
];
$className
=
$classMetadata
->
getClassName
();
$parent
=
$path
=
$this
->
_identifiers
[
0
];
}
catch
(
Doctrine_Exception
$e
)
{
...
...
@@ -175,8 +182,8 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
if
(
$parserResult
->
hasQueryComponent
(
$path
))
{
// We already have the query component on hands, get it
$queryComponent
=
$parserResult
->
getQueryComponent
(
$path
);
$classMetadata
=
$queryComponent
[
'metadata'
];
$
this
->
_
queryComponent
=
$parserResult
->
getQueryComponent
(
$path
);
$classMetadata
=
$
this
->
_
queryComponent
[
'metadata'
];
// If we are in our last check and identification variable is null, we throw semantical error
if
(
$i
==
$l
-
1
&&
$this
->
_identificationVariable
===
null
)
{
...
...
@@ -204,7 +211,7 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
$relation
=
$classMetadata
->
getAssociationMapping
(
$relationName
);
$targetClassMetadata
=
$this
->
_em
->
getClassMetadata
(
$relation
->
getTargetEntityName
());
$queryComponent
=
array
(
$
this
->
_
queryComponent
=
array
(
'metadata'
=>
$targetClassMetadata
,
'parent'
=>
$parent
,
'relation'
=>
$relation
,
...
...
@@ -228,29 +235,24 @@ class Doctrine_Query_Production_RangeVariableDeclaration extends Doctrine_Query_
$tableAlias
=
$parserResult
->
generateTableAlias
(
$targetClassMetadata
->
getClassName
());
//echo "Table alias: " . $tableAlias . "\n";
$parserResult
->
setQueryComponent
(
$this
->
_identificationVariable
,
$queryComponent
);
$parserResult
->
setQueryComponent
(
$this
->
_identificationVariable
,
$this
->
_queryComponent
);
$parserResult
->
setTableAlias
(
$tableAlias
,
$this
->
_identificationVariable
);
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$visitor
->
visitRangeVariableDeclaration
(
$this
);
}
/* Getters */
public
function
getIdentifiers
()
{
return
$this
->
_identifiers
;
}
public
function
getQueryComponent
()
{
return
$this
->
_queryComponent
;
}
public
function
getIdentificationVariable
()
{
return
$this
->
_identificationVariable
;
...
...
lib/Doctrine/Query/Production/SelectClause.php
View file @
efca7941
...
...
@@ -86,26 +86,14 @@ class Doctrine_Query_Production_SelectClause extends Doctrine_Query_Production
return
$value
->
buildSql
();
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
foreach
(
$this
->
_selectExpressions
as
$expression
)
{
$expression
->
accept
(
$visitor
);
}
$visitor
->
visitSelectClause
(
$this
);
}
/* Getters */
public
function
isDistinct
()
{
return
$this
->
_isDistinct
;
}
public
function
getSelectExpressions
()
{
return
$this
->
_selectExpressions
;
...
...
lib/Doctrine/Query/Production/SelectExpression.php
View file @
efca7941
...
...
@@ -190,4 +190,23 @@ class Doctrine_Query_Production_SelectExpression extends Doctrine_Query_Producti
{
return
!
is_string
(
$value
);
}
/* Getters */
public
function
getLeftExpression
()
{
return
$this
->
_leftExpression
;
}
public
function
isSubselect
()
{
return
$this
->
_isSubselect
;
}
public
function
getFieldIdentificationVariable
()
{
return
$this
->
_fieldIdentificationVariable
;
}
}
lib/Doctrine/Query/Production/SelectStatement.php
View file @
efca7941
...
...
@@ -94,57 +94,38 @@ class Doctrine_Query_Production_SelectStatement extends Doctrine_Query_Productio
.
((
$this
->
_orderByClause
!==
null
)
?
' '
.
$this
->
_orderByClause
->
buildSql
()
:
''
);
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_selectClause
->
accept
(
$visitor
);
$this
->
_fromClause
->
accept
(
$visitor
);
if
(
$this
->
_whereClause
)
{
$this
->
_whereClause
->
accept
(
$visitor
);
}
if
(
$this
->
_groupByClause
)
{
$this
->
_groupByClause
->
accept
(
$visitor
);
}
if
(
$this
->
_havingClause
)
{
$this
->
_havingClause
->
accept
(
$visitor
);
}
if
(
$this
->
_orderByClause
)
{
$this
->
_orderByClause
->
accept
(
$visitor
);
}
$visitor
->
visitSelectStatement
(
$this
);
}
/* Getters */
public
function
getSelectClause
()
{
return
$this
->
_selectClause
;
}
public
function
getFromClause
()
{
return
$this
->
_fromClause
;
}
public
function
getWhereClause
()
{
return
$this
->
_whereClause
;
}
public
function
getGroupByClause
()
{
return
$this
->
_groupByClause
;
}
public
function
getHavingClause
()
{
return
$this
->
_havingClause
;
}
public
function
getOrderByClause
()
{
return
$this
->
_orderByClause
;
...
...
lib/Doctrine/Query/Production/SimpleConditionalExpression.php
View file @
efca7941
...
...
@@ -107,25 +107,14 @@ class Doctrine_Query_Production_SimpleConditionalExpression extends Doctrine_Que
return
$token
[
'type'
];
}
/**
* Visitor support
*
* @param object $visitor
*/
public
function
accept
(
$visitor
)
{
$this
->
_leftExpression
->
accept
(
$visitor
);
$this
->
_rightExpression
->
accept
(
$visitor
);
$visitor
->
visitSimpleConditionalExpression
(
$this
);
}
/* Getters */
public
function
getLeftExpression
()
{
return
$this
->
_leftExpression
;
}
public
function
getRightExpression
()
{
return
$this
->
_rightExpression
;
...
...
lib/Doctrine/Query/Production/WhereClause.php
View file @
efca7941
...
...
@@ -50,17 +50,8 @@ class Doctrine_Query_Production_WhereClause extends Doctrine_Query_Production
return
'WHERE '
.
$this
->
_conditionalExpression
->
buildSql
();
}
/**
* Visitor support.
*/
public
function
accept
(
$visitor
)
{
$this
->
_conditionalExpression
->
accept
(
$visitor
);
$visitor
->
visitWhereClause
(
$this
);
}
/* Getters */
public
function
getConditionalExpression
()
{
return
$this
->
_conditionalExpression
;
...
...
lib/Doctrine/Query/SqlBuilder.php
View file @
efca7941
query-language.txt
View file @
efca7941
...
...
@@ -37,7 +37,8 @@ OrderByItem = Expression ["ASC" | "DESC"]
GroupByItem = PathExpression
UpdateItem = PathExpression "=" (Expression | "NULL")
IdentificationVariableDeclaration = RangeVariableDeclaration [IndexBy] {Join [IndexBy]}
IdentificationVariableDeclaration = RangeVariableDeclaration [IndexBy] {JoinVariableDeclaration}
JoinVariableDeclaration = Join [IndexBy]
RangeVariableDeclaration = identifier {"." identifier} [["AS"] IdentificationVariable]
VariableDeclaration = identifier [["AS"] IdentificationVariable]
IdentificationVariable = identifier
...
...
tests/Orm/Query/SelectSqlGenerationTest.php
View file @
efca7941
...
...
@@ -167,4 +167,13 @@ 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 ca.user_id = cu.id WHERE 1 = 1'
);
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment