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:
Catalina Wei 2009-03-16 17:16:39 +00:00
parent 44ffbd2f79
commit 29a2d30a8a
9 changed files with 100 additions and 19 deletions

View File

@ -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)

View File

@ -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;
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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);

View File

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

View File

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