Change *ToMany lazy loading to not use the parent entity/table

This commit is contained in:
Rob Bygrave
2014-01-30 22:27:52 +13:00
parent 87a948223c
commit 749f8d0d45
36 changed files with 542 additions and 190 deletions
@@ -1,7 +1,6 @@
package com.avaje.ebean;
import org.avaje.agentloader.AgentLoader;
import org.junit.BeforeClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -9,10 +8,11 @@ public class BaseTestCase {
protected static Logger logger = LoggerFactory.getLogger(BaseTestCase.class);
@BeforeClass
public static void preStart() {
static {
logger.debug("... preStart");
AgentLoader.loadAgentFromClasspath("avaje-ebeanorm-agent","debug=0");
if (!AgentLoader.loadAgentFromClasspath("avaje-ebeanorm-agent","debug=0")) {
logger.info("avaje-ebeanorm-agent not found in classpath - not dynamically loaded");
}
}
}
@@ -10,6 +10,7 @@ import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.Query;
import com.avaje.ebean.SqlUpdate;
import com.avaje.tests.model.basic.MRole;
import com.avaje.tests.model.basic.MUser;
@@ -18,6 +19,14 @@ public class TestM2MVanilla extends BaseTestCase {
@Test
public void testVanilla() {
SqlUpdate delInt = Ebean.createSqlUpdate("delete from mrole_muser");
SqlUpdate delRoles = Ebean.createSqlUpdate("delete from mrole");
SqlUpdate delUsers = Ebean.createSqlUpdate("delete from muser");
Ebean.execute(delInt);
Ebean.execute(delRoles);
Ebean.execute(delUsers);
MRole r1 = new MRole();
r1.setRoleName("role1");
Ebean.save(r1);
@@ -70,15 +79,17 @@ public class TestM2MVanilla extends BaseTestCase {
List<MUser> userInRolesList = rolesQuery.findList();
Assert.assertTrue(userInRolesList.size() > 0);
List<MUser> list = Ebean.find(MUser.class).where().in("roles", roleList).filterMany("roles")
.eq("roleName", "role1").findList();
List<MUser> list = Ebean.find(MUser.class)
.where().in("roles", roleList)
.filterMany("roles").eq("roleName", "role1")
.findList();
MUser mUser = list.get(0);
List<MRole> roles = mUser.getRoles();
Assert.assertEquals(1, roles.size());
Ebean.refreshMany(mUser, "roles");
Assert.assertEquals(1, mUser.getRoles().size());
// Ebean.refreshMany(mUser, "roles");
// Assert.assertEquals(1, mUser.getRoles().size());
checkRoles2.remove(0);
checkRoles2.remove(0);
@@ -10,6 +10,7 @@ import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.SqlQuery;
import com.avaje.ebean.SqlRow;
import com.avaje.ebean.Update;
import com.avaje.ebean.config.dbplatform.DbEncrypt;
import com.avaje.ebeaninternal.api.SpiEbeanServer;
import com.avaje.tests.model.basic.EBasicEncrypt;
@@ -19,6 +20,9 @@ public class TestEncrypt extends BaseTestCase {
@Test
public void test() {
Update<EBasicEncrypt> deleteAll = Ebean.createUpdate(EBasicEncrypt.class, "delete from EBasicEncrypt");
deleteAll.execute();
EBasicEncrypt e = new EBasicEncrypt();
e.setName("testname");
e.setDescription("testdesc");
@@ -61,6 +61,7 @@ public class TestSkippable extends TestCase {
final ListAttributeValue value2_DB_2 = listAttributeDB_2.getValues().iterator().next();
Assert.assertEquals(value2.getId(), value2_DB_2.getId());
Assert.assertTrue("Cascade failed", value2.getId().equals(value2_DB_2.getId()));
}
@@ -0,0 +1,63 @@
package com.avaje.tests.query;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.FetchConfig;
import com.avaje.ebean.Query;
import com.avaje.tests.model.basic.Customer;
import com.avaje.tests.model.basic.Order;
import com.avaje.tests.model.basic.OrderDetail;
import com.avaje.tests.model.basic.Product;
import com.avaje.tests.model.basic.ResetBasicData;
public class TestQueryFilterManyOnSecondary extends BaseTestCase {
@Test
public void testFilterManyWithSimplePredicate() {
ResetBasicData.reset();
Query<Customer> query = Ebean.find(Customer.class)
.fetch("orders", new FetchConfig().query())
.where().ilike("name", "Rob%").gt("id", 0)
.filterMany("orders").eq("status", Order.Status.NEW)
.query();
List<Customer> list = query.findList();
for (Customer customer : list) {
List<Order> orders = customer.getOrders();
for (Order order : orders) {
Assert.assertEquals(Order.Status.NEW, order.getStatus());
}
}
}
@Test
public void testFilterManyWithPathPredicate() {
ResetBasicData.reset();
Query<Order> query = Ebean.find(Order.class)
.fetch("details", new FetchConfig().query())
.fetch("details.product","name")
.filterMany("details").ilike("product.name", "c%")
.query();
List<Order> orders = query.findList();
for (Order order : orders) {
List<OrderDetail> details = order.getDetails();
for (OrderDetail orderDetail : details) {
Product product = orderDetail.getProduct();
String name = product.getName();
Assert.assertTrue(name.startsWith("C"));
}
}
}
}
@@ -7,6 +7,7 @@ import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.FetchConfig;
import com.avaje.ebean.Query;
import com.avaje.tests.model.basic.Order;
import com.avaje.tests.model.basic.ResetBasicData;
@@ -18,8 +19,10 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase {
ResetBasicData.reset();
Query<Order> q = Ebean.find(Order.class).fetch("customer").fetch("customer.contacts").where()
.gt("id", 0).query();
Query<Order> q = Ebean.find(Order.class)
.fetch("customer")
.fetch("customer.contacts")
.where().gt("id", 0).query();
List<Order> list = q.findList();
String sql = q.getGeneratedSql();
@@ -35,8 +38,12 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase {
ResetBasicData.reset();
Query<Order> q = Ebean.find(Order.class).fetch("details").fetch("details.product")
.fetch("customer").fetch("customer.contacts").where().gt("id", 0).query();
Query<Order> q = Ebean.find(Order.class)
.fetch("details")
.fetch("details.product")
.fetch("customer")
.fetch("customer.contacts")
.where().gt("id", 0).query();
List<Order> list = q.findList();
String sql = q.getGeneratedSql();
@@ -55,11 +62,19 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase {
ResetBasicData.reset();
Query<Order> q = Ebean.find(Order.class).fetch("customer").fetch("customer.contacts")
.fetch("details").fetch("details.product").where().gt("id", 0).query();
Query<Order> q = Ebean.find(Order.class)
.fetch("customer")
.fetch("customer.contacts")
.fetch("details", new FetchConfig().query(10))
.fetch("details.product")
.where().gt("id", 0).query();
List<Order> list = q.findList();
String sql = q.getGeneratedSql();
for (Order order : list) {
order.getCustomer().getContacts().size();
}
Assert.assertTrue(list.size() > 0);
Assert.assertTrue(sql.contains("join o_customer t1 on t1.id "));
@@ -0,0 +1,75 @@
package com.avaje.tests.query.other;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.AssertTrue;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebeaninternal.api.SpiEbeanServer;
import com.avaje.ebeaninternal.api.SpiQuery;
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany;
import com.avaje.tests.model.basic.Order;
import com.avaje.tests.model.basic.OrderDetail;
import com.avaje.tests.model.basic.ResetBasicData;
public class TestManyLazyLoadingQuery extends BaseTestCase {
@Test
public void test() {
ResetBasicData.reset();
SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
BeanDescriptor<Order> descOrder = server.getBeanDescriptor(Order.class);
BeanPropertyAssocMany<?> beanProperty = (BeanPropertyAssocMany<?>)descOrder.getBeanProperty("details");
List<Object> parentIds = new ArrayList<Object>();
parentIds.add(1);
List<Order> orders =
Ebean.find(Order.class)
.where().lt("id", 4)
.findList();
for (Order order : orders) {
List<OrderDetail> details = order.getDetails();
System.out.println(details.size());
}
// start transaction to keep PC going to lazy query
Ebean.beginTransaction();
try {
Ebean.find(Order.class, 1);
SpiQuery<?> query0 = (SpiQuery<?>)Ebean.find(OrderDetail.class);
query0.setLazyLoadForParents(parentIds, beanProperty);
beanProperty.addWhereParentIdIn(query0, parentIds);
List<?> list0 = query0.findList();
} finally {
Ebean.endTransaction();
}
List<OrderDetail> details = Ebean.find(OrderDetail.class)
.where().eq("order.id", 1)
.findList();
for (OrderDetail orderDetail : details) {
System.out.println(orderDetail);
}
}
}
@@ -0,0 +1,42 @@
package com.avaje.tests.query.other;
import java.util.List;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.tests.model.basic.MRole;
import com.avaje.tests.model.basic.MUser;
public class TestManyToManyLazyLoading extends BaseTestCase {
@Test
public void test() {
createData();
List<MUser> users = Ebean.find(MUser.class).findList();
for (MUser user : users) {
List<MRole> roles = user.getRoles();
System.out.println(""+roles.size());
}
}
private void createData() {
MRole r0 = new MRole("r0");
MRole r1 = new MRole("r1");
Ebean.save(r0);
Ebean.save(r1);
MUser u0 = new MUser("usr0");
u0.addRole(r0);
u0.addRole(r1);
Ebean.save(u0);
}
}