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/05/12 06:12:28 UTC

svn commit: r773776 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java

Author: fancy
Date: Tue May 12 04:12:27 2009
New Revision: 773776

URL: http://svn.apache.org/viewvc?rev=773776&view=rev
Log:
OPENJPA-1064 JPA2 Query add support for embeddable of element collection in predicate and subquery
- Add test strings for any, some, member of predicates
- Fix a bug in parameter processing of embeddable object

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java?rev=773776&r1=773775&r2=773776&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java Tue May 12 04:12:27 2009
@@ -146,4 +146,11 @@
         else
             sql.appendValue(pstate.sqlValue, pstate.getColumn(index), this);
     }
+
+    public int length(Select sel, ExpContext ctx, ExpState state) {
+        ParamExpState pstate = (ParamExpState) state;
+        if (getMetaData() == null || pstate.cols == null)
+            return 1;
+        return pstate.cols.length;
+    }
 }

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=773776&r1=773775&r2=773776&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 May 12 04:12:27 2009
@@ -1595,13 +1595,115 @@
                 " order by e.intVal3",
             */
         };
+        String[] query2 = {
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 < ANY (select e2.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 < ALL (select e2.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 <= SOME (select e2.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 > ALL (select e2.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+                " order by e.intVal3",
+            // non-corelated subquery:
+            // TODO: known problem in table alias resolution for subquery
+            //       the genarated SQL subquery should be non-corelated,
+            //       but generated corelated subquery.
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 < ANY (select e.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 < ALL (select e.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 <= SOME (select e.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 > ALL (select e.intVal2 " +
+                " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+                " order by e.intVal3",
+            // corelated subquery:
+            // TODO: known problem in table alias resolution for subquery
+            //       the genarated SQL subquery should be corelated,
+            //       but generated non-corelated subquery.
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 < ANY (select e2.intVal2 " +
+                " from in(a.embeds) e2) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 < ALL (select e2.intVal2 " +
+                " from a.embeds e2) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 <= SOME (select e2.intVal2 " +
+                " from in(a.embeds) e2) " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE e.intVal1 > ALL (select e2.intVal2 " +
+                " from a.embeds e2) " +
+                " order by e.intVal3",
+        };
+        String[] query3 = {
+            // query with parameter of embeddable object
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE ?1 MEMBER OF a.embeds " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " left join a.embeds e WHERE ?1 MEMBER OF a.embeds " +
+                " order by e.intVal3",
+            "select e, e.intVal1, e.embed.intVal2 from " +
+                " EntityA_Coll_Embed_Embed a " +
+                " , in (a.embeds) e WHERE ?1 = e " +
+                " order by e.intVal3",
+        };
+
         List rs = null;
+        Object obj = null;
         for (int i = 0; i < query.length; i++) {
             rs = em.createQuery(query[i]).getResultList();
             assertTrue(rs.size() > 0);
-            Object obj = ((Object[]) rs.get(0))[0];
+            obj = ((Object[]) rs.get(0))[0];
             assertTrue(obj instanceof Embed_Embed);
         }
+        for (int i = 0; i < query2.length; i++) {
+            rs = em.createQuery(query2[i]).getResultList();
+            if (rs.size() > 0) {
+                obj = ((Object[]) rs.get(0))[0];
+                assertTrue(obj instanceof Embed_Embed);
+            }
+        }
+        for (int i = 0; i < query3.length; i++) {
+            rs = em.createQuery(query3[i]).setParameter(1, obj).getResultList();
+            if (rs.size() > 0) {
+                obj = ((Object[]) rs.get(0))[0];
+                assertTrue(obj instanceof Embed_Embed);
+            }
+        }
+
         em.clear();
 
         EntityTransaction tran = em.getTransaction();