Author: guilhermeblanco
Date: 2008-09-03 06:28:53 +0100 (Wed, 03 Sep 2008)
New Revision: 4875
Modified:
trunk/query-language.txt
Log:
Some BNF changes and fixes...
Modified: trunk/query-language.txt
===================================================================
--- trunk/query-language.txt 2008-09-02 22:35:47 UTC (rev 4874)
+++ trunk/query-language.txt 2008-09-03 05:28:53 UTC (rev 4875)
@@ -14,10 +14,36 @@
* Initially Select and Sub-select DQL will not support LIMIT and OFFSET (due
to limit-subquery algorithm)
*/
+
/*
+ * TERMINALS
+ *
+ * identifier (name, email, ...)
+ * string ('foo', 'bar''s house', '%ninja%', ...)
+ * char ('/', '\\', ' ', ...)
+ * integer (-1, 0, 1, 34, ...)
+ * float (-0.23, 0.007, 1.245342E+8, ...)
+ * boolean (false, true)
+ */
+
+
+/*
+ * QUERY LANGUAGE (START)
+ */
+QueryLanguage ::= SelectStatement | UpdateStatement | DeleteStatement
+
+
+/*
+ * STATEMENTS
+ */
+SelectStatement ::= SelectClause FromClause [WhereClause] [GroupByClause]
[HavingClause] [OrderByClause]
+UpdateStatement ::= UpdateClause [WhereClause]
+DeleteStatement ::= DeleteClause [WhereClause]
+
+
+/*
* IDENTIFIERS
*/
-
IdentificationVariable ::= identifier
/* identifier that must be a class name */
@@ -42,152 +68,167 @@
/*
* PATH EXPRESSIONS
*/
-JoinAssociationPathExpression ::= JoinCollectionValuedPathExpression |
JoinSingleValuedAssociationPathExpression
-JoinCollectionValuedPathExpression ::= IdentificationVariable "."
CollectionValuedAssociationField
+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
+AssociationPathExpression ::= CollectionValuedPathExpression |
SingleValuedAssociationPathExpression
+SingleValuedPathExpression ::= StateFieldPathExpression |
SingleValuedAssociationPathExpression
+StateFieldPathExpression ::= {IdentificationVariable |
SingleValuedAssociationPathExpression} "." StateField
+SingleValuedAssociationPathExpression ::= IdentificationVariable "."
{SingleValuedAssociationField "."}* SingleValuedAssociationField
+CollectionValuedPathExpression ::= IdentificationVariable "."
{SingleValuedAssociationField "."}* CollectionValuedAssociationField
+StateField ::= {EmbeddedClassStateField "."}*
SimpleStateField
/*
- * QUERY LANGUAGE (START)
+ * CLAUSES
*/
-QueryLanguage ::= SelectStatement | UpdateStatement | DeleteStatement
+SelectClause ::= "SELECT" ["ALL" | "DISTINCT"] SelectExpression {","
SelectExpression}*
+SimpleSelectClause ::= "SELECT" ["ALL" | "DISTINCT"] SimpleSelectExpression
+DeleteClause ::= "DELETE" ["FROM"] AbstractSchemaName [["AS"]
IdentificationVariable]
+WhereClause ::= "WHERE" ConditionalExpression
+FromClause ::= "FROM" IdentificationVariableDeclaration {","
IdentificationVariableDeclaration}*
+SubselectFromClause ::= "FROM" SubselectIdentificationVariableDeclaration {","
SubselectIdentificationVariableDeclaration}*
+HavingClause ::= "HAVING" ConditionalExpression
+GroupByClause ::= "GROUP" "BY" GroupByItem {"," GroupByItem}*
+OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}*
+LimitClause ::= "LIMIT" integer
+OffsetClause ::= "OFFSET" integer
+UpdateClause ::= "UPDATE" AbstractSchemaName [["AS"]
IdentificationVariable] "SET" UpdateItem {"," UpdateItem}*
+Subselect ::= SimpleSelectClause SubselectFromClause [WhereClause]
[GroupByClause] [HavingClause] [OrderByClause]
-/*
- * STATEMENTS
- */
-SelectStatement ::= SelectClause FromClause [WhereClause] [GroupByClause]
[HavingClause] [OrderByClause]
-UpdateStatement ::= UpdateClause [WhereClause]
-DeleteStatement ::= DeleteClause [WhereClause]
/*
- * CLAUSES
- */
-SelectClause ::= "SELECT" ["ALL" | "DISTINCT"] SelectExpression {","
SelectExpression}*
-SimpleSelectClause ::= "SELECT" ["ALL" | "DISTINCT"] SelectExpression
-DeleteClause ::= "DELETE" ["FROM"] AbstractSchemaName [["AS"]
IdentificationVariable]
-WhereClause ::= "WHERE" ConditionalExpression
-FromClause ::= "FROM" IdentificationVariableDeclaration {","
IdentificationVariableDeclaration}*
-HavingClause ::= "HAVING" ConditionalExpression
-GroupByClause ::= "GROUP" "BY" GroupByItem {"," GroupByItem}*
-OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}*
-LimitClause ::= "LIMIT" integer
-OffsetClause ::= "OFFSET" integer
-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]
-
-/*
* ITEMS
*/
OrderByItem ::= StateFieldPathExpression ["ASC" | "DESC"]
GroupByItem ::= SingleValuedPathExpression
-UpdateItem ::= [IdentificationVariable"."]{StateField |
SingleValuedAssociationField} "=" NewValue
-NewValue ::= SimpleArithmeticExpression | StringPrimary | DatetimePrimary |
BooleanPrimary |
- EnumPrimary | SimpleEntityExpression | "NULL"
+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 ::= AbstractSchemaName [AS] IdentificationVariable
-Join ::= ["LEFT" ["OUTER"] | "INNER"] "JOIN" JoinAssociationPathExpression
[AS] IdentificationVariable [("ON" | "WITH") ConditionalExpression]
-IndexBy ::= "INDEX" "BY" StateFieldPathExpression
+IdentificationVariableDeclaration ::= RangeVariableDeclaration
[IndexBy] {JoinVariableDeclaration}*
+SubselectIdentificationVariableDeclaration ::=
IdentificationVariableDeclaration | AssociationPathExpression
+ ["AS"] IdentificationVariable
+JoinVariableDeclaration ::= Join [IndexBy]
+RangeVariableDeclaration ::= AbstractSchemaName ["AS"]
IdentificationVariable
+Join ::= ["LEFT" ["OUTER"] | "INNER"]
"JOIN" JoinAssociationPathExpression
+ ["AS"] IdentificationVariable
[("ON" | "WITH") ConditionalExpression]
+IndexBy ::= "INDEX" "BY"
StateFieldPathExpression
+
/*
* SELECT EXPRESSION
*/
-SelectExpression ::= IdentificationVariable ["." "*"] |
- (StateFieldPathExpression | AggregateExpression |
- "(" Subselect ")" ) [["AS"] FieldIdentificationVariable]
+SelectExpression ::= IdentificationVariable ["." "*"] |
+ (StateFieldPathExpression | AggregateExpression |
+ "(" Subselect ")" ) [["AS"]
FieldIdentificationVariable]
+SimpleSelectExpression ::= SingleValuedPathExpression | IdentificationVariable
| AggregateExpression
+
/*
* CONDITIONAL EXPRESSIONS
*/
-ConditionalExpression ::= ConditionalTerm | ConditionalExpression "OR"
ConditionalTerm
-ConditionalTerm ::= ConditionalFactor | ConditionalTerm "AND"
ConditionalFactor
-ConditionalFactor ::= ["NOT"] ConditionalPrimary
-ConditionalPrimary ::= SimpleConditionalExpression | "("
ConditionalExpression ")"
+ConditionalExpression ::= ConditionalTerm | ConditionalExpression "OR"
ConditionalTerm
+ConditionalTerm ::= ConditionalFactor | ConditionalTerm "AND"
ConditionalFactor
+ConditionalFactor ::= ["NOT"] ConditionalPrimary
+ConditionalPrimary ::= SimpleConditionalExpression | "("
ConditionalExpression ")"
+SimpleConditionalExpression ::= ComparisonExpression | BetweenExpression |
LikeExpression |
+ InExpression | NullComparisonExpression |
ExistsExpression |
+ EmptyCollectionComparisonExpression |
CollectionMemberExpression
/* 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
+CollectionMemberExpression ::= EntityExpression ["NOT"] "MEMBER"
["OF"] CollectionValuedPathExpression
-Atom ::= string | integer | float | boolean | input_parameter
/*
+ * LITERAL VALUES
+ */
+Literal ::= string | char | integer | float | boolean | InputParameter
+
+
+/*
+ * INPUT PARAMETER
+ */
+InputParameter ::= PositionalParameter | NamedParameter
+PositionalParameter ::= "?" integer
+NamedParameter ::= ":" string
+
+
+/*
* ARITHMETIC EXPRESSIONS
*/
-ArithmeticExpression ::= SimpleArithmeticExpression | "(" Subselect ")"
+ArithmeticExpression ::= SimpleArithmeticExpression | "(" Subselect ")"
SimpleArithmeticExpression ::= ArithmeticTerm | SimpleArithmeticExpression
("+"|"-") ArithmeticTerm
-ArithmeticTerm ::= ArithmeticFactor | ArithmeticTerm ("*" |"/")
ArithmeticFactor
-ArithmeticFactor ::= [("+" | "-")] ArithmeticPrimary
-ArithmeticPrimary ::= StateFieldPathExpression | Atom | "("
SimpleArithmeticExpression ")" | Function | AggregateExpression
+ArithmeticTerm ::= ArithmeticFactor | ArithmeticTerm ("*" |"/")
ArithmeticFactor
+ArithmeticFactor ::= [("+" | "-")] ArithmeticPrimary
+ArithmeticPrimary ::= StateFieldPathExpression | Literal | "("
SimpleArithmeticExpression ")" | Function | AggregateExpression
/*
* 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
+StringExpression ::= StringPrimary | "(" Subselect ")"
+StringPrimary ::= StateFieldPathExpression | string | InputParameter
| FunctionsReturningStrings | AggregateExpression
+BooleanExpression ::= BooleanPrimary | "(" Subselect ")"
+BooleanPrimary ::= StateFieldPathExpression | boolean | InputParameter
+EnumExpression ::= EnumPrimary | "(" Subselect ")"
+EnumPrimary ::= StateFieldPathExpression | string | InputParameter
+EntityExpression ::= SingleValuedAssociationPathExpression |
SimpleEntityExpression
+SimpleEntityExpression ::= IdentificationVariable | InputParameter
+DatetimeExpression ::= DatetimePrimary | "(" Subselect ")"
+DatetimePrimary ::= StateFieldPathExpression | InputParameter |
FunctionsReturningDatetime | AggregateExpression
+
/*
* AGGREGATE EXPRESSION
*/
AggregateExpression ::= ("AVG" | "MAX" | "MIN" | "SUM") "(" ["DISTINCT"]
StateFieldPathExpression ")" |
- "COUNT" "(" ["DISTINCT"] IdentificationVariable |
SingleValuedAssociationPathExpression | StateFieldPathExpression ")"
+ "COUNT" "(" ["DISTINCT"] (IdentificationVariable |
SingleValuedAssociationPathExpression | StateFieldPathExpression) ")"
+
/*
* QUANTIFIED/BETWEEN/COMPARISON/LIKE/NULL/EXISTS EXPRESSIONS
*/
QuantifiedExpression ::= ("ALL" | "ANY" | "SOME") "(" 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"
+ StringExpression ComparisonOperator
(StringExpression | QuantifiedExpression) |
+ BooleanExpression ("=" | "<>") (BooleanExpression
| QuantifiedExpression) |
+ EnumExpression ("=" | "<>") (EnumExpression |
QuantifiedExpression) |
+ DatetimeExpression ComparisonOperator
(DatetimeExpression | QuantifiedExpression) |
+ EntityExpression ("=" | "<>") (EntityExpression |
QuantifiedExpression)
+InExpression ::= StateFieldPathExpression ["NOT"] "IN" "("
(Literal {"," Literal}* | Subselect) ")"
+LikeExpression ::= ["NOT"] "LIKE" string ["ESCAPE" char]
+NullComparisonExpression ::= (SingleValuedPathExpression | InputParameter)
"IS" ["NOT"] "NULL"
ExistsExpression ::= ["NOT"] "EXISTS" "(" Subselect ")"
-ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!="
+ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!="
+
/*
* FUNCTIONS
*/
-FunctionsReturningStrings ::= PortableFunctionsReturningStrings |
OtherFunctionsReturningStrings
+FunctionsReturningStrings ::= PortableFunctionsReturningStrings |
OtherFunctionsReturningStrings
FunctionsReturningNumerics ::= PortableFunctionsReturningNumerics |
OtherFunctionsReturningNumerics
FunctionsReturningDateTime ::= PortableFunctionsReturningDateTime |
OtherFunctionsReturningDateTime
+
/*
* OTHER FUNCTIONS: List of all allowed (but not portable) functions here.
*/
-OtherFunctionsReturningStrings ::= ...
+OtherFunctionsReturningStrings ::= ...
OtherFunctionsReturningNumerics ::= ...
OtherFunctionsReturningDateTime ::= ...
+
/*
* PORTABLE FUNCTIONS: List all portable functions here
* @TODO add all supported portable functions here
@@ -204,6 +245,6 @@
PortableFunctionsReturningStrings ::=
"CONCAT" "(" StringPrimary "," StringPrimary ")" |
"SUBSTRING" "(" StringPrimary "," SimpleArithmeticExpression ","
SimpleArithmeticExpression ")" |
- "TRIM" "(" [["LEADING" | "TRAILING" | "BOTH"] [trim_character] "FROM"]
StringPrimary ")" |
+ "TRIM" "(" [["LEADING" | "TRAILING" | "BOTH"] [char] "FROM"]
StringPrimary ")" |
"LOWER" "(" StringPrimary ")" |
- "UPPER" "(" StringPrimary ")"
+ "UPPER" "(" StringPrimary ")"
\ No newline at end of file
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---