#1795 - Refactor bind padding for Id IN expressions (based on internal multiValueSupport and simple id)

This commit is contained in:
rob bygrave
2019-08-18 16:33:36 +12:00
parent d7d8c3e651
commit 9155716752
14 changed files with 214 additions and 113 deletions
@@ -0,0 +1,51 @@
package io.ebeaninternal.server.core;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
public class BindPaddingTest {
@Test
public void padIds() {
final List<Object> input = asList(1, 2);
BindPadding.padIds(input);
assertThat(input).contains(1,2,1,1,1);
assertThat(input).hasSize(5);
}
private List<Object> asList(int... id) {
List<Object> list = new ArrayList<>();
for (int i : id) {
list.add(i);
}
return list;
}
@Test
public void padding() {
assertEquals(0, BindPadding.padding(1));
assertEquals(3, BindPadding.padding(2));
assertEquals(2, BindPadding.padding(3));
assertEquals(1, BindPadding.padding(4));
assertEquals(0, BindPadding.padding(5));
assertEquals(4, BindPadding.padding(6));
assertEquals(1, BindPadding.padding(9));
assertEquals(0, BindPadding.padding(10));
assertEquals(9, BindPadding.padding(11));
assertEquals(0, BindPadding.padding(20));
assertEquals(19, BindPadding.padding(21));
assertEquals(0, BindPadding.padding(40));
assertEquals(9, BindPadding.padding(41));
assertEquals(0, BindPadding.padding(50));
assertEquals(49, BindPadding.padding(51));
assertEquals(0, BindPadding.padding(100));
assertEquals(0, BindPadding.padding(101));
}
}
@@ -20,18 +20,18 @@ public abstract class BaseExpressionTest extends BaseTestCase {
}
protected String hash(SpiExpression expression) {
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder();
if (expression != null) {
expression.queryPlanHash(sb);
}
return sb.toString();
}
protected void same(SpiExpression one, SpiExpression two){
protected void same(SpiExpression one, SpiExpression two) {
assertThat(hash(one)).isEqualTo(hash(two));
}
protected void different(SpiExpression one, SpiExpression two){
protected void different(SpiExpression one, SpiExpression two) {
assertThat(hash(one)).isNotEqualTo(hash(two));
}
@@ -50,7 +50,7 @@ public abstract class BaseExpressionTest extends BaseTestCase {
}
private static final TDQueryRequest<Customer> MULTI_VALUE= new TDQueryRequest<>(true);
private static final TDQueryRequest<Customer> MULTI_VALUE = new TDQueryRequest<>(true);
private static final TDQueryRequest<Customer> NO_MULTI_VALUE = new TDQueryRequest<>(false);
static class TDQueryRequest<T> implements BeanQueryRequest<T> {
@@ -76,6 +76,11 @@ public abstract class BaseExpressionTest extends BaseTestCase {
return null;
}
@Override
public boolean isPadInExpression() {
return supported;
}
@Override
public boolean isMultiValueIdSupported() {
return supported;
+2 -2
View File
@@ -76,7 +76,7 @@ public class TestBeanCache extends BaseTestCase {
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(1);
if (isH2()) {
assertThat(sql.get(0)).contains("from o_cached_bean t0 where t0.id in (?,?,?)");
assertThat(sql.get(0)).contains("from o_cached_bean t0 where t0.id in (?,?,?,?,?)");
}
log.info("All hits (3 of 3) ...");
@@ -124,7 +124,7 @@ public class TestBeanCache extends BaseTestCase {
assertThat(sql).hasSize(1);
if (isH2()) {
// fetch the misses from DB
assertThat(sql.get(0)).contains("from o_cached_bean t0 where t0.id in (?,?)");
assertThat(sql.get(0)).contains("from o_cached_bean t0 where t0.id in (?,?,?,?,?)");
}
}
@@ -0,0 +1,45 @@
package org.tests.cache;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import org.junit.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.Order;
import org.tests.model.basic.ResetBasicData;
import java.util.List;
import static io.ebean.CacheMode.ON;
public class TestBeanFetchJoinCache extends BaseTestCase {
@Test
public void test() {
ResetBasicData.reset();
// DB.find(Customer.class)
// .setBeanCacheMode(ON)
// .findList();
DB.find(Customer.class)
.where().idIn(1,2,3)
//.setBeanCacheMode(ON)
.findList();
List<Order> orders = DB.find(Order.class)
.fetchQuery("customer", "name")
.findList();
orders = DB.find(Order.class)
.fetchQuery("customer", "+cache, name")
.findList();
for (Order order : orders) {
order.getCustomer().getName();
}
}
}