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
a430d22c
Commit
a430d22c
authored
May 15, 2007
by
zYne
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
--no commit message
--no commit message
parent
60276421
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
830 additions
and
791 deletions
+830
-791
Query.php
draft/new-core/Query.php
+821
-3
Doctrine.php
lib/Doctrine.php
+2
-2
From.php
lib/Doctrine/Query/From.php
+1
-166
Parser.php
lib/Doctrine/Query/Parser.php
+0
-384
Select.php
lib/Doctrine/Query/Select.php
+3
-233
Where.php
lib/Doctrine/Query/Where.php
+3
-3
No files found.
draft/new-core/Query.php
View file @
a430d22c
This diff is collapsed.
Click to expand it.
lib/Doctrine.php
View file @
a430d22c
...
...
@@ -495,9 +495,9 @@ final class Doctrine
case
'array'
:
$ret
[]
=
'Array('
;
foreach
(
$var
as
$k
=>
$v
)
{
$ret
[]
=
$k
.
' : '
.
Doctrine
::
dump
(
$v
);
$ret
[]
=
$k
.
' : '
.
Doctrine
::
dump
(
$v
,
false
);
}
$ret
[]
=
')'
;
$ret
[]
=
")"
;
break
;
case
'object'
:
$ret
[]
=
'Object('
.
get_class
(
$var
)
.
')'
;
...
...
lib/Doctrine/Query/From.php
View file @
a430d22c
...
...
@@ -31,8 +31,7 @@ Doctrine::autoload("Doctrine_Query_Part");
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
*/
class
Doctrine_Query_From
extends
Doctrine_Query_Part
{
{
/**
* DQL FROM PARSER
* parses the from part of the query string
...
...
@@ -85,169 +84,5 @@ class Doctrine_Query_From extends Doctrine_Query_Part
$operator
=
(
$last
==
'INNER'
)
?
':'
:
'.'
;
}
}
public
function
load
(
$path
,
$loadFields
=
true
)
{
// parse custom join conditions
$e
=
explode
(
' ON '
,
$path
);
$joinCondition
=
''
;
if
(
count
(
$e
)
>
1
)
{
$joinCondition
=
' AND '
.
$e
[
1
];
$path
=
$e
[
0
];
}
$tmp
=
explode
(
' '
,
$path
);
$componentAlias
=
(
count
(
$tmp
)
>
1
)
?
end
(
$tmp
)
:
false
;
$e
=
preg_split
(
"/[.:]/"
,
$tmp
[
0
],
-
1
);
$fullPath
=
$tmp
[
0
];
$prevPath
=
''
;
$fullLength
=
strlen
(
$fullPath
);
if
(
isset
(
$this
->
_aliasMap
[
$e
[
0
]]))
{
$table
=
$this
->
_aliasMap
[
$e
[
0
]][
'table'
];
$prevPath
=
$parent
=
array_shift
(
$e
);
}
foreach
(
$e
as
$key
=>
$name
)
{
// get length of the previous path
$length
=
strlen
(
$prevPath
);
// build the current component path
$prevPath
=
(
$prevPath
)
?
$prevPath
.
'.'
.
$name
:
$name
;
$delimeter
=
substr
(
$fullPath
,
$length
,
1
);
// if an alias is not given use the current path as an alias identifier
if
(
strlen
(
$prevPath
)
!==
$fullLength
||
!
$componentAlias
)
{
$componentAlias
=
$prevPath
;
}
if
(
!
isset
(
$table
))
{
// process the root of the path
$table
=
$this
->
loadRoot
(
$name
,
$componentAlias
);
}
else
{
$join
=
(
$delimeter
==
':'
)
?
'INNER JOIN '
:
'LEFT JOIN '
;
$relation
=
$table
->
getRelation
(
$name
);
$this
->
_aliasMap
[
$componentAlias
]
=
array
(
'table'
=>
$relation
->
getTable
(),
'parent'
=>
$parent
,
'relation'
=>
$relation
);
if
(
!
$relation
->
isOneToOne
())
{
$this
->
needsSubquery
=
true
;
}
$localAlias
=
$this
->
getShortAlias
(
$parent
,
$table
->
getTableName
());
$foreignAlias
=
$this
->
getShortAlias
(
$componentAlias
,
$relation
->
getTable
()
->
getTableName
());
$localSql
=
$this
->
conn
->
quoteIdentifier
(
$table
->
getTableName
())
.
' '
.
$localAlias
;
$foreignSql
=
$this
->
conn
->
quoteIdentifier
(
$relation
->
getTable
()
->
getTableName
())
.
' '
.
$foreignAlias
;
$map
=
$relation
->
getTable
()
->
inheritanceMap
;
if
(
!
$loadFields
||
!
empty
(
$map
)
||
$joinCondition
)
{
$this
->
subqueryAliases
[]
=
$foreignAlias
;
}
if
(
$relation
instanceof
Doctrine_Relation_Association
)
{
$asf
=
$relation
->
getAssociationFactory
();
$assocTableName
=
$asf
->
getTableName
();
if
(
!
$loadFields
||
!
empty
(
$map
)
||
$joinCondition
)
{
$this
->
subqueryAliases
[]
=
$assocTableName
;
}
$assocPath
=
$prevPath
.
'.'
.
$asf
->
getComponentName
();
$assocAlias
=
$this
->
getShortAlias
(
$assocPath
,
$asf
->
getTableName
());
$queryPart
=
$join
.
$assocTableName
.
' '
.
$assocAlias
.
' ON '
.
$localAlias
.
'.'
.
$table
->
getIdentifier
()
.
' = '
.
$assocAlias
.
'.'
.
$relation
->
getLocal
();
if
(
$relation
instanceof
Doctrine_Relation_Association_Self
)
{
$queryPart
.=
' OR '
.
$localAlias
.
'.'
.
$table
->
getIdentifier
()
.
' = '
.
$assocAlias
.
'.'
.
$relation
->
getForeign
();
}
$this
->
parts
[
'from'
][]
=
$queryPart
;
$queryPart
=
$join
.
$foreignSql
.
' ON '
.
$foreignAlias
.
'.'
.
$relation
->
getTable
()
->
getIdentifier
()
.
' = '
.
$assocAlias
.
'.'
.
$relation
->
getForeign
()
.
$joinCondition
;
if
(
$relation
instanceof
Doctrine_Relation_Association_Self
)
{
$queryPart
.=
' OR '
.
$foreignTable
.
'.'
.
$table
->
getIdentifier
()
.
' = '
.
$assocAlias
.
'.'
.
$relation
->
getLocal
();
}
}
else
{
$queryPart
=
$join
.
$foreignSql
.
' ON '
.
$localAlias
.
'.'
.
$relation
->
getLocal
()
.
' = '
.
$foreignAlias
.
'.'
.
$relation
->
getForeign
()
.
$joinCondition
;
}
$this
->
parts
[
'from'
][]
=
$queryPart
;
}
if
(
$loadFields
)
{
$restoreState
=
false
;
// load fields if necessary
if
(
$loadFields
&&
empty
(
$this
->
pendingFields
))
{
$this
->
pendingFields
[
$componentAlias
]
=
array
(
'*'
);
$restoreState
=
true
;
}
if
(
isset
(
$this
->
pendingFields
[
$componentAlias
]))
{
$this
->
processPendingFields
(
$componentAlias
);
}
if
(
$restoreState
)
{
$this
->
pendingFields
=
array
();
}
if
(
isset
(
$this
->
pendingAggregates
[
$componentAlias
])
||
isset
(
$this
->
pendingAggregates
[
0
]))
{
$this
->
processPendingAggregates
(
$componentAlias
);
}
}
}
}
/**
* loadRoot
*
* @param string $name
* @param string $componentAlias
*/
public
function
loadRoot
(
$name
,
$componentAlias
)
{
// get the connection for the component
$this
->
conn
=
Doctrine_Manager
::
getInstance
()
->
getConnectionForComponent
(
$name
);
$table
=
$this
->
conn
->
getTable
(
$name
);
$tableName
=
$table
->
getTableName
();
// get the short alias for this table
$tableAlias
=
$this
->
aliasHandler
->
getShortAlias
(
$componentAlias
,
$tableName
);
// quote table name
$queryPart
=
$this
->
conn
->
quoteIdentifier
(
$tableName
);
if
(
$this
->
type
===
self
::
SELECT
)
{
$queryPart
.=
' '
.
$tableAlias
;
}
$this
->
parts
[
'from'
][]
=
$queryPart
;
$this
->
tableAliases
[
$tableAlias
]
=
$componentAlias
;
$this
->
_aliasMap
[
$componentAlias
]
=
array
(
'table'
=>
$table
);
return
$table
;
}
}
lib/Doctrine/Query/Parser.php
View file @
a430d22c
This diff is collapsed.
Click to expand it.
lib/Doctrine/Query/Select.php
View file @
a430d22c
...
...
@@ -32,240 +32,10 @@ Doctrine::autoload("Doctrine_Query_Part");
*/
class
Doctrine_Query_Select
extends
Doctrine_Query_Part
{
/**
* processPendingFields
* the fields in SELECT clause cannot be parsed until the components
* in FROM clause are parsed, hence this method is called everytime a
* specific component is being parsed.
*
* @throws Doctrine_Query_Exception if unknown component alias has been given
* @param string $componentAlias the alias of the component
* @return void
*/
public
function
processPendingFields
(
$componentAlias
)
public
function
parse
(
$dql
)
{
$tableAlias
=
$this
->
getTableAlias
(
$componentAlias
);
$table
=
$this
->
_aliasMap
[
$componentAlias
][
'table'
];
if
(
isset
(
$this
->
pendingFields
[
$componentAlias
]))
{
$fields
=
$this
->
pendingFields
[
$componentAlias
];
// check for wildcards
if
(
in_array
(
'*'
,
$fields
))
{
$fields
=
$table
->
getColumnNames
();
}
else
{
// only auto-add the primary key fields if this query object is not
// a subquery of another query object
if
(
!
$this
->
isSubquery
)
{
$fields
=
array_unique
(
array_merge
(
$table
->
getPrimaryKeys
(),
$fields
));
}
}
}
foreach
(
$fields
as
$name
)
{
$name
=
$table
->
getColumnName
(
$name
);
$this
->
parts
[
'select'
][]
=
$tableAlias
.
'.'
.
$name
.
' AS '
.
$tableAlias
.
'__'
.
$name
;
}
$this
->
query
->
parseSelect
(
$dql
);
$this
->
neededTables
[]
=
$tableAlias
;
}
/**
* parseSelect
* parses the query select part and
* adds selected fields to pendingFields array
*
* @param string $dql
*/
public
function
parseSelect
(
$dql
)
{
$refs
=
Doctrine_Query
::
bracketExplode
(
$dql
,
','
);
foreach
(
$refs
as
$reference
)
{
if
(
strpos
(
$reference
,
'('
)
!==
false
)
{
if
(
substr
(
$reference
,
0
,
1
)
===
'('
)
{
// subselect found in SELECT part
$this
->
parseSubselect
(
$reference
);
}
else
{
$this
->
parseAggregateFunction2
(
$reference
);
}
}
else
{
$e
=
explode
(
'.'
,
$reference
);
if
(
count
(
$e
)
>
2
)
{
$this
->
pendingFields
[]
=
$reference
;
}
else
{
$this
->
pendingFields
[
$e
[
0
]][]
=
$e
[
1
];
}
}
}
}
/**
* parseSubselect
*
* parses the subquery found in DQL SELECT part and adds the
* parsed form into $pendingSubqueries stack
*
* @param string $reference
* @return void
*/
public
function
parseSubselect
(
$reference
)
{
$e
=
Doctrine_Query
::
bracketExplode
(
$reference
,
' '
);
$alias
=
$e
[
1
];
if
(
count
(
$e
)
>
2
)
{
if
(
strtoupper
(
$e
[
1
])
!==
'AS'
)
{
throw
new
Doctrine_Query_Exception
(
'Syntax error near: '
.
$reference
);
}
$alias
=
$e
[
2
];
}
$subquery
=
substr
(
$e
[
0
],
1
,
-
1
);
$this
->
pendingSubqueries
[]
=
array
(
$subquery
,
$alias
);
}
public
function
parseAggregateFunction2
(
$func
)
{
$e
=
Doctrine_Query
::
bracketExplode
(
$func
,
' '
);
$func
=
$e
[
0
];
$pos
=
strpos
(
$func
,
'('
);
$name
=
substr
(
$func
,
0
,
$pos
);
try
{
$argStr
=
substr
(
$func
,
(
$pos
+
1
),
-
1
);
$args
=
explode
(
','
,
$argStr
);
$func
=
call_user_func_array
(
array
(
$this
->
conn
->
expression
,
$name
),
$args
);
if
(
substr
(
$func
,
0
,
1
)
!==
'('
)
{
$pos
=
strpos
(
$func
,
'('
);
$name
=
substr
(
$func
,
0
,
$pos
);
}
else
{
$name
=
$func
;
}
$e2
=
explode
(
' '
,
$args
[
0
]);
$distinct
=
''
;
if
(
count
(
$e2
)
>
1
)
{
if
(
strtoupper
(
$e2
[
0
])
==
'DISTINCT'
)
$distinct
=
'DISTINCT '
;
$args
[
0
]
=
$e2
[
1
];
}
$parts
=
explode
(
'.'
,
$args
[
0
]);
$owner
=
$parts
[
0
];
$alias
=
(
isset
(
$e
[
1
]))
?
$e
[
1
]
:
$name
;
$e3
=
explode
(
'.'
,
$alias
);
if
(
count
(
$e3
)
>
1
)
{
$alias
=
$e3
[
1
];
$owner
=
$e3
[
0
];
}
// a function without parameters eg. RANDOM()
if
(
$owner
===
''
)
{
$owner
=
0
;
}
$this
->
pendingAggregates
[
$owner
][]
=
array
(
$name
,
$args
,
$distinct
,
$alias
);
}
catch
(
Doctrine_Expression_Exception
$e
)
{
throw
new
Doctrine_Query_Exception
(
'Unknown function '
.
$func
.
'.'
);
}
}
public
function
processPendingSubqueries
()
{
if
(
$this
->
subqueriesProcessed
===
true
)
{
return
false
;
}
foreach
(
$this
->
pendingSubqueries
as
$value
)
{
list
(
$dql
,
$alias
)
=
$value
;
$sql
=
$this
->
createSubquery
()
->
parseQuery
(
$dql
,
false
)
->
getQuery
();
reset
(
$this
->
tableAliases
);
$tableAlias
=
current
(
$this
->
tableAliases
);
reset
(
$this
->
compAliases
);
$componentAlias
=
key
(
$this
->
compAliases
);
$sqlAlias
=
$tableAlias
.
'__'
.
count
(
$this
->
aggregateMap
);
$this
->
parts
[
'select'
][]
=
'('
.
$sql
.
') AS '
.
$sqlAlias
;
$this
->
aggregateMap
[
$alias
]
=
$sqlAlias
;
$this
->
subqueryAggregates
[
$componentAlias
][]
=
$alias
;
}
$this
->
subqueriesProcessed
=
true
;
return
true
;
}
public
function
processPendingAggregates
(
$componentAlias
)
{
$tableAlias
=
$this
->
getTableAlias
(
$componentAlias
);
if
(
!
isset
(
$this
->
tables
[
$tableAlias
]))
{
throw
new
Doctrine_Query_Exception
(
'Unknown component path '
.
$componentAlias
);
}
$root
=
current
(
$this
->
tables
);
$table
=
$this
->
tables
[
$tableAlias
];
$aggregates
=
array
();
if
(
isset
(
$this
->
pendingAggregates
[
$componentAlias
]))
{
$aggregates
=
$this
->
pendingAggregates
[
$componentAlias
];
}
if
(
$root
===
$table
)
{
if
(
isset
(
$this
->
pendingAggregates
[
0
]))
{
$aggregates
+=
$this
->
pendingAggregates
[
0
];
}
}
foreach
(
$aggregates
as
$parts
)
{
list
(
$name
,
$args
,
$distinct
,
$alias
)
=
$parts
;
$arglist
=
array
();
foreach
(
$args
as
$arg
)
{
$e
=
explode
(
'.'
,
$arg
);
if
(
is_numeric
(
$arg
))
{
$arglist
[]
=
$arg
;
}
elseif
(
count
(
$e
)
>
1
)
{
//$tableAlias = $this->getTableAlias($e[0]);
$table
=
$this
->
tables
[
$tableAlias
];
$e
[
1
]
=
$table
->
getColumnName
(
$e
[
1
]);
if
(
!
$table
->
hasColumn
(
$e
[
1
]))
{
throw
new
Doctrine_Query_Exception
(
'Unknown column '
.
$e
[
1
]);
}
$arglist
[]
=
$tableAlias
.
'.'
.
$e
[
1
];
}
else
{
$arglist
[]
=
$e
[
0
];
}
}
$sqlAlias
=
$tableAlias
.
'__'
.
count
(
$this
->
aggregateMap
);
if
(
substr
(
$name
,
0
,
1
)
!==
'('
)
{
$this
->
parts
[
'select'
][]
=
$name
.
'('
.
$distinct
.
implode
(
', '
,
$arglist
)
.
') AS '
.
$sqlAlias
;
}
else
{
$this
->
parts
[
'select'
][]
=
$name
.
' AS '
.
$sqlAlias
;
}
$this
->
aggregateMap
[
$alias
]
=
$sqlAlias
;
$this
->
neededTables
[]
=
$tableAlias
;
}
return
$this
->
query
;
}
}
lib/Doctrine/Query/Where.php
View file @
a430d22c
...
...
@@ -110,7 +110,7 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition
foreach
(
$values
as
$value
)
{
$where
[]
=
$alias
.
'.'
.
$relation
->
getLocal
()
.
' IN (SELECT '
.
$relation
->
getForeign
()
.
' FROM '
.
$relation
->
getTable
()
->
getTableName
()
.
' FROM '
.
$relation
->
getTable
()
->
getTableName
()
.
' WHERE '
.
$field
.
$operator
.
$value
.
')'
;
}
$where
=
implode
(
' AND '
,
$where
);
...
...
@@ -178,8 +178,8 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition
$fieldname
=
$field
;
}
$where
=
$fieldname
.
' '
.
$operator
.
' '
.
$value
;
$where
=
$fieldname
.
' '
.
$operator
.
' '
.
$value
;
}
}
}
...
...
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