You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/03/17 04:13:12 UTC

svn commit: r755102 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/ openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/ openjpa-kernel/src/main...

Author: fancy
Date: Tue Mar 17 03:13:10 2009
New Revision: 755102

URL: http://svn.apache.org/viewvc?rev=755102&view=rev
Log:
OPENJPA-967 JPA2 JPQL allow KEY(e) of basic types appear in conditional expression 

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
    openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
    openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex8/TestMany2ManyMapEx8.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java?rev=755102&r1=755101&r2=755102&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java Tue Mar 17 03:13:10 2009
@@ -83,6 +83,7 @@
     private Class _cast = null;
     private boolean _cid = false;
     private FieldMetaData _xmlfield = null;
+    private FieldMetaData _mapfield = null;
 
     /**
      * Return a path starting with the 'this' ptr.
@@ -361,6 +362,7 @@
         if (_cid)
             return;
 
+        _mapfield = last();
         // change the last action to a get key
         Action action = (Action) _actions.getLast();
         action.op = Action.GET_KEY;
@@ -402,7 +404,8 @@
         if (act != null && act.op == Action.GET_XPATH)
             return ((XMLMetaData) act.data).getType();
         
-        FieldMetaData fld = (act == null || act.op == Action.GET_KEY) ? null : 
+        FieldMetaData fld = act == null ? null :
+            act.op == Action.GET_KEY ? _mapfield :
             (FieldMetaData) act.data;
         boolean key = act != null && act.op == Action.GET_KEY;
         if (fld != null) {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=755102&r1=755101&r2=755102&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Tue Mar 17 03:13:10 2009
@@ -970,6 +970,8 @@
 
             case JJTGENERALIDENTIFIER:
                 // KEY(e), VALUE(e)
+                if (node.parent.parent.id == JJTWHERE)
+                    return getGeneralIdentifier(onlyChild(node), true);
                 return getQualifiedIdentifier(onlyChild(node));
 
             case JJTNOT:
@@ -1458,6 +1460,24 @@
         return path;
     }
 
+    private Value getGeneralIdentifier(JPQLNode node, boolean inWhereClause) {
+        JPQLNode id = onlyChild(node);
+        if (inWhereClause && node.id == JJTVALUE)
+            throw parseException(EX_USER, "bad-general-identifier",
+                new Object[]{ id.text, "VALUE" }, null);
+
+        Path path = (Path) validateMapPath(node, id);
+        FieldMetaData fld = path.last();
+        path = (Path) factory.getKey(path);
+        ClassMetaData meta = fld.getKey().getTypeMetaData();
+        if (inWhereClause && meta != null)
+            // check basic type
+            throw parseException(EX_USER, "bad-general-identifier",
+                new Object[]{ id.text, "KEY" }, null);
+
+        return path;
+    }
+
     private Value getQualifiedIdentifier(JPQLNode node) {
         JPQLNode id = onlyChild(node);               
         Path path = (Path) validateMapPath(node, id);

Modified: openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt?rev=755102&r1=755101&r2=755102&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt (original)
+++ openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt Tue Mar 17 03:13:10 2009
@@ -944,6 +944,7 @@
 	input_parameter() | 
 	LOOKAHEAD(path()) path() |
 	LOOKAHEAD(qualified_path()) qualified_path() |
+	LOOKAHEAD(general_identification_variable()) general_identification_variable() |
 	LOOKAHEAD(2) "(" arithmetic_expression() ")" | 
 	functions_returning_numerics() | 
 	aggregate_select_expression() |	
@@ -1078,7 +1079,9 @@
 
 void string_primary() : { }
 {
-	string_literal() | path() | LOOKAHEAD(2) "(" string_expression() ")" | 
+	string_literal() | path() |
+	LOOKAHEAD(general_identification_variable()) general_identification_variable() |	
+	LOOKAHEAD(2) "(" string_expression() ")" | 
 	functions_returning_strings() | LOOKAHEAD(2)  "(" subquery() ")"
 	| case_expression()
 }
@@ -1093,6 +1096,7 @@
 void datetime_primary() : { }
 {
 	path() | functions_returning_datetime() | input_parameter() | aggregate_select_expression()
+	| LOOKAHEAD(general_identification_variable()) general_identification_variable()
 	| case_expression()
 }
 

Modified: openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties?rev=755102&r1=755101&r2=755102&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties (original)
+++ openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties Tue Mar 17 03:13:10 2009
@@ -76,4 +76,5 @@
 bad-qualified-identifier: The identifier "{0}" in "{1}" operator is not \
     referring to an association field of type java.util.Map.
 bad-qualified-path: Attemp to navigate a basic type of Key("{0}").
-    
\ No newline at end of file
+bad-general-identifier: The identitier "{0}" in "{1}" operator is not valid \
+    in conditional expression.  
\ No newline at end of file

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex8/TestMany2ManyMapEx8.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex8/TestMany2ManyMapEx8.java?rev=755102&r1=755101&r2=755102&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex8/TestMany2ManyMapEx8.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex8/TestMany2ManyMapEx8.java Tue Mar 17 03:13:10 2009
@@ -88,6 +88,13 @@
 
         assertTrue(d.equals(me.getKey()));
 
+        // test KEY(e) of basic type in conditional expression
+        sql.clear();
+        query = "select KEY(e) from PhoneNumber p, " +
+            " in (p.emps) e where KEY(e) like '%1'";
+        rs = em.createQuery(query).getResultList();
+        assertTrue(sql.get(0).toUpperCase().indexOf("LIKE") > 0);
+
         em.close();
     }
 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java?rev=755102&r1=755101&r2=755102&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java Tue Mar 17 03:13:10 2009
@@ -73,6 +73,13 @@
 
         assertTrue(d.equals(me.getKey()));
 
+        // test KEY(e) of basic type in conditional expression
+        sql.clear();
+        query = "select KEY(e) from Department d, " +
+            " in (d.empMap) e where KEY(e) > 1";
+        rs = em.createQuery(query).getResultList();
+        assertTrue(sql.get(0).toUpperCase().indexOf(">") > 0);
+
         em.close();
     }