mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
#1730 - Fix for wrong JDBC batch sorting / ordering
This is a bit of a refactor that simplifies the ordering of batch execution (BatchedBeanHolder ordering). In short we batch by bean type and depth (rather than just type). This means that there are some cases we are not optimal (where we could batch by bean type in different depths) but that is expected to be rare and problematic for hierarchies of the same type.
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package io.ebeaninternal.server.persist;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class BatchDepthOrderTest {
|
||||
|
||||
@Test
|
||||
public void orderingFor() {
|
||||
|
||||
BatchDepthOrder depthOrder = new BatchDepthOrder();
|
||||
|
||||
assertEquals(0, depthOrder.orderingFor(0));
|
||||
assertEquals(1, depthOrder.orderingFor(0));
|
||||
assertEquals(2, depthOrder.orderingFor(0));
|
||||
assertEquals(100, depthOrder.orderingFor(1));
|
||||
assertEquals(101, depthOrder.orderingFor(1));
|
||||
assertEquals(200, depthOrder.orderingFor(2));
|
||||
assertEquals(3, depthOrder.orderingFor(0));
|
||||
|
||||
assertEquals(-100, depthOrder.orderingFor(-1));
|
||||
assertEquals(-99, depthOrder.orderingFor(-1));
|
||||
assertEquals(-98, depthOrder.orderingFor(-1));
|
||||
|
||||
assertEquals(-200, depthOrder.orderingFor(-2));
|
||||
assertEquals(-199, depthOrder.orderingFor(-2));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void clear() {
|
||||
|
||||
BatchDepthOrder depthOrder = new BatchDepthOrder();
|
||||
|
||||
assertEquals(0, depthOrder.orderingFor(0));
|
||||
assertEquals(1, depthOrder.orderingFor(0));
|
||||
assertEquals(100, depthOrder.orderingFor(1));
|
||||
assertEquals(101, depthOrder.orderingFor(1));
|
||||
|
||||
depthOrder.clear();
|
||||
|
||||
assertEquals(0, depthOrder.orderingFor(0));
|
||||
assertEquals(100, depthOrder.orderingFor(1));
|
||||
assertEquals(200, depthOrder.orderingFor(2));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package io.ebeaninternal.server.persist;
|
||||
|
||||
import io.ebean.BaseTestCase;
|
||||
import io.ebeaninternal.api.TDSpiEbeanServer;
|
||||
import io.ebeaninternal.server.core.PersistRequest;
|
||||
import io.ebeaninternal.server.core.PersistRequestBean;
|
||||
import io.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import io.ebeaninternal.server.deploy.BeanManager;
|
||||
import org.junit.Test;
|
||||
import org.tests.model.basic.Customer;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class BatchedBeanHolderTest extends BaseTestCase {
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Test
|
||||
public void testAppend() {
|
||||
|
||||
TDSpiEbeanServer server = new TDSpiEbeanServer("foo");
|
||||
|
||||
BeanDescriptor beanDescriptor = getBeanDescriptor(Customer.class);
|
||||
|
||||
//BeanDescriptor beanDescriptor = Mockito.mock(BeanDescriptor.class);
|
||||
BeanManager beanManager = new BeanManager(beanDescriptor, null);
|
||||
|
||||
|
||||
BatchedBeanHolder holder = new BatchedBeanHolder(null, beanDescriptor, 1);
|
||||
|
||||
Customer customer = new Customer();
|
||||
customer.setUpdtime(new Timestamp(System.currentTimeMillis()));
|
||||
PersistRequestBean req1 = new PersistRequestBean(server, customer, null, beanManager, null, null, PersistRequest.Type.INSERT, 0);
|
||||
|
||||
|
||||
int size = holder.append(req1);
|
||||
assertEquals(1, size);
|
||||
|
||||
PersistRequestBean req2 = new PersistRequestBean(server, customer, null, beanManager, null, null, PersistRequest.Type.INSERT, 0);
|
||||
size = holder.append(req2);
|
||||
assertEquals(0, size);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ public class TestMultiCascadeBatch extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void testMultipleCascadeInsideTransaction() {
|
||||
|
||||
final Site mainSite = new Site();
|
||||
mainSite.setName("mainSite");
|
||||
Ebean.save(mainSite);
|
||||
|
||||
@@ -38,7 +38,7 @@ public class TestInsertBatchThenFlushThenUpdate extends BaseTestCase {
|
||||
Ebean.save(parent);
|
||||
|
||||
// nothing flushed yet
|
||||
assertEquals(0, LoggedSqlCollector.start().size());
|
||||
assertThat(LoggedSqlCollector.start()).isEmpty();
|
||||
|
||||
txn.flushBatch();
|
||||
|
||||
@@ -49,14 +49,14 @@ public class TestInsertBatchThenFlushThenUpdate extends BaseTestCase {
|
||||
Ebean.save(parent);
|
||||
|
||||
// nothing flushed yet
|
||||
assertEquals(0, LoggedSqlCollector.start().size());
|
||||
assertThat(LoggedSqlCollector.start()).isEmpty();
|
||||
|
||||
Ebean.commitTransaction();
|
||||
|
||||
// insert statements for EdExtendedParent
|
||||
List<String> loggedSql2 = LoggedSqlCollector.start();
|
||||
assertEquals(2, loggedSql2.size());
|
||||
assertTrue(loggedSql2.get(0).contains(" update td_parent "));
|
||||
assertThat(loggedSql2).hasSize(2);
|
||||
assertThat(loggedSql2.get(0)).contains(" update td_parent ");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user