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/10/07 04:47:17 UTC

svn commit: r822562 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/ openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/ openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/ openjpa-persistence-j...

Author: fancy
Date: Wed Oct  7 02:47:16 2009
New Revision: 822562

URL: http://svn.apache.org/viewvc?rev=822562&view=rev
Log:
OPENJPA-1339 JPA2 JPQL GROUP BY embeddable is not allowed

Modified:
    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/embed/TestEmbeddable.java

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=822562&r1=822561&r2=822562&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 Wed Oct  7 02:47:16 2009
@@ -489,7 +489,14 @@
 
         for (int i = 0; i < groupByCount; i++) {
             JPQLNode node = groupByNode.getChild(i);
-            exps.grouping[i] = getValue(node);
+            Value val = getValue(node);
+            if (val instanceof Path) {
+                FieldMetaData fmd = ((Path) val).last();
+                if (fmd != null && fmd.getValue().getTypeMetaData() != null && fmd.getValue().isEmbedded())
+                    throw parseException(EX_USER, "cant-groupby-embeddable",
+                        new Object[]{ node.getChildCount() > 1 ? assemble(node) : node.text }, null);
+            }
+            exps.grouping[i] = val;
         }
     }
 
@@ -1166,7 +1173,7 @@
 
             case JJTGENERALIDENTIFIER:
                 // KEY(e), VALUE(e)
-                if (node.parent.parent.id == JJTWHERE)
+                if (node.parent.parent.id == JJTWHERE || node.parent.id == JJTGROUPBY)
                     return getGeneralIdentifier(onlyChild(node), true);
                 return getQualifiedIdentifier(onlyChild(node));
 
@@ -1729,7 +1736,7 @@
         return path;
     }
 
-    private Value getGeneralIdentifier(JPQLNode node, boolean inWhereClause) {
+    private Value getGeneralIdentifier(JPQLNode node, boolean verifyEmbeddable) {
         JPQLNode id = onlyChild(node);
         Path path = validateMapPath(node, id);
 
@@ -1737,14 +1744,18 @@
             path = (Path) factory.getKey(path);
         FieldMetaData fld = path.last();
         ClassMetaData meta = fld.getKey().getTypeMetaData();
-        if (inWhereClause &&
+        if (verifyEmbeddable &&
             (node.id == JJTKEY && meta != null && fld.getKey().isEmbedded()) ||
             (node.id == JJTVALUE && fld.isElementCollection() &&
-                 fld.getElement().getEmbeddedMetaData() != null))   
+                 fld.getElement().getEmbeddedMetaData() != null)) { 
                  // check basic type
+            if (node.parent.parent.id == JJTGROUPBY)
+                throw parseException(EX_USER, "cant-groupby-key-value-embeddable",
+                    new Object[]{ node.id == JJTVALUE ? "VALUE" : "KEY", id.text }, null);
+            else
                 throw parseException(EX_USER, "bad-general-identifier",
                     new Object[]{ node.id == JJTVALUE ? "VALUE" : "KEY", id.text }, null);
-
+        }
         return path;
     }
 

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=822562&r1=822561&r2=822562&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 Wed Oct  7 02:47:16 2009
@@ -673,6 +673,7 @@
 	LOOKAHEAD(path()) path()
 	| LOOKAHEAD(groupby_extension()) groupby_extension()
 	| LOOKAHEAD(qualified_path()) qualified_path()
+	| LOOKAHEAD(general_identification_variable()) general_identification_variable()
 	| LOOKAHEAD(identification_variable()) identification_variable()
 }
 

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=822562&r1=822561&r2=822562&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 Wed Oct  7 02:47:16 2009
@@ -80,6 +80,7 @@
     in conditional expression.
 bad-predicate: JPQL query does not support conditional expression over \
     embeddable class. JPQL string: "{0}". 
-cant-bulk-update-embeddable: Bulk update of embeddable field is not allowed: \
-    "{0}".
+cant-bulk-update-embeddable: Bulk update of embeddables: "{0}" is not allowed.
+cant-groupby-embeddable: Grouping by embeddables: "{0}" is not allowed.
+cant-groupby-key-value-embeddable: Grouping by embeddables: "{0}({1})" is not allowed.
 no-constructor: NEW constructor operation could not resolve class named "{0}".

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java?rev=822562&r1=822561&r2=822562&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java Wed Oct  7 02:47:16 2009
@@ -106,6 +106,24 @@
             }
     }
 
+    public void testGroupByEmbed() {
+        EntityManager em = emf.createEntityManager();
+        String query[] = {
+                "select KEY(e) from Department3 d join d.emps e group by KEY(e)",
+                "select a.embed from EntityA_Embed_Embed a group by a.embed",
+                "select e from EntityA_Embed_Embed a join a.embed e group by e",
+        };
+        List rs = null;
+        for (int i = 0; i < query.length; i++) {
+            try {
+                rs = em.createQuery(query[i]).getResultList();
+            } catch(ArgumentException e) {
+                System.out.println(e.getMessage()); // as expected : Group by embeddable field is not allowed
+            }
+        }
+        em.close();
+    }
+
     public void testKeyEmbeddableCompare() {
         EntityManager em = emf.createEntityManager();
         String query[] = {