Author: romanb
Date: 2008-09-02 20:58:54 +0100 (Tue, 02 Sep 2008)
New Revision: 4872
Modified:
trunk/query-language.txt
Log:
DQL BNF overhaul. Streamlining with JPQL spec.
Modified: trunk/query-language.txt
===================================================================
--- trunk/query-language.txt 2008-09-02 17:35:22 UTC (rev 4871)
+++ trunk/query-language.txt 2008-09-02 19:58:54 UTC (rev 4872)
@@ -14,16 +14,63 @@
* Initially Select and Sub-select DQL will not support LIMIT and OFFSET (due
to limit-subquery algorithm)
*/
+/*
+ * IDENTIFIERS
+ */
+
+IdentificationVariable ::= identifier
+
+/* identifier that must be a class name */
+AbstractSchemaName ::= identifier
+
+/* identifier that must be a field */
+FieldIdentificationVariable ::= identifier
+
+/* identifier that must be a collection-valued association field (to-many) */
+CollectionValuedAssociationField ::= FieldIdentificationVariable
+
+/* identifier that must be a single-valued association field (to-one) */
+SingleValuedAssociationField ::= FieldIdentificationVariable
+
+/* identifier that must be an embedded class state field (for the future) */
+EmbeddedClassStateField ::= FieldIdentificationVariable
+
+/* identifier that must be a simple state field (name, email, ...) */
+SimpleStateField ::= FieldIdentificationVariable
+
+
+/*
+ * PATH EXPRESSIONS
+ */
+JoinAssociationPathExpression ::= JoinCollectionValuedPathExpression |
JoinSingleValuedAssociationPathExpression
+JoinCollectionValuedPathExpression ::= IdentificationVariable "."
CollectionValuedAssociationField
+JoinSingleValuedAssociationPathExpression ::= IdentificationVariable "."
SingleValuedAssociationField
+AssociationPathExpression ::= CollectionValuedPathExpression |
SingleValuedAssociationPathExpression
+SingleValuedPathExpression ::= StateFieldPathExpression |
SingleValuedAssociationPathExpression
+StateFieldPathExpression ::= {IdentificationVariable |
SingleValuedAssociationPathExpression} "." StateField
+SingleValuedAssociationPathExpression ::= IdentificationVariable "."
{SingleValuedAssociationField "."}* SingleValuedAssociationField
+CollectionValuedPathExpression ::= IdentificationVariable "."
{SingleValuedAssociationField "."}*CollectionValuedAssociationField
+StateField ::= {EmbeddedClassStateField
"."}*SimpleStateField
+
+
+/*
+ * QUERY LANGUAGE (START)
+ */
QueryLanguage ::= SelectStatement | UpdateStatement | DeleteStatement
+/*
+ * STATEMENTS
+ */
SelectStatement ::= SelectClause FromClause [WhereClause] [GroupByClause]
[HavingClause] [OrderByClause]
UpdateStatement ::= UpdateClause [WhereClause]
DeleteStatement ::= DeleteClause [WhereClause]
-Subselect ::= SimpleSelectClause FromClause [WhereClause]
[GroupByClause] [HavingClause] [OrderByClause]
+/*
+ * CLAUSES
+ */
SelectClause ::= "SELECT" ["ALL" | "DISTINCT"] SelectExpression {","
SelectExpression}*
SimpleSelectClause ::= "SELECT" ["ALL" | "DISTINCT"] SelectExpression
-DeleteClause ::= "DELETE" ["FROM"] VariableDeclaration
+DeleteClause ::= "DELETE" ["FROM"] AbstractSchemaName [["AS"]
IdentificationVariable]
WhereClause ::= "WHERE" ConditionalExpression
FromClause ::= "FROM" IdentificationVariableDeclaration {","
IdentificationVariableDeclaration}*
HavingClause ::= "HAVING" ConditionalExpression
@@ -31,52 +78,132 @@
OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}*
LimitClause ::= "LIMIT" integer
OffsetClause ::= "OFFSET" integer
-UpdateClause ::= "UPDATE" VariableDeclaration "SET" UpdateItem {","
UpdateItem}*
+UpdateClause ::= "UPDATE" AbstractSchemaName [["AS"]
IdentificationVariable] "SET" UpdateItem {"," UpdateItem}*
+/* TODO: subselect needs to be changed maybe. See JPQL spec. */
+Subselect ::= SimpleSelectClause FromClause [WhereClause]
[GroupByClause] [HavingClause] [OrderByClause]
-OrderByItem ::= Expression ["ASC" | "DESC"]
-GroupByItem ::= PathExpression
-UpdateItem ::= PathExpression "=" (Expression | "NULL")
+/*
+ * ITEMS
+ */
+OrderByItem ::= StateFieldPathExpression ["ASC" | "DESC"]
+GroupByItem ::= SingleValuedPathExpression
+UpdateItem ::= [IdentificationVariable"."]{StateField |
SingleValuedAssociationField} "=" NewValue
+NewValue ::= SimpleArithmeticExpression | StringPrimary | DatetimePrimary |
BooleanPrimary |
+ EnumPrimary | SimpleEntityExpression | "NULL"
+/*
+ * FROM/JOIN/INDEX BY
+ */
IdentificationVariableDeclaration ::= RangeVariableDeclaration [IndexBy]
{JoinVariableDeclaration}*
JoinVariableDeclaration ::= Join [IndexBy]
-RangeVariableDeclaration ::= identifier {"." identifier}* [["AS"]
IdentificationVariable]
-VariableDeclaration ::= identifier [["AS"] IdentificationVariable]
-IdentificationVariable ::= identifier
+RangeVariableDeclaration ::= AbstractSchemaName [AS] IdentificationVariable
+Join ::= ["LEFT" ["OUTER"] | "INNER"] "JOIN" JoinAssociationPathExpression
[AS] IdentificationVariable [("ON" | "WITH") ConditionalExpression]
+IndexBy ::= "INDEX" "BY" StateFieldPathExpression
-Join ::= ["LEFT" | "INNER"] "JOIN" RangeVariableDeclaration [("ON" | "WITH")
ConditionalExpression]
-IndexBy ::= "INDEX" "BY" identifier
+/*
+ * SELECT EXPRESSION
+ */
+SelectExpression ::= IdentificationVariable ["." "*"] |
+ (StateFieldPathExpression | AggregateExpression |
+ "(" Subselect ")" ) [["AS"] FieldIdentificationVariable]
-ConditionalExpression ::= ConditionalTerm {"OR" ConditionalTerm}*
-ConditionalTerm ::= ConditionalFactor {"AND" ConditionalFactor}*
+/*
+ * CONDITIONAL EXPRESSIONS
+ */
+ConditionalExpression ::= ConditionalTerm | ConditionalExpression "OR"
ConditionalTerm
+ConditionalTerm ::= ConditionalFactor | ConditionalTerm "AND"
ConditionalFactor
ConditionalFactor ::= ["NOT"] ConditionalPrimary
ConditionalPrimary ::= SimpleConditionalExpression | "("
ConditionalExpression ")"
-SimpleConditionalExpression
- ::= Expression (ComparisonExpression | BetweenExpression
| LikeExpression
- | InExpression | NullComparisonExpression) |
ExistsExpression
+/* EmptyCollectionComparisonExpression and CollectionMemberExpression are for
the future */
+SimpleConditionalExpression ::= ComparisonExpression | BetweenExpression |
LikeExpression |
+ InExpression | NullComparisonExpression |
ExistsExpression |
+ EmptyCollectionComparisonExpression |
CollectionMemberExpression
+/*
+ * COLLECTION EXPRESSIONS (FOR THE FUTURE)
+ */
+EmptyCollectionComparisonExpression ::= CollectionValuedPathExpression "IS"
["NOT"] "EMPTY"
+CollectionMemberExpression ::= EntityExpression ["NOT"] "MEMBER" ["OF"]
CollectionValuedPathExpression
+
Atom ::= string | integer | float | boolean | input_parameter
-Expression ::= Term {("+" | "-") Term}*
-Term ::= Factor {("*" | "/") Factor}*
-Factor ::= [("+" | "-")] Primary
-Primary ::= PathExpression | Atom | "(" Expression ")" | Function |
AggregateExpression
+/*
+ * ARITHMETIC EXPRESSIONS
+ */
+ArithmeticExpression ::= SimpleArithmeticExpression | "(" Subselect ")"
+SimpleArithmeticExpression ::= ArithmeticTerm | SimpleArithmeticExpression
("+"|"-") ArithmeticTerm
+ArithmeticTerm ::= ArithmeticFactor | ArithmeticTerm ("*" |"/")
ArithmeticFactor
+ArithmeticFactor ::= [("+" | "-")] ArithmeticPrimary
+ArithmeticPrimary ::= StateFieldPathExpression | Atom | "("
SimpleArithmeticExpression ")" | Function | AggregateExpression
-SelectExpression ::= (PathExpressionEndingWithAsterisk | Expression | "("
Subselect ")" ) [["AS"] FieldIdentificationVariable]
-PathExpression ::= identifier {"." identifier}*
-PathExpressionEndingWithAsterisk ::= {identifier "."}* "*"
-FieldIdentificationVariable ::= identifier
-AggregateExpression ::= ("AVG" | "MAX" | "MIN" | "SUM") "(" ["DISTINCT"]
Expression ")"
- | "COUNT" "(" ["DISTINCT"] (Expression | "*") ")"
+/*
+ * STRING/BOOLEAN/DATE/ENTITY/ENUM EXPRESSIONS
+ */
+StringExpression ::= StringPrimary | "(" Subselect ")"
+StringPrimary ::= StateFieldPathExpression | string_literal | input_parameter
| FunctionsReturningStrings | AggregateExpression
+BooleanExpression ::= BooleanPrimary | "(" Subselect ")"
+BooleanPrimary ::= StateFieldPathExpression | boolean_literal | input_parameter
+EnumExpression ::= EnumPrimary | "(" Subselect ")"
+EnumPrimary ::= StateFieldPathExpression | enum_literal | input_parameter
+EntityExpression ::= SingleValuedAssociationPathExpression |
SimpleEntityExpression
+SimpleEntityExpression ::= IdentificationVariable | input_parameter
+DatetimeExpression ::= DatetimePrimary | "(" Subselect ")"
+DatetimePrimary ::= StateFieldPathExpression | input_parameter |
FunctionsReturningDatetime | AggregateExpression
+/*
+ * AGGREGATE EXPRESSION
+ */
+AggregateExpression ::= ("AVG" | "MAX" | "MIN" | "SUM") "(" ["DISTINCT"]
StateFieldPathExpression ")" |
+ "COUNT" "(" ["DISTINCT"] IdentificationVariable |
SingleValuedAssociationPathExpression | StateFieldPathExpression ")"
+
+/*
+ * QUANTIFIED/BETWEEN/COMPARISON/LIKE/NULL/EXISTS EXPRESSIONS
+ */
QuantifiedExpression ::= ("ALL" | "ANY" | "SOME") "(" Subselect ")"
-BetweenExpression ::= ["NOT"] "BETWEEN" Expression "AND" Expression
-ComparisonExpression ::= ComparisonOperator ( QuantifiedExpression |
Expression | "(" Subselect ")" )
-InExpression ::= ["NOT"] "IN" "(" (Atom {"," Atom}* | Subselect)
")"
-LikeExpression ::= ["NOT"] "LIKE" Expression ["ESCAPE" string]
-NullComparisonExpression ::= "IS" ["NOT"] "NULL"
-ExistsExpression ::= "EXISTS" "(" Subselect ")"
-
+BetweenExpression ::= ArithmeticExpression ["NOT"] "BETWEEN"
ArithmeticExpression "AND" ArithmeticExpression
+ComparisonExpression ::= ArithmeticExpression ComparisonOperator (
QuantifiedExpression | ArithmeticExpression ) |
+ StringExpression ComparisonOperator
(StringExpression | QuantifiedExpression) |
+ BooleanExpression ("=" | "<>") (BooleanExpression
| QuantifiedExpression) |
+ EnumExpression ("=" | "<>") (EnumExpression |
QuantifiedExpression) |
+ DatetimeExpression ComparisonOperator
(DatetimeExpression | QuantifiedExpression) |
+ EntityExpression ("=" | "<>") (EntityExpression |
QuantifiedExpression)
+InExpression ::= StateFieldPathExpression ["NOT"] "IN" "(" (Atom
{"," Atom}* | Subselect) ")"
+LikeExpression ::= ["NOT"] "LIKE" pattern_value ["ESCAPE"
escape_character]
+NullComparisonExpression ::= (SingleValuedPathExpression | input_parameter)
"IS" ["NOT"] "NULL"
+ExistsExpression ::= ["NOT"] "EXISTS" "(" Subselect ")"
ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!="
-Function ::= identifier "(" [Expression {"," Expression}*] ")"
+/*
+ * FUNCTIONS
+ */
+FunctionsReturningStrings ::= PortableFunctionsReturningStrings |
OtherFunctionsReturningStrings
+FunctionsReturningNumerics ::= PortableFunctionsReturningNumerics |
OtherFunctionsReturningNumerics
+FunctionsReturningDateTime ::= PortableFunctionsReturningDateTime |
OtherFunctionsReturningDateTime
+
+/*
+ * OTHER FUNCTIONS: List of all allowed (but not portable) functions here.
+ */
+OtherFunctionsReturningStrings ::= ...
+OtherFunctionsReturningNumerics ::= ...
+OtherFunctionsReturningDateTime ::= ...
+
+/*
+ * PORTABLE FUNCTIONS: List all portable functions here
+ * @TODO add all supported portable functions here
+ */
+PortableFunctionsReturningNumerics ::=
+ "LENGTH" "(" StringPrimary ")" |
+ "LOCATE" "(" StringPrimary "," StringPrimary [","
SimpleArithmeticExpression]")" |
+ "ABS" "(" SimpleArithmeticExpression ")" | "SQRT" "("
SimpleArithmeticExpression ")" |
+ "MOD" "(" SimpleArithmeticExpression "," SimpleArithmeticExpression
")" |
+ "SIZE" "(" CollectionValuedPathExpression ")"
+
+PortableFunctionsReturningDateTime ::= "CURRENT_DATE" | "CURRENT_TIME" |
"CURRENT_TIMESTAMP"
+
+PortableFunctionsReturningStrings ::=
+ "CONCAT" "(" StringPrimary "," StringPrimary ")" |
+ "SUBSTRING" "(" StringPrimary "," SimpleArithmeticExpression ","
SimpleArithmeticExpression ")" |
+ "TRIM" "(" [["LEADING" | "TRAILING" | "BOTH"] [trim_character] "FROM"]
StringPrimary ")" |
+ "LOWER" "(" StringPrimary ")" |
+ "UPPER" "(" StringPrimary ")"
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"doctrine-svn" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.co.uk/group/doctrine-svn?hl=en-GB
-~----------~----~----~----~------~----~------~--~---