Author: fancy
Date: Tue Apr 14 04:09:05 2009
New Revision: 764668

URL: http://svn.apache.org/viewvc?rev=764668&view=rev
Log:
OPENJPA-1035 JPA2 Query allow map key/value path to appear as argument to 
scalar functions

Modified:
    
openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex0/TestMany2ManyMap.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java

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=764668&r1=764667&r2=764668&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 Apr 14 04:09:05 2009
@@ -945,11 +945,11 @@
        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() | 
+       LOOKAHEAD("("  arithmetic_expression()) "("  arithmetic_expression() 
")" | 
+       LOOKAHEAD(functions_returning_numerics()) 
functions_returning_numerics() | 
+       LOOKAHEAD(aggregate_select_expression()) aggregate_select_expression() 
|        
        LOOKAHEAD(case_expression()) case_expression() |
-       "(" subquery() ")"
+       LOOKAHEAD("(" subquery()) "(" subquery() ")"
 }
 
 
@@ -1081,9 +1081,10 @@
 void string_primary() : { }
 {
        string_literal() | path() |
-       LOOKAHEAD(general_identification_variable()) 
general_identification_variable() |        
-       LOOKAHEAD(2) "(" string_expression() ")" | 
-       functions_returning_strings() | LOOKAHEAD(2)  "(" subquery() ")"
+       LOOKAHEAD(qualified_path()) qualified_path() |  
+       LOOKAHEAD(general_identification_variable()) 
general_identification_variable() |
+       LOOKAHEAD("(" string_expression()) "(" string_expression() ")" | 
+       functions_returning_strings() | LOOKAHEAD("(" subquery()) "(" 
subquery() ")"
        | case_expression()
 }
 
@@ -1097,6 +1098,7 @@
 void datetime_primary() : { }
 {
        path() | functions_returning_datetime() | input_parameter() | 
aggregate_select_expression()
+       | LOOKAHEAD(qualified_path()) qualified_path()
        | LOOKAHEAD(general_identification_variable()) 
general_identification_variable()
        | case_expression()
 }
@@ -1117,6 +1119,8 @@
 void boolean_primary() : { }
 {
        LOOKAHEAD(2) path() | boolean_literal() | input_parameter()
+       | LOOKAHEAD(qualified_path()) qualified_path()
+       | LOOKAHEAD(general_identification_variable()) 
general_identification_variable()
        | case_expression()
 }
 
@@ -1132,6 +1136,8 @@
        LOOKAHEAD(2) path()
        | LOOKAHEAD(enum_literal()) enum_literal()
        | LOOKAHEAD(input_parameter()) input_parameter()
+       | LOOKAHEAD(qualified_path()) qualified_path()
+       | LOOKAHEAD(general_identification_variable()) 
general_identification_variable()
        | case_expression()
 }
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex0/TestMany2ManyMap.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex0/TestMany2ManyMap.java?rev=764668&r1=764667&r2=764668&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex0/TestMany2ManyMap.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex0/TestMany2ManyMap.java
 Tue Apr 14 04:09:05 2009
@@ -142,7 +142,7 @@
         // expects parser error:
         // JPA2 has no support for predicate comparison using
         // Key(e) or Value(e)
-        String query1 = "select KEY(p) from Employee e, " +
+        query = "select KEY(p) from Employee e, " +
             " in (e.phones) p where KEY(p) = ?1";
         try {
             q = em.createQuery(query).setParameter(1, d2);
@@ -160,6 +160,18 @@
         if (inMemory) 
             setCandidate(q, Employee.class);
         rs = q.getResultList();
+        assertEquals(0, rs.size());
+
+        // test qualified path in scalar functions
+        query = "select CONCAT(KEY(p).name, 'xyz') from Employee e, " +
+            " in (e.phones) p WHERE SUBSTRING(KEY(p).name, 1)" +
+            " like '%2'";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Employee.class);
+        rs = q.getResultList();
+        assertEquals(((String) rs.get(0)), "d2xyz");
+
         em.close();
     }
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java?rev=764668&r1=764667&r2=764668&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java
 Tue Apr 14 04:09:05 2009
@@ -155,6 +155,14 @@
         rs = q.getResultList();
         if (!inMemory)
         assertTrue(sql.get(0).toUpperCase().indexOf(" GROUP BY ") != -1);
+        
+        query = "select LENGTH(KEY(e).name) from PhoneNumber p, " +
+            " in (p.emps) e where KEY(e).bDay = CURRENT_TIMESTAMP";
+        q = em.createQuery(query);
+        if (inMemory) 
+            setCandidate(q, Employee.class);
+        rs = q.getResultList();
+        assertEquals(rs.size(), 0);
 
         em.close();
     }


Reply via email to