mirror of
https://github.com/apache/openjpa.git
synced 2025-02-23 02:48:46 +00:00
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
This commit is contained in:
parent
44ffbd2f79
commit
29a2d30a8a
@ -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)
|
||||
|
@ -766,16 +766,16 @@ public class SelectImpl
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user