Fix for #224 - ENH: Add tableAliasMapping() to RawSqlBuilder ... for better mapping of complex objects with raw sql

This commit is contained in:
rbygrave
2014-12-17 23:58:27 +13:00
parent b6a0653a3c
commit 4adf5a9eba
4 changed files with 177 additions and 48 deletions
@@ -5,6 +5,8 @@ import org.junit.Test;
import com.avaje.ebean.RawSql.Sql;
import static org.junit.Assert.assertEquals;
public class TestRawSqlBuilder extends BaseTestCase {
@Test
@@ -12,9 +14,9 @@ public class TestRawSqlBuilder extends BaseTestCase {
RawSqlBuilder r = RawSqlBuilder.parse("select id from t_cust");
Sql sql = r.getSql();
Assert.assertEquals("id", sql.getPreFrom());
Assert.assertEquals("from t_cust", sql.getPreWhere());
Assert.assertEquals("", sql.getPreHaving());
assertEquals("id", sql.getPreFrom());
assertEquals("from t_cust", sql.getPreWhere());
assertEquals("", sql.getPreHaving());
Assert.assertNull(sql.getOrderBy());
}
@@ -24,9 +26,9 @@ public class TestRawSqlBuilder extends BaseTestCase {
RawSqlBuilder r = RawSqlBuilder.parse("select id from t_cust where id > ?");
Sql sql = r.getSql();
Assert.assertEquals("id", sql.getPreFrom());
Assert.assertEquals("from t_cust where id > ?", sql.getPreWhere());
Assert.assertEquals("", sql.getPreHaving());
assertEquals("id", sql.getPreFrom());
assertEquals("from t_cust where id > ?", sql.getPreWhere());
assertEquals("", sql.getPreHaving());
Assert.assertNull(sql.getOrderBy());
}
@@ -35,26 +37,26 @@ public class TestRawSqlBuilder extends BaseTestCase {
RawSqlBuilder r = RawSqlBuilder.parse("select id from t_cust where id > ? order by id desc");
Sql sql = r.getSql();
Assert.assertEquals("id", sql.getPreFrom());
Assert.assertEquals("from t_cust where id > ?", sql.getPreWhere());
Assert.assertEquals("", sql.getPreHaving());
Assert.assertEquals("order by", sql.getOrderByPrefix());
Assert.assertEquals("id desc", sql.getOrderBy());
assertEquals("id", sql.getPreFrom());
assertEquals("from t_cust where id > ?", sql.getPreWhere());
assertEquals("", sql.getPreHaving());
assertEquals("order by", sql.getOrderByPrefix());
assertEquals("id desc", sql.getOrderBy());
r = RawSqlBuilder.parse("select id from t_cust order by id desc");
sql = r.getSql();
Assert.assertEquals("id", sql.getPreFrom());
Assert.assertEquals("from t_cust", sql.getPreWhere());
Assert.assertEquals("", sql.getPreHaving());
Assert.assertEquals("id desc", sql.getOrderBy());
assertEquals("id", sql.getPreFrom());
assertEquals("from t_cust", sql.getPreWhere());
assertEquals("", sql.getPreHaving());
assertEquals("id desc", sql.getOrderBy());
r = RawSqlBuilder
.parse("select id, sum(x) from t_cust where id > ? group by id order by id desc");
sql = r.getSql();
Assert.assertEquals("id, sum(x)", sql.getPreFrom());
Assert.assertEquals("from t_cust where id > ?", sql.getPreWhere());
Assert.assertEquals("group by id", sql.getPreHaving());
Assert.assertEquals("id desc", sql.getOrderBy());
assertEquals("id, sum(x)", sql.getPreFrom());
assertEquals("from t_cust where id > ?", sql.getPreWhere());
assertEquals("group by id", sql.getPreHaving());
assertEquals("id desc", sql.getOrderBy());
}
@Test
@@ -63,40 +65,40 @@ public class TestRawSqlBuilder extends BaseTestCase {
RawSqlBuilder r = RawSqlBuilder
.parse("select id, sum(x) from t_cust where id > ? group by id having sum(x) > ? order by id desc");
Sql sql = r.getSql();
Assert.assertEquals("id, sum(x)", sql.getPreFrom());
Assert.assertEquals("from t_cust where id > ?", sql.getPreWhere());
Assert.assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
Assert.assertEquals("order by", sql.getOrderByPrefix());
Assert.assertEquals("id desc", sql.getOrderBy());
assertEquals("id, sum(x)", sql.getPreFrom());
assertEquals("from t_cust where id > ?", sql.getPreWhere());
assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
assertEquals("order by", sql.getOrderByPrefix());
assertEquals("id desc", sql.getOrderBy());
// no where
r = RawSqlBuilder
.parse("select id, sum(x) from t_cust group by id having sum(x) > ? order by id desc");
sql = r.getSql();
Assert.assertEquals("id, sum(x)", sql.getPreFrom());
Assert.assertEquals("from t_cust", sql.getPreWhere());
Assert.assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
Assert.assertEquals("order by", sql.getOrderByPrefix());
Assert.assertEquals("id desc", sql.getOrderBy());
assertEquals("id, sum(x)", sql.getPreFrom());
assertEquals("from t_cust", sql.getPreWhere());
assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
assertEquals("order by", sql.getOrderByPrefix());
assertEquals("id desc", sql.getOrderBy());
// no where, no order by
r = RawSqlBuilder.parse("select id, sum(x) from t_cust group by id having sum(x) > ?");
sql = r.getSql();
Assert.assertEquals("id, sum(x)", sql.getPreFrom());
Assert.assertEquals("from t_cust", sql.getPreWhere());
Assert.assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
assertEquals("id, sum(x)", sql.getPreFrom());
assertEquals("from t_cust", sql.getPreWhere());
assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
Assert.assertNull(sql.getOrderBy());
Assert.assertEquals("order by", sql.getOrderByPrefix());
assertEquals("order by", sql.getOrderByPrefix());
// no order by
r = RawSqlBuilder
.parse("select id, sum(x) from t_cust where id > ? group by id having sum(x) > ?");
sql = r.getSql();
Assert.assertEquals("id, sum(x)", sql.getPreFrom());
Assert.assertEquals("from t_cust where id > ?", sql.getPreWhere());
Assert.assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
assertEquals("id, sum(x)", sql.getPreFrom());
assertEquals("from t_cust where id > ?", sql.getPreWhere());
assertEquals("group by id having sum(x) > ?", sql.getPreHaving());
Assert.assertNull(sql.getOrderBy());
Assert.assertEquals("order by", sql.getOrderByPrefix());
assertEquals("order by", sql.getOrderByPrefix());
}
/**
@@ -110,10 +112,43 @@ public class TestRawSqlBuilder extends BaseTestCase {
RawSql rawSql = RawSqlBuilder.parse(s).create();
Sql sql = rawSql.getSql();
Assert.assertEquals("ID, DESCRIPTION, NAME, PARENT_ID", sql.getPreFrom());
Assert.assertEquals("order siblings by", sql.getOrderByPrefix());
Assert.assertEquals("NAME", sql.getOrderBy());
Assert.assertEquals("FROM SOME_TABLE WHERE lower(NAME) like :name START WITH ID = :parentId CONNECT BY PRIOR ID = PARENT_ID", sql.getPreWhere());
assertEquals("ID, DESCRIPTION, NAME, PARENT_ID", sql.getPreFrom());
assertEquals("order siblings by", sql.getOrderByPrefix());
assertEquals("NAME", sql.getOrderBy());
assertEquals("FROM SOME_TABLE WHERE lower(NAME) like :name START WITH ID = :parentId CONNECT BY PRIOR ID = PARENT_ID", sql.getPreWhere());
}
@Test
public void testWithAlias() {
String rs = "select o.id, o.status, c.id, c.name, "+
" d.id, d.order_qty, p.id, p.name " +
"from o_order o join o_customer c on c.id = o.kcustomer_id " +
"join o_order_detail d on d.order_id = o.id " +
"join o_product p on p.id = d.product_id " +
"where o.id <= :maxOrderId and p.id = :productId "+
"order by o.id, d.id asc";
RawSql rawSql = RawSqlBuilder.parse(rs)
.tableAliasMapping("c", "customer")
.tableAliasMapping("d", "details")
.tableAliasMapping("p", "details.product")
.create();
RawSql.ColumnMapping columnMapping = rawSql.getColumnMapping();
assertEquals(0, columnMapping.getIndexPosition("id"));
assertEquals(1, columnMapping.getIndexPosition("status"));
assertEquals(2, columnMapping.getIndexPosition("customer.id"));
assertEquals(3, columnMapping.getIndexPosition("customer.name"));
assertEquals(4, columnMapping.getIndexPosition("details.id"));
assertEquals(5, columnMapping.getIndexPosition("details.orderQty"));
assertEquals(6, columnMapping.getIndexPosition("details.product.id"));
assertEquals(7, columnMapping.getIndexPosition("details.product.name"));
}
}
@@ -47,6 +47,64 @@ public class TestRawSqlMasterDetail extends BaseTestCase {
}
@Test
public void testWithTableAliasMapping() {
ResetBasicData.reset();
String rs = "select o.id, o.status, c.id, c.name, "+
" d.id, d.order_qty, p.id, p.name " +
"from o_order o join o_customer c on c.id = o.kcustomer_id " +
"join o_order_detail d on d.order_id = o.id " +
"join o_product p on p.id = d.product_id " +
"where o.id <= :maxOrderId and p.id = :productId "+
"order by o.id, d.id asc";
RawSql rawSql = RawSqlBuilder.parse(rs)
.tableAliasMapping("c", "customer")
.tableAliasMapping("d", "details")
.tableAliasMapping("p", "details.product")
.create();
List<Order> ordersFromRaw = Ebean.find(Order.class)
.setRawSql(rawSql)
.setParameter("maxOrderId", 2)
.setParameter("productId", 1)
.findList();
printOrders(ordersFromRaw, "using RawSql with tableAlias mapping");
}
@Test
public void testWithMultipleManys() {
ResetBasicData.reset();
String rs = "select o.id, o.status, c.id, c.name, "+
" d.id, d.order_qty, p.id, p.name " +
"from o_order o join o_customer c on c.id = o.kcustomer_id " +
"join o_order_detail d on d.order_id = o.id " +
"join o_product p on p.id = d.product_id " +
"order by o.id, d.id asc";
RawSql rawSql = RawSqlBuilder.parse(rs)
.tableAliasMapping("c", "customer")
.tableAliasMapping("d", "details")
.tableAliasMapping("p", "details.product")
.create();
List<Order> ordersFromRaw = Ebean.find(Order.class)
.setRawSql(rawSql)
.findList();
printOrders(ordersFromRaw, "using RawSql with tableAlias mapping");
}
private void printOrders(List<Order> orders, String heading) {
System.out.println("-------------- "+heading);
for (Order order : orders) {