From 29a2d30a8a3af9ee28cf132f59732f3b061d0964 Mon Sep 17 00:00:00 2001 From: Catalina Wei Date: Mon, 16 Mar 2009 17:16:39 +0000 Subject: [PATCH] OPENJPA-967 JPA2 support qualified path add support for ORDER BY & GROUP BY a path thru KEY navigation git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@754961 13f79535-47bb-0310-9956-ffa450edef68 --- .../openjpa/jdbc/kernel/exps/PCPath.java | 36 ++++++++++++------- .../apache/openjpa/jdbc/sql/SelectImpl.java | 8 ++--- .../maps/m2mmapex1/TestMany2ManyMapEx1.java | 22 ++++++++++++ .../maps/m2mmapex10/TestMany2ManyMapEx10.java | 13 +++++++ .../maps/m2mmapex3/TestMany2ManyMapEx3.java | 7 ++++ .../maps/m2mmapex6/TestMany2ManyMapEx6.java | 7 ++++ .../spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java | 1 - .../spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java | 9 ++++- .../spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java | 16 +++++++++ 9 files changed, 100 insertions(+), 19 deletions(-) diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java index 57308b944..d53107e60 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java @@ -717,23 +717,26 @@ public class PCPath 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 @@ public class PCPath 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 class PCPath 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) diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java index 0a358ad38..779b92b9f 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java @@ -766,16 +766,16 @@ public class SelectImpl public String getColumnAlias(Column col, Object path) { String columnName = col.getName(); String tableName = col.getTable().getFullName(); - Set 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; } } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java index af0dd1464..2f57fda53 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex1/TestMany2ManyMapEx1.java @@ -107,6 +107,28 @@ public class TestMany2ManyMapEx1 extends SingleEMFTestCase { 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(); } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java index 3992dae99..9cdbf53e9 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex10/TestMany2ManyMapEx10.java @@ -106,6 +106,19 @@ public class TestMany2ManyMapEx10 extends SingleEMFTestCase { 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(); } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java index f46927620..e12400fb4 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex3/TestMany2ManyMapEx3.java @@ -100,6 +100,13 @@ public class TestMany2ManyMapEx3 extends SingleEMFTestCase { 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(); } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java index dce92cbb2..9a316f7e8 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/TestMany2ManyMapEx6.java @@ -88,6 +88,13 @@ public class TestMany2ManyMapEx6 extends SingleEMFTestCase { 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(); } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java index 9b1ab6f00..5206e4bc0 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex1/TestSpec10_1_26_Ex1.java @@ -62,7 +62,6 @@ public class TestSpec10_1_26_Ex1 extends SingleEMFTestCase { 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); diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java index e834bac47..cf2676abf 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex2/TestSpec10_1_26_Ex2.java @@ -75,7 +75,14 @@ public class TestSpec10_1_26_Ex2 extends SingleEMFTestCase { 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(); } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java index 31225251e..e1d7612b0 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex3/TestSpec10_1_26_Ex3.java @@ -74,6 +74,22 @@ public class TestSpec10_1_26_Ex3 extends SingleEMFTestCase { 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(); }