Author: fancy
Date: Mon Mar 16 17:16:39 2009
New Revision: 754961

URL: http://svn.apache.org/viewvc?rev=754961&view=rev
Log:
OPENJPA-967 JPA2 support qualified path
add support for ORDER BY & GROUP BY a path thru KEY navigation

Modified:
    
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
    
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java

Modified: 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
 (original)
+++ 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
 Mon Mar 16 17:16:39 2009
@@ -717,23 +717,26 @@
         selectColumns(sel, ctx, state, pks);
     }
 
+    private SQLBuffer getColumns(Select sel, ExpContext ctx, ExpState state) {
+        Column[] cols = getColumns(state);
+        SQLBuffer buf = new SQLBuffer(ctx.store.getDBDictionary());
+        for (int i = 0; i < cols.length; i++) {
+            buf.append(sel.getColumnAlias(cols[i], this));
+            if (i > 0)
+                buf.append(",");
+        }
+        return buf;
+    }
+
     public void selectColumns(Select sel, ExpContext ctx, ExpState state, 
         boolean pks) {
         ClassMapping mapping = getClassMapping(state);
         PathExpState pstate = (PathExpState) state;
         if (mapping == null || !pstate.joinedRel) {
-            getColumns(state);
-            if (_keyPath) {
-                SQLBuffer buf = new SQLBuffer(ctx.store.getDBDictionary());
-                for (int i = 0; i < pstate.cols.length; i++) {
-                    buf.append(sel.getColumnAlias(pstate.cols[i], this));
-                    if (i > 0)
-                        buf.append(",");
-                }
-                sel.select(buf, this);
-            }
+            if (_keyPath)
+                sel.select(getColumns(sel, ctx, state), this);
             else
-                sel.select(pstate.cols, pstate.joins);
+                sel.select(getColumns(state), pstate.joins);
         }
         else if (pks)
             sel.select(mapping.getPrimaryKeyColumns(), pstate.joins);
@@ -754,7 +757,10 @@
         ClassMapping mapping = getClassMapping(state);
         PathExpState pstate = (PathExpState) state;
         if (mapping == null || !pstate.joinedRel)
-            sel.groupBy(getColumns(state), sel.outer(pstate.joins));
+            if (_keyPath)
+                sel.groupBy(getColumns(sel, ctx, state));
+            else
+                sel.groupBy(getColumns(state), sel.outer(pstate.joins));
         else {
             int subs = (_type == UNBOUND_VAR) ? Select.SUBS_JOINABLE
                 : Select.SUBS_ANY_JOINABLE;
@@ -765,7 +771,11 @@
 
     public void orderBy(Select sel, ExpContext ctx, ExpState state, 
         boolean asc) {
-        sel.orderBy(getColumns(state), asc, sel.outer(state.joins), false);
+        if (_keyPath)
+            sel.orderBy(getColumns(sel, ctx, state), asc,
+                sel.outer(state.joins), false, this.getSelectAs());
+        else
+            sel.orderBy(getColumns(state), asc, sel.outer(state.joins), false);
     }
 
     public Object load(ExpContext ctx, ExpState state, Result res)

Modified: 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
 Mon Mar 16 17:16:39 2009
@@ -766,16 +766,16 @@
     public String getColumnAlias(Column col, Object path) {
         String columnName = col.getName();
         String tableName = col.getTable().getFullName();
-        Set<Map.Entry> entries = _aliases.entrySet();
+        Object[] entries = _aliases.entrySet().toArray();
         Integer tableAlias = null;
-        for (Map.Entry entry : entries) {
-            Object obj = entry.getKey();
+        for (int i = entries.length-1; i >= 0; i--) {
+            Object obj = ((Map.Entry) entries[i]).getKey();
             Key key = null;
             if (obj instanceof Key)
                 key = (Key) obj;
             String str = key != null ? key.getKey().toString() : 
obj.toString();
             if (str.equals(tableName)) {
-                tableAlias = (Integer) entry.getValue();
+                tableAlias = (Integer) ((Map.Entry) entries[i]).getValue();
                 break;
             }
         }

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java
 Mon Mar 16 17:16:39 2009
@@ -107,6 +107,28 @@
         String dname = (String) ((Object[]) rs2.get(0))[1];
         assertEquals(d2.getName(), dname);
 
+        // test ORDER BY qualified path
+        em.clear();
+
+        query2 = "select KEY(p), KEY(p).name from Employee e, " +
+            " in (e.phones) p ORDER BY KEY(p).name DESC";
+        rs2 = em.createQuery(query2).getResultList();        
+        String name1 = (String) ((Object[]) rs2.get(0))[1];
+
+        em.clear();
+
+        query2 = "select KEY(p), KEY(p).name as name from Employee e, " +
+            " in (e.phones) p ORDER BY name DESC";
+        rs2 = em.createQuery(query2).getResultList();
+        String name2 = (String) ((Object[]) rs2.get(0))[1];
+        
+        assertEquals(name1, name2);
+
+        // test GROUP BY qualified path
+        String query5 = "select count(KEY(p).name) from Employee e, " +
+            " in (e.phones) p GROUP BY KEY(p).name";
+        List rs5 = em.createQuery(query5).getResultList();
+
         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=754961&r1=754960&r2=754961&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
 Mon Mar 16 17:16:39 2009
@@ -106,6 +106,19 @@
         String phoneNum = (String) ((Object[]) rs2.get(0))[1];
         assertEquals(k.getPhoneNum(), phoneNum);
 
+        // test ORDER BY qualified path
+        query2 = "select KEY(p), KEY(p).phoneNum as pno from Employee e " +
+            " left join e.phones p ORDER BY pno ";
+        rs2 = em.createQuery(query2).getResultList();
+
+        // test GROUP BY qualified path
+        sql.clear();
+        query2 = "select COUNT(KEY(p).phoneNum) from Employee e " +
+            " left join e.phones p GROUP BY KEY(p).phoneNum";
+        rs2 = em.createQuery(query2).getResultList();
+
+        assertTrue(sql.get(0).toUpperCase().indexOf(" GROUP BY ") != -1);
+
         em.close();
     }
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java
 Mon Mar 16 17:16:39 2009
@@ -100,6 +100,13 @@
         d2 = (Department) ((Object[]) rs2.get(0))[0];
         String dname = (String) ((Object[]) rs2.get(0))[1];
 
+        // test GROUP BY qualified path
+        sql.clear();
+        query2 = "select COUNT(KEY(p).id) from Employee e " +
+            " left join e.phones p GROUP BY KEY(p).id";
+        rs2 = em.createQuery(query2).getResultList();
+        assertTrue(sql.get(0).toUpperCase().indexOf(" GROUP BY ") != -1);
+
         em.close();
     }
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java
 Mon Mar 16 17:16:39 2009
@@ -88,6 +88,13 @@
 
         assertTrue(d.equals(me.getKey()));
 
+        // test GROUP BY qualified path
+        sql.clear();
+        String query5 = "select count(KEY(e).lName) from PhoneNumber p " +
+            " left join p.emps e GROUP BY KEY(e).lName";
+        List rs5 = em.createQuery(query5).getResultList();
+        assertTrue(sql.get(0).toUpperCase().indexOf(" GROUP BY ") != -1);
+
         em.close();
     }
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java
 Mon Mar 16 17:16:39 2009
@@ -62,7 +62,6 @@
         EntityManager em = emf.createEntityManager();
         String query = "select KEY(e) from Department d, " +
             " in (d.empMap) e order by d.deptId, e.empId";
-        System.err.println(query);
         List rs = em.createQuery(query).getResultList();
         Integer d = (Integer) rs.get(0);
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java
 Mon Mar 16 17:16:39 2009
@@ -75,7 +75,14 @@
         Map.Entry me = (Map.Entry) rs4.get(0);
 
         assertTrue(d.equals(me.getKey()));
-        
+
+        // test GROUP BY qualified path
+        sql.clear();
+        String query5 = "select count(KEY(e).bDay) from Department d " +
+            " left join d.empMap e GROUP BY KEY(e).bDay";
+        List rs5 = em.createQuery(query5).getResultList();
+        assertTrue(sql.get(0).toUpperCase().indexOf(" GROUP BY ") != -1);
+
         em.close();
     }
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java?rev=754961&r1=754960&r2=754961&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java
 Mon Mar 16 17:16:39 2009
@@ -74,6 +74,22 @@
 
         assertTrue(d.equals(me.getKey()));
         
+        // test ORDER BY qualified path
+        query = "select KEY(e), KEY(e).fName from Department d, " +
+            " in (d.emps) e order by KEY(e).fName";
+        rs = em.createQuery(query).getResultList(); 
+        d = (EmployeeName) ((Object[]) rs.get(0))[0];
+        String fname = (String) ((Object[]) rs.get(0))[1];
+
+        assertEquals(d.getFName(), fname);
+
+        // test GROUP BY qualified path
+        sql.clear();
+        query = "select COUNT(KEY(e).fName) from Department d " +
+            " left join d.emps e GROUP BY KEY(e).fName";
+        rs = em.createQuery(query).getResultList(); 
+        assertTrue(sql.get(0).toUpperCase().indexOf(" GROUP BY ") != -1);
+
         em.close();
     }
 


Reply via email to