You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mp...@apache.org on 2006/08/30 20:16:41 UTC
svn commit: r438573 - in /incubator/openjpa/trunk/openjpa-kernel/src/main:
java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
Author: mprudhom
Date: Wed Aug 30 11:16:40 2006
New Revision: 438573
URL: http://svn.apache.org/viewvc?rev=438573&view=rev
Log:
OPENJPA-15 Updated grammer to fix some inconsistencies with the spec
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
incubator/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=438573&r1=438572&r2=438573&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Wed Aug 30 11:16:40 2006
@@ -194,8 +194,15 @@
// ### this should actually be the primary SELECT instance
// resolved against the from variable declarations
JPQLNode from = node.findChildByID(JJTFROMITEM, true);
- if (from == null)
- throw parseException(EX_USER, "no-from-clause", null, null);
+ if (from == null) {
+ // OPENJPA-15 allow subquery without a FROMITEM
+ if (node.id == JJTSUBSELECT) {
+ from = node.findChildByID(JJTFROM, true);
+ }
+ else {
+ throw parseException(EX_USER, "no-from-clause", null, null);
+ }
+ }
for (int i = 0; i < from.children.length; i++) {
JPQLNode n = from.children[i];
@@ -216,6 +223,24 @@
return getClassMetaData(cls, true);
}
+ // OPENJPA-15 support subquery's from clause do not start with
+ // identification_variable_declaration()
+ if (node.id == JJTSUBSELECT) {
+ if (n.id == JJTINNERJOIN) {
+ n = n.getChild(0);
+ }
+ if (n.id == JJTPATH) {
+ Path path = getPath(n);
+ ClassMetaData cmd = getFieldType(path.last());
+ if (cmd != null) {
+ return cmd;
+ }
+ else {
+ throw parseException(EX_USER, "no-alias",
+ new Object[]{ n }, null);
+ }
+ }
+ }
}
return null;
@@ -501,6 +526,15 @@
Path path = getPath(firstChild(node), false, inner);
JPQLNode alias = node.getChildCount() >= 2 ? right(node) : null;
+ // OPENJPA-15 support subquery's from clause do not start with
+ // identification_variable_declaration()
+ if (inner && ctx().subquery != null && ctx().schemaAlias == null) {
+ setCandidate(getFieldType(path.last()), alias.text);
+
+ Path subpath = factory.newPath(ctx().subquery);
+ subpath.setMetaData(ctx().subquery.getMetaData());
+ exp = and(exp, factory.equal(path, subpath));
+ }
return addJoin(path, alias, inner, exp);
}
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt?rev=438573&r1=438572&r2=438573&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt Wed Aug 30 11:16:40 2006
@@ -233,7 +233,7 @@
| ((["0"-"9"])+) (<EXPONENT>) (["f","F","d","D"])?
| ((["0"-"9"])+) (<EXPONENT>)? (["f","F","d","D"])?) >
| < BOOLEAN_LITERAL: "TRUE" | "FALSE" | "true" | "false" >
- | < EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+ | < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
| < STRING_LITERAL: "'"
(("''" | ~["'"])
/*
@@ -341,7 +341,7 @@
void from_clause() #FROM : { }
{
<FROM> identification_variable_declaration()
- (<COMMA> (LOOKAHEAD(collection_member_declaration()) collection_member_declaration() | identification_variable_declaration()))*
+ (LOOKAHEAD(1) <COMMA> (LOOKAHEAD(collection_member_declaration()) collection_member_declaration() | LOOKAHEAD(identification_variable_declaration())identification_variable_declaration()))*
}
@@ -353,10 +353,22 @@
void from_item() #FROMITEM : { }
{
- abstract_schema_name() [<AS>] [identification_variable()]
+ abstract_schema_name() [LOOKAHEAD(1)<AS>] [LOOKAHEAD(identification_variable())identification_variable()]
}
+void subquery_from_clause() #FROM : { }
+{
+ <FROM> subquery_from_item()
+ ( LOOKAHEAD(1) <COMMA> subquery_from_item() )*
+}
+
+void subquery_from_item() : { }
+{
+ LOOKAHEAD(collection_member_declaration()) collection_member_declaration()
+ | LOOKAHEAD(identification_variable_declaration()) identification_variable_declaration()
+}
+
void inner_join() #INNERJOIN : { }
{
[<INNER>] <JOIN> path() [<AS>] identification_variable()
@@ -366,13 +378,12 @@
void collection_member_declaration() #INNERJOIN : { }
{
// synonymous with "INNER JOIN path AS identifier" (InnerJoin)
- <IN> "(" path() ")" [<AS>] identification_variable()
+ <IN> "(" path() ")" [ LOOKAHEAD(1)<AS>] identification_variable()
}
-
void outer_join() #OUTERJOIN : { }
{
- <LEFT> [<OUTER>] <JOIN> path() [<AS>] identification_variable()
+ <LEFT> [ <OUTER>] <JOIN> path() [ LOOKAHEAD(1)<AS>] identification_variable()
}
@@ -423,7 +434,7 @@
void update_field() #UPDATEFIELD : { }
{
// identification_variable() (<DOT> path_component())+
- [identification_variable() <DOT>] path_component()
+ [LOOKAHEAD(1) identification_variable() <DOT>] path_component()
}
@@ -453,7 +464,7 @@
void simple_select_clause() #SELECTCLAUSE : { }
{
- <SELECT> [distinct()] select_expressions()
+ <SELECT> [distinct()] subselect_expressions()
}
@@ -473,6 +484,20 @@
}
+void subselect_expressions() #SELECTEXPRESSIONS : { }
+{
+ subselect_expression() (<COMMA> subselect_expression())*
+}
+
+void subselect_expression() #SELECTEXPRESSION : { }
+{
+ LOOKAHEAD(path()) path()
+ | aggregate_select_expression()
+ | LOOKAHEAD(1) identification_variable()
+
+}
+
+
void constructor_expression() #CONSTRUCTOR : { }
{
<NEW> classname() constructor_parameters()
@@ -573,7 +598,7 @@
void groupby_item() : { }
{
- path()
+ LOOKAHEAD(path()) path() | identification_variable()
}
@@ -586,7 +611,7 @@
void subquery() #SUBSELECT : { }
{
simple_select_clause()
- from_clause()
+ subquery_from_clause()
[LOOKAHEAD(where_clause()) where_clause()]
[LOOKAHEAD(groupby_clause()) groupby_clause()]
[LOOKAHEAD(having_clause()) having_clause()]
@@ -623,7 +648,7 @@
void simple_cond_expression() : { }
{
- LOOKAHEAD(all_or_any_expression()) all_or_any_expression() |
+ //LOOKAHEAD(all_or_any_expression()) all_or_any_expression() |
LOOKAHEAD(exists_expression()) exists_expression() |
LOOKAHEAD(comparison_expression()) comparison_expression() |
LOOKAHEAD(between_expression()) between_expression() |
@@ -637,19 +662,19 @@
void between_expression() #BETWEEN : { }
{
- LOOKAHEAD(3) arithmetic_expression()
+ LOOKAHEAD(6) arithmetic_expression()
[<NOT> { jjtThis.not = true; }] <BETWEEN> arithmetic_expression()
<AND> arithmetic_expression()
- | LOOKAHEAD(3) string_expression()
+ | LOOKAHEAD(6) string_expression()
[<NOT> { jjtThis.not = true; }] <BETWEEN> string_expression() <AND> string_expression()
- | datetime_expression()
- [<NOT> { jjtThis.not = true; }] <BETWEEN> datetime_expression() <AND> datetime_expression()
+ | LOOKAHEAD(6) datetime_expression()
+ [<NOT> { jjtThis.not = true; }] <BETWEEN> datetime_expression() <AND> datetime_expression()
}
void in_expression() #IN : { }
{
- path() [<NOT> { jjtThis.not = true; }] <IN>
+ path() [ LOOKAHEAD(1) <NOT> { jjtThis.not = true; }] <IN>
"(" (literal_or_param()
(<COMMA> (literal_or_param()))* | subquery())
")"
@@ -667,7 +692,7 @@
void like_expression() #LIKE : { }
{
- string_value() [<NOT> { jjtThis.not = true; }] <LIKE> pattern_value()
+ string_expression() [<NOT> { jjtThis.not = true; }] <LIKE> pattern_value()
}
@@ -729,6 +754,7 @@
LOOKAHEAD(arithmetic_comp()) arithmetic_comp() |
LOOKAHEAD(string_comp()) string_comp() |
LOOKAHEAD(boolean_comp()) boolean_comp() |
+ LOOKAHEAD(enum_comp()) enum_comp() |
LOOKAHEAD(datetime_comp()) datetime_comp() |
LOOKAHEAD(entity_comp()) entity_comp()
}
@@ -736,25 +762,36 @@
void string_comp() : { }
{
- string_value() (
+ string_expression() (
(<EQ> (string_expression()|all_or_any_expression()) #EQUALS(2))
| (<NE> (string_expression()|all_or_any_expression()) #NOTEQUALS(2))
+ | (<GT> (string_expression() | all_or_any_expression()) #GREATERTHAN(2))
+ | (<GE> (string_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
+ | (<LT> (string_expression() | all_or_any_expression()) #LESSTHAN(2))
+ | (<LE> (string_expression() | all_or_any_expression()) #LESSOREQUAL(2))
)
}
void boolean_comp() : { }
{
- boolean_value() (
+ boolean_expression() (
(<EQ> (boolean_expression() | all_or_any_expression()) #EQUALS(2))
| (<NE> (boolean_expression() | all_or_any_expression()) #NOTEQUALS(2))
)
}
+void enum_comp() : { }
+{
+ enum_expression() (
+ (<EQ> (enum_expression() | all_or_any_expression()) #EQUALS(2))
+ | (<NE> (enum_expression() | all_or_any_expression()) #NOTEQUALS(2))
+ )
+}
void entity_comp() : { }
{
- entity_bean_value() (
+ entity_bean_expression() (
(<EQ> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #EQUALS(2)))
| (<NE> ((LOOKAHEAD(all_or_any_expression()) all_or_any_expression() | entity_bean_expression()) #NOTEQUALS(2)))
)
@@ -764,7 +801,7 @@
void arithmetic_comp() : { }
{
// arithmetic_value() (
- arithmetic_factor() (
+ arithmetic_expression() (
(<EQ> (arithmetic_expression() | all_or_any_expression()) #EQUALS(2))
| (<GT> (arithmetic_expression() | all_or_any_expression()) #GREATERTHAN(2))
| (<GE> (arithmetic_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
@@ -777,7 +814,7 @@
void datetime_comp() : { }
{
- datetime_primary() (
+ datetime_expression() (
(<EQ> (datetime_expression() | all_or_any_expression()) #EQUALS(2))
| (<GT> (datetime_expression() | all_or_any_expression()) #GREATERTHAN(2))
| (<GE> (datetime_expression() | all_or_any_expression()) #GREATEROREQUAL(2))
@@ -790,7 +827,7 @@
void arithmetic_value() : { }
{
- path() | functions_returning_numerics() | subquery()
+ path() | functions_returning_numerics() | "(" subquery() ")"
}
@@ -817,9 +854,10 @@
numeric_literal() |
input_parameter() |
path() |
- "(" arithmetic_expression() ")" |
+ LOOKAHEAD(2) "(" arithmetic_expression() ")" |
functions_returning_numerics() |
- subquery()
+ aggregate_select_expression() |
+ subquery()
}
@@ -831,7 +869,7 @@
void string_value() : { }
{
- path() | functions_returning_strings() | subquery()
+ path() | functions_returning_strings() | "(" subquery() ")"
}
@@ -843,8 +881,8 @@
void string_primary() : { }
{
- path() | string_literal() | "(" string_expression() ")" |
- functions_returning_strings() | subquery()
+ string_literal() | path() | LOOKAHEAD(2) "(" string_expression() ")" |
+ functions_returning_strings() | LOOKAHEAD(2) "(" subquery() ")"
}
@@ -862,7 +900,7 @@
void boolean_value() : { }
{
- path() | subquery()
+ path() | "(" subquery() ")"
}
@@ -874,7 +912,7 @@
void boolean_primary() : { }
{
- path() | boolean_literal() | input_parameter()
+ LOOKAHEAD(2) path() | boolean_literal() | input_parameter()
}
@@ -886,7 +924,7 @@
void enum_primary() : { }
{
- path()
+ LOOKAHEAD(2) path()
| LOOKAHEAD(enum_literal()) enum_literal()
| LOOKAHEAD(input_parameter()) input_parameter()
}
@@ -930,7 +968,7 @@
void trim() #TRIM : { }
{
- <TRIM> "(" [[trim_specification()] [trim_character()] <FROM>]
+ <TRIM> "(" [LOOKAHEAD(2)[trim_specification()] [trim_character()] <FROM>]
string_expression() ")"
}
@@ -950,7 +988,7 @@
void trim_specification() : { }
{
- (<LEADING> #TRIMLEADING) | (<TRAILING> #TRIMTRAILING) | (<BOTH> #TRIMBOTH)
+ LOOKAHEAD(2) (<LEADING> #TRIMLEADING) | (<TRAILING> #TRIMTRAILING) | (<BOTH> #TRIMBOTH)
}