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();
}