#2067 - Extract ebean-autotune into separate module

This commit is contained in:
rob bygrave committed 2020-10-08 23:34:56 +13:00
1 parent 7c36439daf
commit d113ddc525
48 files changed
+700 -424

No files matched your search

@@ -1,31 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebeaninternal.server.autotune.model.Autotune;
import org.junit.Test;
import java.io.File;
import java.io.InputStream;
import static org.assertj.core.api.Assertions.assertThat;
public class AutoTuneXmlReaderTest {
@Test
public void read_file() throws Exception {
File testFile = new File("src/test/resources/autotune/test-autotune.xml");
Autotune tuneInfo = AutoTuneXmlReader.read(testFile);
assertThat(tuneInfo.getOrigin()).isNotEmpty();
}
@Test
public void read_inputStream() throws Exception {
InputStream is = getClass().getResourceAsStream("/autotune/test-autotune.xml");
Autotune tuneInfo = AutoTuneXmlReader.read(is);
assertThat(tuneInfo.getOrigin()).isNotEmpty();
}
}
@@ -1,143 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.bean.NodeUsageCollector;
import io.ebean.bean.ObjectGraphNode;
import io.ebean.bean.ObjectGraphOrigin;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import org.junit.Test;
import org.tests.model.basic.Order;
import org.tests.model.basic.ResetBasicData;
import static org.assertj.core.api.Assertions.assertThat;
public class ProfileOriginTest extends BaseTestCase {
private BeanDescriptor<Order> desc = getBeanDescriptor(Order.class);
@Test
public void buildDetail() {
NodeUsageCollector c = node("customer");
c.addUsed("id");
c.addUsed("name");
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
po.collectUsageInfo(c);
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString().trim()).isEqualTo("fetch customer (name)");
}
@Test
public void buildDetail_selectFetch() {
NodeUsageCollector c = node("customer");
c.addUsed("id");
c.addUsed("name");
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
po.collectUsageInfo(c);
c = node(null);
c.addUsed("orderDate");
po.collectUsageInfo(c);
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString()).isEqualTo("select (orderDate) fetch customer (name)");
}
@Test
public void buildDetail_expect_mergeFetchToSelect() {
NodeUsageCollector c = node("customer");
c.addUsed("id");
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
po.collectUsageInfo(c);
c = node(null);
c.addUsed("orderDate");
po.collectUsageInfo(c);
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString().trim()).isEqualTo("select (orderDate,customer)");
}
@Test
public void buildDetail_expect_mergeFetchToParentFetch() {
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
NodeUsageCollector c = node(null);
c.addUsed("orderDate");
c.addUsed("customer");
po.collectUsageInfo(c);
c = node("customer");
c.addUsed("billingAddress");
po.collectUsageInfo(c);
c = node("customer.billingAddress");
c.addUsed("id");
po.collectUsageInfo(c);
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString()).isEqualTo("select (orderDate) fetch customer (billingAddress)");
}
@Test
public void buildDetail_expect_mergeMulit() {
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
//fetch details (id,orderQty,shipQty,unitPrice)
NodeUsageCollector c = node(null);
c.addUsed("details");
po.collectUsageInfo(c);
c = node("details");
c.addUsed("id");
c.addUsed("orderQty");
c.addUsed("shipQty");
c.addUsed("unitPrice");
c.addUsed("product");
po.collectUsageInfo(c);
//fetch details.product (id,name)
c = node("details.product");
c.addUsed("id");
c.addUsed("name");
po.collectUsageInfo(c);
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString()).isEqualTo("fetch details (orderQty,shipQty,unitPrice) fetch details.product (name)");
}
private NodeUsageCollector node(String path) {
ObjectGraphNode node = new ObjectGraphNode((ObjectGraphOrigin)null, path);
return new NodeUsageCollector(node, null);
}
@Test
public void testQueries() {
ResetBasicData.reset();
//DB.createQuery(Order.class, "select (orderDate) fetch customer (billingAddress)").findList();
// we prefer this first query other the second one
DB.createQuery(Order.class, "select (orderDate,customer)").findList();
DB.createQuery(Order.class, "select (orderDate) fetch customer (id)").findList();
}
}
@@ -1,67 +0,0 @@
package org.tests.autofetch;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import org.tests.model.embedded.EMain;
import org.tests.model.embedded.Eembeddable;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AutofetchEmbeddedTest extends BaseTestCase {
private final Logger logger = LoggerFactory.getLogger(AutofetchEmbeddedTest.class);
@Test
public void testEmbeddedBeanLazyLoadAndUpdate() {
EMain testBean = new EMain();
testBean.setName("test");
testBean.getEmbeddable().setDescription("test description");
Ebean.save(testBean);
EMain partialBean = Ebean.find(EMain.class).select("version").setId(testBean.getId()).findOne();
logger.info(" -- invoke lazy loading of embedded bean");
Eembeddable embeddable = partialBean.getEmbeddable();
embeddable.setDescription("modified description");
logger.info(" -- update bean");
Ebean.save(partialBean);
}
@Test
public void testEmbeddedBeanQueryTuning() {
// Ebean.getServer(null).getAutoTune().setProfiling(true);
// Ebean.getServer(null).getAutoTune().setQueryTuning(true);
// Ebean.getServer(null).getAutoTune().setProfilingBase(1);
//
// EMain testBean = new EMain();
// testBean.setName("test");
// testBean.getEmbeddable().setDescription("test description");
// Ebean.save(testBean);
//
// //This should not throw an exception
// for (int i = 0; i < 5; i++) {
// Ebean.beginTransaction();
// try {
// List<EMain> result = Ebean.find(EMain.class).setAutoTune(true).findList();
// for (EMain e : result) {
// e.getEmbeddable().setDescription("Test" + i);
// Ebean.save(e);
// }
// Ebean.commitTransaction();
// } finally {
// Ebean.endTransaction();
// logger.debug(Ebean.getServer(null).getAutoTune().collectProfiling());
// }
// }
}
@Test
public void testEmbeddedFetch() {
Ebean.find(EMain.class).fetch("embeddable").findList();
}
}
@@ -1,32 +0,0 @@
package org.tests.autofetch;
import io.ebean.Ebean;
import org.tests.model.basic.EBasicClob;
import java.util.List;
public class MainAutoFetchExcludeLazyLobs {
public static void main(String[] args) {
EBasicClob a = new EBasicClob();
a.setName("name 1");
a.setTitle("a title");
a.setDescription("not that meaningful");
Ebean.save(a);
List<EBasicClob> list = Ebean.find(EBasicClob.class)
.setAutoTune(true)
.findList();
for (EBasicClob bean : list) {
bean.getName();
// although we read the description
// autofetch will not include it later
bean.getDescription();
}
}
}
@@ -1,34 +0,0 @@
package org.tests.autofetch;
import io.ebean.Ebean;
import org.tests.model.basic.Order;
import org.tests.model.basic.ResetBasicData;
import java.util.List;
public class MainAutoQueryTune1 {
public static void main(String[] args) {
ResetBasicData.reset();
MainAutoQueryTune1 me = new MainAutoQueryTune1();
me.tuneJoin();
}
private void tuneJoin() {
List<Order> list = Ebean.find(Order.class)
.setAutoTune(true)
.fetch("customer")
.where()
.eq("status", Order.Status.NEW)
.eq("customer.name", "Rob")
.order().asc("id")
.findList();
for (Order order : list) {
order.getId();
order.getOrderDate();
}
}
}
@@ -1,174 +0,0 @@
package org.tests.autofetch;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.Query;
import io.ebean.bean.EntityBean;
import io.ebean.bean.EntityBeanIntercept;
import io.ebean.cache.ServerCacheManager;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.autotune.model.Origin;
import io.ebeaninternal.server.autotune.service.TunedQueryInfo;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import org.tests.model.basic.Order;
import org.tests.model.basic.ResetBasicData;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
import java.util.Set;
public class TunedQueryInfoTest extends BaseTestCase {
EbeanServer server = Ebean.getServer(null);
private void init() {
ResetBasicData.reset();
ServerCacheManager serverCacheManager = Ebean.getServer(null).getServerCacheManager();
serverCacheManager.clearAll();
}
@Test
public void withSelectEmpty() {
init();
OrmQueryDetail tunedDetail = new OrmQueryDetail();
tunedDetail.select("");
TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail);
Query<Order> query = server.find(Order.class).setId(1);
tunedInfo.tuneQuery((SpiQuery<?>) query);
Order order = query.findOne();
EntityBean eb = (EntityBean) order;
EntityBeanIntercept ebi = eb._ebean_getIntercept();
Assert.assertTrue(ebi.isFullyLoadedBean());
Set<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
Assert.assertNull(loadedPropertyNames);
// invoke lazy loading
order.getCustomer();
}
@Test
public void withSelectSomethingThatDoesNotExist() {
init();
OrmQueryDetail tunedDetail = new OrmQueryDetail();
tunedDetail.select("somethingThatDoesNotExist");
TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail);
Query<Order> query = server.find(Order.class).setId(1);
tunedInfo.tuneQuery((SpiQuery<?>) query);
LoggedSqlCollector.start();
Order order = query.findOne();
EntityBean eb = (EntityBean) order;
EntityBeanIntercept ebi = eb._ebean_getIntercept();
Assert.assertFalse(ebi.isFullyLoadedBean());
// id and any ToMany relationships
Set<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
Assert.assertNotNull(loadedPropertyNames);
// invoke lazy loading
order.getCustomer();
List<String> loggedSql = LoggedSqlCollector.stop();
Assert.assertEquals(2, loggedSql.size());
Assert.assertTrue(trimSql(loggedSql.get(0), 1).contains("select t0.id, t0.id from o_order t0 where t0.id = ?"));
Assert.assertTrue(trimSql(loggedSql.get(1), 1).contains("select t0.id, t0.status,"));
}
private TunedQueryInfo createTunedQueryInfo(OrmQueryDetail tunedDetail) {
Origin origin = new Origin();
origin.setDetail(tunedDetail.asString());
return new TunedQueryInfo(origin);
}
@Test
public void withSelectSomeIncludeLazyLoaded() {
init();
OrmQueryDetail tunedDetail = new OrmQueryDetail();
tunedDetail.select("status, customer");
TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail);
Query<Order> query = server.find(Order.class).setId(1);
tunedInfo.tuneQuery((SpiQuery<?>) query);
LoggedSqlCollector.start();
Order order = query.findOne();
EntityBean eb = (EntityBean) order;
EntityBeanIntercept ebi = eb._ebean_getIntercept();
Assert.assertFalse(ebi.isFullyLoadedBean());
Set<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
Assert.assertNotNull(loadedPropertyNames);
Assert.assertTrue(loadedPropertyNames.contains("status"));
Assert.assertTrue(loadedPropertyNames.contains("customer"));
// no lazy loading expected here
order.getCustomer();
List<String> loggedSql = LoggedSqlCollector.stop();
Assert.assertEquals(1, loggedSql.size());
}
@Test
public void withSelectSome() {
init();
OrmQueryDetail tunedDetail = new OrmQueryDetail();
tunedDetail.select("status");
TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail);
Query<Order> query = server.find(Order.class).setId(1);
tunedInfo.tuneQuery((SpiQuery<?>) query);
LoggedSqlCollector.start();
Order order = query.findOne();
EntityBean eb = (EntityBean) order;
EntityBeanIntercept ebi = eb._ebean_getIntercept();
Assert.assertFalse(ebi.isFullyLoadedBean());
Set<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
Assert.assertNotNull(loadedPropertyNames);
Assert.assertTrue(loadedPropertyNames.contains("status"));
Assert.assertFalse(loadedPropertyNames.contains("customer"));
// no lazy loading expected here
order.getCustomer();
List<String> loggedSql = LoggedSqlCollector.stop();
Assert.assertEquals(2, loggedSql.size());
}
}
@@ -1,69 +0,0 @@
package org.tests.autofetch;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.Query;
import io.ebean.bean.EntityBean;
import io.ebean.bean.EntityBeanIntercept;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Assert;
import org.junit.Test;
import org.tests.model.basic.Address;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
import java.util.List;
import java.util.Set;
public class TunedQueryWithNullFetchedBeanTest extends BaseTestCase {
EbeanServer server = Ebean.getServer(null);
@Test
public void withFetchOfNullBeanJoin() {
ResetBasicData.reset();
Customer newCustomer = new Customer();
newCustomer.setName("TestFetchBillingAddress");
server.save(newCustomer);
Query<Customer> query = server.find(Customer.class)
.setId(newCustomer.getId())
.fetch("billingAddress", "id");
LoggedSqlCollector.start();
Customer customer = query.findOne();
EntityBean eb = (EntityBean) customer;
EntityBeanIntercept ebi = eb._ebean_getIntercept();
Assert.assertTrue(ebi.isFullyLoadedBean());
// find the internal property index for "billingAddress"
String[] propNames = eb._ebean_getPropertyNames();
int pos = 0;
for (int i = 0; i < propNames.length; i++) {
if (propNames[i].equals("billingAddress")) {
pos = i;
}
}
// The billing address is loaded (but value null)
Assert.assertTrue(ebi.isLoadedProperty(pos));
Set<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
Assert.assertNull(loadedPropertyNames);
// no lazy loading expected here, value is null
Address billingAddress = customer.getBillingAddress();
Assert.assertNull(billingAddress);
// assert only one query executed
List<String> loggedSql = LoggedSqlCollector.stop();
Assert.assertEquals(1, loggedSql.size());
Ebean.delete(newCustomer);
}
}
@@ -4,23 +4,20 @@ import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
import io.ebean.cache.ServerCache;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.autotune.model.Origin;
import io.ebeaninternal.server.autotune.service.TunedQueryInfo;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import org.tests.model.basic.FeatureDescription;
import org.junit.Assert;
import org.junit.Test;
import org.tests.model.basic.FeatureDescription;
import static org.junit.Assert.assertEquals;
public class TestL2CacheWithSharedBean extends BaseTestCase {
private TunedQueryInfo createTunedQueryInfo(OrmQueryDetail tunedDetail) {
Origin origin = new Origin();
origin.setDetail(tunedDetail.toString());
return new TunedQueryInfo(origin);
}
// private TunedQueryInfo createTunedQueryInfo(OrmQueryDetail tunedDetail) {
// Origin origin = new Origin();
// origin.setDetail(tunedDetail.toString());
// return new TunedQueryInfo(origin);
// }
@Test
public void test() {
@@ -36,11 +33,11 @@ public class TestL2CacheWithSharedBean extends BaseTestCase {
OrmQueryDetail tunedDetail = new OrmQueryDetail();
tunedDetail.select("name");
TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail);
// TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail);
Query<FeatureDescription> query = Ebean.find(FeatureDescription.class).setId(f1.getId());
tunedInfo.tuneQuery((SpiQuery<?>) query);
// tunedInfo.tuneQuery((SpiQuery<?>) query);
query.findOne(); // PUT into cache
@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<autotune xmlns="http://ebean-orm.github.io/xml/ns/autotune">
<origin key="DWeHD4.B0dP9Z.DKG8lq" beanType="org.tests.model.basic.Order" detail="select (status,shipDate) " original="select (status, orderDate, shipDate) ">
<callStack>org.tests.query.autotune.TestAutoTuneProfiling.findById(TestAutoTuneProfiling.java:62)
org.tests.query.autotune.TestAutoTuneProfiling.useOrderDate(TestAutoTuneProfiling.java:66)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:52)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:25)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
</callStack>
</origin>
<origin key="DWeHD4.BZfmOY.Yd8Hf" beanType="org.tests.model.basic.Order" detail=" fetch customer (id) fetch details (orderQty,shipQty,unitPrice) fetch details.product (id,name) " original="select (id) fetch details ">
<callStack>org.tests.query.autotune.TestAutoTuneProfiling.useLotUntuned(TestAutoTuneProfiling.java:95)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:55)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:25)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
</callStack>
</origin>
<origin key="DWeHD4.l6b4M.BYWlSr" beanType="org.tests.model.basic.Order" detail=" fetch customer (name) " original="">
<callStack>org.tests.model.basic.Order._ebean_get_customer(Order.java:6)
org.tests.model.basic.Order.getCustomer(Order.java:228)
org.tests.query.autotune.TestAutoTuneProfiling.useOrderDateCustomerName(TestAutoTuneProfiling.java:74)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:53)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:25)
</callStack>
</origin>
<origin key="DVf2Cn.StLsZ.BCru36" beanType="org.tests.model.basic.OrderDetail" detail=" fetch product (name) " original="">
<callStack>org.tests.model.basic.OrderDetail._ebean_get_product(OrderDetail.java:6)
org.tests.model.basic.OrderDetail.getProduct(OrderDetail.java:150)
org.tests.query.autotune.TestAutoTuneProfiling.useLotUntuned(TestAutoTuneProfiling.java:96)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:55)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:32)
</callStack>
</origin>
</autotune>