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 00:22:09 UTC

svn commit: r822528 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/ openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/

Author: fancy
Date: Tue Oct  6 22:22:09 2009
New Revision: 822528

URL: http://svn.apache.org/viewvc?rev=822528&view=rev
Log:
OPENJPA-1338 Allow comparison for VALUE(e) that maps to basic type

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
    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=822528&r1=822527&r2=822528&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 Oct  6 22:22:09 2009
@@ -1736,15 +1736,14 @@
         if (node.id == JJTKEY)
             path = (Path) factory.getKey(path);
         FieldMetaData fld = path.last();
-        ClassMetaData meta = node.id == JJTKEY ? meta = fld.getKey().getTypeMetaData()
-                : fld.getDeclaredTypeMetaData();
+        ClassMetaData meta = fld.getKey().getTypeMetaData();
         if (inWhereClause &&
-            (meta != null && meta.isEmbeddable()) ||
-                (fld.isElementCollection() &&
+            (node.id == JJTKEY && meta != null && fld.getKey().isEmbedded()) ||
+            (node.id == JJTVALUE && fld.isElementCollection() &&
                  fld.getElement().getEmbeddedMetaData() != null))   
                  // check basic type
                 throw parseException(EX_USER, "bad-general-identifier",
-                    new Object[]{ id.text, node.id == JJTVALUE ? "VALUE" : "KEY" }, null);
+                    new Object[]{ node.id == JJTVALUE ? "VALUE" : "KEY", id.text }, null);
 
         return path;
     }

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=822528&r1=822527&r2=822528&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 Oct  6 22:22:09 2009
@@ -76,7 +76,7 @@
 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}").
-bad-general-identifier: The identitier "{0}" in "{1}" operator is not valid \
+bad-general-identifier: The "{0}({1})" is an embeddable which not allowed \
     in conditional expression.
 bad-predicate: JPQL query does not support conditional expression over \
     embeddable class. JPQL string: "{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=822528&r1=822527&r2=822528&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 Tue Oct  6 22:22:09 2009
@@ -106,6 +106,53 @@
             }
     }
 
+    public void testGroupByEmbed() {
+        EntityManager em = emf.createEntityManager();
+        String query[] = {
+                "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) {
+                ; // as expected : Group by embeddable field is not allowed
+            }
+        }
+        em.close();
+    }
+
+    public void testKeyEmbeddableCompare() {
+        EntityManager em = emf.createEntityManager();
+        String query[] = {
+                "select o from Company1 c join c.organization o where KEY(o) = ?1",
+                "select d from Department3 d join d.emps e where KEY(e) = ? 1"
+        };
+        List rs = null;
+        Division d = new Division();
+        d.setId(10);
+        d.setName("division 10");
+        EmployeeName3 name = new EmployeeName3("fname1", "lname1");
+        for (int i = 0; i < query.length; i++) {
+            switch (i) {
+            case 0:
+                // Division is an embeddable as well as an entity, comparison is allowed
+                rs = em.createQuery(query[i]).setParameter(1, d).getResultList();
+                break;
+            case 1:
+                try {
+                    rs = em.createQuery(query[i]).setParameter(1, name).getResultList();
+                } catch(ArgumentException e) {
+                    // as expected : compare embeddable is not allowed
+                    System.out.println(e.getMessage()); 
+                }
+                break;
+            }
+        }
+        em.close();        
+    }
+
     public void testEntityA_Embed_Coll_Map() {
         queryEntityA_Embed_Coll_Map();
     }
@@ -120,7 +167,8 @@
         for (int i = 0; i < query.length; i++) {
             rs = em.createQuery(query[i]).getResultList();
             em.clear();
-        }        
+        }
+        em.close();
     }
 
     public void testEntityA_Coll_String() {