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[] = {