Merge branch 'master' of github.com:ebean-orm/ebean

This commit is contained in:
rob bygrave
2017-10-09 21:13:32 +13:00
39 changed files with 406 additions and 56 deletions
@@ -135,7 +135,7 @@ public class EbeanServer_eqlTest extends BaseTestCase {
query.setParameter("name", "Ro");
query.findList();
assertThat(query.getGeneratedSql()).contains("where t0.name like ? ");
assertThat(query.getGeneratedSql()).contains("where t0.name like ");
}
@Test(expected = PersistenceException.class)
@@ -14,6 +14,8 @@ public class SqlRowBooleanTest extends BaseTestCase {
sqlQuery = Ebean.createSqlQuery("SELECT 1 AS ISNT_NULL");
} else if (isOracle()) {
sqlQuery = Ebean.createSqlQuery("SELECT 1 AS ISNT_NULL from dual");
} else if (isDb2()) {
sqlQuery = Ebean.createSqlQuery("SELECT 1 AS ISNT_NULL from SYSIBM.SYSDUMMY1");
} else {
sqlQuery = Ebean.createSqlQuery("SELECT 1 IS NOT NULL AS ISNT_NULL");
}
@@ -86,8 +86,8 @@ public class DefaultExampleExpressionTest extends BaseExpressionTest {
query1.findList();
assertThat(query1.getGeneratedSql()).contains("(t0.name like ? ");
assertThat(query1.getGeneratedSql()).contains(" and t1.city like ? ");
assertThat(query1.getGeneratedSql()).contains("(t0.name like ");
assertThat(query1.getGeneratedSql()).contains(" and t1.city like ");
}
@@ -123,7 +123,7 @@ public class EqlParserTest extends BaseTestCase {
query.setParameter("name", "Rob");
query.findList();
assertThat(query.getGeneratedSql()).contains("where t0.name like ?");
assertThat(query.getGeneratedSql()).contains("where t0.name like ");
}
@Test
@@ -78,7 +78,7 @@ public class TestBatchLazyWithCacheHits extends BaseTestCase {
// batch lazy loading into cache
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("from uuone t0 where t0.name like ?");
assertThat(sql.get(0)).contains("from uuone t0 where t0.name like ");
assertThat(sql.get(1)).contains("from uuone t0 where t0.id in (?,");
statistics = beanCache.getStatistics(true);
@@ -12,6 +12,7 @@ import org.ebeantest.LoggedSqlCollector;
import org.junit.Assert;
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -72,6 +73,32 @@ public class TestSecondaryQueries extends BaseTestCase {
assertThat(trimSql(sql.get(0), 1)).contains("select t0.id, t0.name from o_customer t0 where t0.id in");
}
@Test
public void fetchIterate() {
ResetBasicData.reset();
LoggedSqlCollector.start();
Iterator<Order> orders = Ebean.find(Order.class)
.select("status")
.setMaxRows(10)
.setUseCache(false)
.findIterate();
while (orders.hasNext()) {
orders.next(); // dummy read
}
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql).hasSize(1);
if (isSqlServer()) {
assertThat(trimSql(sql.get(0), 2)).contains("select top 10 t0.id, t0.status from o_order t0 order by t0.id");
} else {
assertThat(trimSql(sql.get(0), 2)).contains("select t0.id, t0.status from o_order t0");
}
}
@Test
public void testSecQueryOneToMany() {
@@ -0,0 +1,95 @@
package org.tests.docstore;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Arrays;
import org.junit.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.Product;
import org.tests.model.basic.ResetBasicData;
import org.tests.model.docstore.CustomerReport;
import org.tests.model.docstore.ProductReport;
import io.ebean.BaseTestCase;
import io.ebean.text.json.JsonReadOptions;
public class CustomerReportTest extends BaseTestCase {
@Test
public void testToJson() throws Exception {
ResetBasicData.reset();
String json = server().json().toJson(getCustomerReport());
assertThat(json).isEqualTo("{\"dtype\":\"CR\",\"friends\":[{\"id\":2},{\"id\":3}],\"customer\":{\"id\":1}}");
}
@Test
public void testFromJson() throws Exception {
ResetBasicData.reset();
String json = "{\"dtype\":\"CR\",\"friends\":[{\"id\":2},{\"id\":3}],\"customer\":{\"id\":1}}";
JsonReadOptions opts = new JsonReadOptions();
opts.setEnableLazyLoading(true);
CustomerReport report = server().json().toBean(CustomerReport.class, json, opts);
assertThat(report.getCustomer().getName()).isEqualTo("Rob");
assertThat(report.getFriends().get(0).getName()).isEqualTo("Cust NoAddress");
assertThat(report.getFriends().get(1).getName()).isEqualTo("Fiona");
}
@Test
public void testEmbeddedDocs() throws Exception {
ResetBasicData.reset();
CustomerReport report = getCustomerReport();
report.getEmbeddedReports().add(getProductReport());
String json = server().json().toJson(report);
assertThat(json).isEqualTo("{\"dtype\":\"CR\","
+ "\"embeddedReports\":[{\"dtype\":\"PR\",\"title\":\"This is a good product\",\"product\":{\"id\":1}}],"
+ "\"friends\":[{\"id\":2},{\"id\":3}],"
+ "\"customer\":{\"id\":1}}");
JsonReadOptions opts = new JsonReadOptions();
opts.setEnableLazyLoading(true);
report = server().json().toBean(CustomerReport.class, json, opts);
ProductReport ar = (ProductReport) report.getEmbeddedReports().get(0);
assertThat(ar.getTitle()).isEqualTo("This is a good product");
assertThat(ar.getProduct().getName()).isEqualTo("Chair");
}
private CustomerReport getCustomerReport() {
Customer customer = server().getReference(Customer.class, 1);
Customer friend1 = server().getReference(Customer.class, 2);
Customer friend2 = server().getReference(Customer.class, 3);
CustomerReport report = new CustomerReport();
report.setCustomer(customer);
report.setFriends(Arrays.asList(friend1, friend2));
return report;
}
private ProductReport getProductReport() {
Product product = server().getReference(Product.class, 1);
ProductReport report = new ProductReport();
report.setTitle("This is a good product");
report.setProduct(product);
return report;
}
}
@@ -0,0 +1,45 @@
package org.tests.model.docstore;
import java.util.List;
import javax.persistence.DiscriminatorValue;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.tests.model.basic.Customer;
import io.ebean.annotation.DocStore;
/**
* Entity that will stored as JSON in database
*
* @author Roland Praml, FOCONIS AG
*
*/
@DocStore
@DiscriminatorValue("CR")
public class CustomerReport extends Report {
@OneToMany
private List<Customer> friends;
@ManyToOne
private Customer customer;
public void setCustomer(Customer customer) {
this.customer = customer;
}
public Customer getCustomer() {
return customer;
}
public void setFriends(List<Customer> friends) {
this.friends = friends;
}
public List<Customer> getFriends() {
return friends;
}
}
@@ -0,0 +1,23 @@
package org.tests.model.docstore;
import javax.persistence.DiscriminatorValue;
import javax.persistence.ManyToOne;
import org.tests.model.basic.Product;
import io.ebean.annotation.DocStore;
@DocStore
@DiscriminatorValue("PR")
public class ProductReport extends Report {
@ManyToOne
private Product product;
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
@@ -0,0 +1,33 @@
package org.tests.model.docstore;
import java.util.List;
import javax.persistence.Inheritance;
import javax.persistence.OneToMany;
import io.ebean.annotation.DocStore;
@DocStore
@Inheritance
public class Report {
private String title;
@OneToMany
private List<Report> embeddedReports;
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public List<Report> getEmbeddedReports() {
return embeddedReports;
}
public void setEmbeddedReports(List<Report> embeddedReports) {
this.embeddedReports = embeddedReports;
}
}
@@ -11,7 +11,7 @@ public class OtoBChild {
@Id
@Column(name = "master_id")
Integer id;
Long id;
String child;
@@ -19,11 +19,11 @@ public class OtoBChild {
@PrimaryKeyJoinColumn(name = "master_id", referencedColumnName = "id")
OtoBMaster master;
public Integer getId() {
public Long getId() {
return id;
}
public void setId(Integer id) {
public void setId(Long id) {
this.id = id;
}
@@ -27,7 +27,7 @@ public class TestExprNestedDisjunction extends BaseTestCase {
q.findList();
String s = q.getGeneratedSql();
assertThat(s).contains("(t0.name like ? ");
assertThat(s).contains("(t0.name like ");
assertThat(s).contains(" and t0.anniversary = ? ) or (t0.status = ? and t0.id > ? )");
}
@@ -51,7 +51,7 @@ public class TestExprNestedDisjunction extends BaseTestCase {
q.findList();
String s = q.getGeneratedSql();
assertThat(s).contains("(t0.name like ? ");
assertThat(s).contains("(t0.name like ");
assertThat(s).contains(" and t0.anniversary = ? ) or (t0.status = ? and t0.id > ? )");
}
@@ -154,7 +154,7 @@ public class TestQueryFetchManyTwoDeep extends BaseTestCase {
Assert.assertTrue(generatedSql.contains("from contact t0 "));
Assert.assertTrue(generatedSql.contains("join o_customer t1 on t1.id = t0.customer_id"));
Assert.assertTrue(generatedSql.contains("where lower(t1.name) like ?"));
Assert.assertTrue(generatedSql.contains("where lower(t1.name) like "));
}
@@ -9,16 +9,17 @@ import org.tests.model.basic.Customer;
import org.tests.model.basic.Order;
import org.tests.model.basic.OrderShipment;
import org.tests.model.basic.ResetBasicData;
import org.avaje.datasource.DataSourcePool;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
import javax.persistence.PersistenceException;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicInteger;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.*;
public class TestQueryFindIterate extends BaseTestCase {
@@ -224,4 +225,39 @@ public class TestQueryFindIterate extends BaseTestCase {
}
});
}
@Test
public void testCloseConnection() throws Exception {
ResetBasicData.reset();
DataSourcePool dsPool = (DataSourcePool) server().getPluginApi().getDataSource();
int startConns = dsPool.getStatus(false).getBusy();
QueryIterator<Customer> queryIterator = server().find(Customer.class)
.where()
.isNotNull("name")
.setMaxRows(3)
.order().asc("id")
.findIterate();
assertThat(dsPool.getStatus(false).getBusy()).isEqualTo(startConns + 1);
assertTrue(queryIterator.hasNext());
assertThat(queryIterator.next()).isNotNull();
assertThat(dsPool.getStatus(false).getBusy()).isEqualTo(startConns + 1);
assertTrue(queryIterator.hasNext());
assertThat(queryIterator.next()).isNotNull();
assertThat(dsPool.getStatus(false).getBusy()).isEqualTo(startConns + 1);
assertTrue(queryIterator.hasNext());
assertThat(queryIterator.next()).isNotNull();
assertThat(dsPool.getStatus(false).getBusy()).isEqualTo(startConns + 1);
assertFalse(queryIterator.hasNext());
assertThat(dsPool.getStatus(false).getBusy()).isEqualTo(startConns);
try {
queryIterator.next();
fail("noSuchElementException expected");
} catch (NoSuchElementException e) {}
}
}
@@ -82,7 +82,7 @@ public class TestAggregationCount extends BaseTestCase {
String sql = sqlOf(query2, 5);
assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount) from tevent_one t0");
assertThat(sql).contains("from tevent_one t0 join tevent_many u1 on u1.event_id = t0.id ");
assertThat(sql).contains("where u1.description like ? ");
assertThat(sql).contains("where u1.description like ");
assertThat(sql).contains(" group by t0.id, t0.name having count(u1.id) >= ? order by t0.name");
// invoke lazy loading
@@ -26,7 +26,7 @@ public class TestQueryManyToOneWhereClauseJoin extends BaseTestCase {
query.findList();
//select t0.id c0, t0.status c1, t0.order_date c2, t0.ship_date c3, t1.name c4, t0.cretime c5, t0.updtime c6, t0.kcustomer_id c7
String expectedSql = "from o_order t0 join o_customer t1 on t1.id = t0.kcustomer_id where lower(t1.name) like ? ";
String expectedSql = "from o_order t0 join o_customer t1 on t1.id = t0.kcustomer_id where lower(t1.name) like ";
Assert.assertTrue(query.getGeneratedSql().contains(expectedSql));
// select t0.id c0, t0.status c1, t0.order_date c2, t0.ship_date c3, t1.name c4, t0.cretime c5, t0.updtime c6, t0.kcustomer_id c7
@@ -50,7 +50,7 @@ public class TestQueryManyToOneWhereClauseJoin extends BaseTestCase {
query.findList();
//select t0.id c0, t0.status c1, t0.order_date c2, t0.ship_date c3, t1.name c4, t0.cretime c5, t0.updtime c6, t0.kcustomer_id c7
String expectedSql = "from o_order t0 join o_customer t1 on t1.id = t0.kcustomer_id where (lower(t1.name) like ? ";
String expectedSql = "from o_order t0 join o_customer t1 on t1.id = t0.kcustomer_id where (lower(t1.name) like ";
Assert.assertTrue(query.getGeneratedSql().contains(expectedSql));
// select t0.id c0, t0.status c1, t0.order_date c2, t0.ship_date c3, t1.name c4, t0.cretime c5, t0.updtime c6, t0.kcustomer_id c7
@@ -80,7 +80,7 @@ public class TestQueryManyToOneWhereClauseJoin extends BaseTestCase {
String generatedSql = query.getGeneratedSql();
Assert.assertTrue(generatedSql.contains("from o_order t0 join o_customer t1 on t1.id = t0.kcustomer_id"));
Assert.assertTrue(generatedSql.contains("left join contact t2 on t2.customer_id = t1.id"));
Assert.assertTrue(generatedSql.contains("where lower(t1.name) like ?"));
Assert.assertTrue(generatedSql.contains("where lower(t1.name) like "));
// select t0.id c0, t0.status c1, t0.order_date c2, t0.ship_date c3, t1.name c4, t0.cretime c5, t0.updtime c6,
// t1.id c7, t1.status c8, t1.name c9, t1.smallnote c10, t1.anniversary c11, t1.cretime c12, t1.updtime c13, t1.billing_address_id c14, t1.shipping_address_id c15,
@@ -46,7 +46,7 @@ public class TestOrderByWithDistinctTake2 extends BaseTestCase {
}
assertThat(generatedSql).contains("order by t0.name desc");
assertThat(generatedSql).contains("from o_customer t0 join contact u1 on u1.customer_id = t0.id");
assertThat(generatedSql).contains("where lower(u1.first_name) like ?");
assertThat(generatedSql).contains("where lower(u1.first_name) like ");
}
@Test
@@ -68,7 +68,7 @@ public class TestOrderByWithDistinctTake2 extends BaseTestCase {
}
assertThat(generatedSql).contains("order by t0.name, t0.id desc");
assertThat(generatedSql).contains("from o_customer t0 join contact u1 on u1.customer_id = t0.id");
assertThat(generatedSql).contains("where lower(u1.first_name) like ?");
assertThat(generatedSql).contains("where lower(u1.first_name) like ");
}
}
@@ -22,11 +22,19 @@ public class TestLikeEscaping extends BaseTestCase {
Ebean.save(ResetBasicData.createCustomer("Paul %% Doublepercentage", "|Pipeway", "[other]", 1, null));
Ebean.save(ResetBasicData.createCustomer("_Udo Underscore", "|Pipeway", "[other]", 1, null));
Ebean.save(ResetBasicData.createCustomer("Bodo \\ backslash", "\\BS", "[other]", 1, null));
assertThat(Ebean.find(Customer.class)
.where().contains("name", "Paul %%").findCount()
).isEqualTo(1);
assertThat(Ebean.find(Customer.class)
.where().contains("name", "o \\ b").findCount()
).isEqualTo(1);
assertThat(Ebean.find(Customer.class)
.where().contains("name", "o \\\\ b").findCount()
).isEqualTo(0);
assertThat(Ebean.find(Customer.class)
.where().startsWith("name", "_").findCount()
@@ -48,10 +56,13 @@ public class TestLikeEscaping extends BaseTestCase {
.where().startsWith("shippingAddress.line1", "|P").findCount()
).isEqualTo(2);
assertThat(Ebean.find(Customer.class)
.where().startsWith("shippingAddress.line1", "\\B").findCount()
).isEqualTo(1);
assertThat(Ebean.find(Customer.class)
.where().endsWith("billingAddress.line1", "]").findCount()
).isEqualTo(4);
).isEqualTo(5);
assertThat(Ebean.find(Customer.class)
.where().endsWith("billingAddress.line1", "[none]").findCount()
@@ -112,7 +112,7 @@ public class TestQuerySingleAttribute extends BaseTestCase {
List<String> names = query.findSingleAttributeList();
assertThat(sqlOf(query)).contains("select distinct t0.name from o_customer t0 left join o_address t1 on t1.id = t0.billing_address_id where t0.status = ? and lower(t1.city) like ?");
assertThat(sqlOf(query)).contains("select distinct t0.name from o_customer t0 left join o_address t1 on t1.id = t0.billing_address_id where t0.status = ? and lower(t1.city) like ");
assertThat(names).isNotNull();
}
@@ -13,7 +13,6 @@ import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TestUpdateAllLoadedProperties extends BaseTestCase {