Add SAP HANA support (#1511)

This commit is contained in:
Jonathan Bregler
2018-10-24 21:38:17 +13:00
committed by Rob Bygrave
parent b1410cc660
commit 158ee9a081
79 changed files with 2596 additions and 215 deletions
+24
View File
@@ -1,5 +1,6 @@
package io.ebean;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaTimedMetric;
@@ -10,6 +11,9 @@ import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.core.HelpCreateQueryRequest;
import io.ebeaninternal.server.core.OrmQueryRequest;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.expression.platform.DbExpressionHandler;
import io.ebeaninternal.server.expression.platform.DbExpressionHandlerFactory;
import org.avaje.agentloader.AgentLoader;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
@@ -144,6 +148,10 @@ public abstract class BaseTestCase {
public boolean isMySql() {
return Platform.MYSQL == platform();
}
public boolean isHana() {
return Platform.HANA == platform();
}
public boolean isPlatformBooleanNative() {
return Types.BOOLEAN == spiEbeanServer().getDatabasePlatform().getBooleanDbType();
@@ -152,6 +160,10 @@ public abstract class BaseTestCase {
public boolean isPlatformOrderNullsSupport() {
return isH2() || isPostgres();
}
public boolean isPersistBatchOnCascade() {
return spiEbeanServer().getDatabasePlatform().getPersistBatchOnCascade() != PersistBatch.NONE;
}
/**
* Wait for the L2 cache to propagate changes post-commit.
@@ -205,6 +217,18 @@ public abstract class BaseTestCase {
assertThat(sql).contains(containsIn+" not in ");
}
}
/**
* Platform specific CONCAT clause.
*/
protected String concat(String property0, String separator, String property1) {
return concat(property0, separator, property1, null);
}
protected String concat(String property0, String separator, String property1, String suffix) {
DbExpressionHandler dbExpressionHandler = DbExpressionHandlerFactory.from(spiEbeanServer().getDatabasePlatform());
return dbExpressionHandler.concat(property0, separator, property1, suffix);
}
protected <T> OrmQueryRequest<T> createQueryRequest(SpiQuery.Type type, Query<T> query, Transaction t) {
return HelpCreateQueryRequest.create(server(), type, query, t);
+42 -71
View File
@@ -3,6 +3,7 @@ package io.ebean;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaQueryMetric;
import io.ebean.meta.MetaTimedMetric;
import org.ebeantest.LoggedSqlCollector;
import org.junit.AfterClass;
import org.junit.BeforeClass;
@@ -43,17 +44,13 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
resetAllMetrics();
String[] prefix = {"Bl", "B", "Red", "jim"};
String[] prefix = { "Bl", "B", "Red", "jim" };
for (String val : prefix) {
List<ContactDto> list = Ebean.find(Contact.class)
.select("email, concat(lastName,', ',firstName) as fullName")
.where().istartsWith("concat(lastName,', ',firstName)", val)
.orderBy().asc("lastName")
.setMaxRows(10)
.asDto(ContactDto.class)
.setLabel("prefixLoop")
.findList();
.select("email, " + concat("lastName", ", ", "firstName") + " as fullName").where()
.istartsWith(concat("lastName", ", ", "firstName"), val).orderBy().asc("lastName").setMaxRows(10)
.asDto(ContactDto.class).setLabel("prefixLoop").findList();
System.out.println("List:" + list);
}
@@ -77,14 +74,10 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
LoggedSqlCollector.start();
DtoQuery<ContactDto> query =
Ebean.find(Contact.class)
DtoQuery<ContactDto> query = Ebean.find(Contact.class)
// we must explicitly add the id property for DTO query (if we want it)
.select("id, email, concat(lastName,', ',firstName) as fullName")
.where().isNotNull("email").isNotNull("lastName")
.orderBy().asc("lastName")
.asDto(ContactDto.class)
.setLabel("explicitId")
.select("id, email, " + concat("lastName", ", ", "firstName") + " as fullName").where().isNotNull("email")
.isNotNull("lastName").orderBy().asc("lastName").asDto(ContactDto.class).setLabel("explicitId")
.setRelaxedMode();
List<ContactDto> dtos = query.findList();
@@ -98,7 +91,8 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
}
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql.get(0)).contains("select t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
assertThat(sql.get(0)).contains("select t0.id, t0.email, " + concat("t0.last_name", ", ", "t0.first_name")
+ " fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
}
@Test
@@ -108,12 +102,9 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
LoggedSqlCollector.start();
DtoQuery<ContactDto> query =
Ebean.find(Contact.class)
.select("email, concat(lastName,', ',firstName) as fullName")
.where().isNotNull("email").isNotNull("lastName")
.orderBy().asc("lastName")
.asDto(ContactDto.class);
DtoQuery<ContactDto> query = Ebean.find(Contact.class)
.select("email, " + concat("lastName", ", ", "firstName") + " as fullName").where().isNotNull("email")
.isNotNull("lastName").orderBy().asc("lastName").asDto(ContactDto.class);
List<ContactDto> dtos = query.findList();
@@ -126,10 +117,10 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
}
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql.get(0)).contains("select t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
assertThat(sql.get(0)).contains("select t0.email, " + concat("t0.last_name", ", ", "t0.first_name")
+ " fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
}
@Test
public void example() {
@@ -137,15 +128,9 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
LoggedSqlCollector.start();
List<ContactDto> contactDtos
= Ebean.find(Contact.class)
.setLabel("emailFullName")
.select("email, concat(lastName,', ',firstName) as fullName")
.where().isNotNull("email").isNotNull("lastName")
.orderBy().asc("lastName")
.setMaxRows(10)
.asDto(ContactDto.class)
.findList();
List<ContactDto> contactDtos = Ebean.find(Contact.class).setLabel("emailFullName")
.select("email, " + concat("lastName", ", ", "firstName") + " as fullName").where().isNotNull("email")
.isNotNull("lastName").orderBy().asc("lastName").setMaxRows(10).asDto(ContactDto.class).findList();
assertThat(contactDtos).isNotEmpty();
@@ -158,10 +143,12 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
List<String> sql = LoggedSqlCollector.stop();
if (isSqlServer()) {
assertThat(sql.get(0)).contains("select top 10 t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
assertThat(sql.get(0)).contains("select top 10 t0.email, " + concat("t0.last_name", ", ", "t0.first_name")
+ " fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
} else {
assertThat(sql.get(0)).contains("select t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
assertThat(sql.get(0)).contains("select t0.email, " + concat("t0.last_name", ", ", "t0.first_name")
+ " fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
}
}
@@ -172,14 +159,9 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
LoggedSqlCollector.start();
List<ContactDto> contactDtos
= Ebean.find(Contact.class)
.select("id, email, concat(lastName,', ',firstName) as fullName")
.where().isNotNull("email").isNotNull("lastName")
.orderBy().asc("lastName")
.setMaxRows(10)
.asDto(ContactDto.class)
.findList();
List<ContactDto> contactDtos = Ebean.find(Contact.class)
.select("id, email, " + concat("lastName", ", ", "firstName") + " as fullName").where().isNotNull("email")
.isNotNull("lastName").orderBy().asc("lastName").setMaxRows(10).asDto(ContactDto.class).findList();
assertThat(contactDtos).isNotEmpty();
@@ -192,9 +174,12 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
List<String> sql = LoggedSqlCollector.stop();
if (isSqlServer()) {
assertThat(sql.get(0)).contains("select top 10 t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
assertThat(sql.get(0)).contains("select top 10 t0.id, t0.email, "
+ concat("t0.last_name", ", ", "t0.first_name")
+ " fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
} else {
assertThat(sql.get(0)).contains("select t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
assertThat(sql.get(0)).contains("select t0.id, t0.email, " + concat("t0.last_name", ", ", "t0.first_name")
+ " fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name");
}
}
@@ -205,15 +190,9 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
LoggedSqlCollector.start();
List<ContactDto> contactDtos
= Ebean.find(Contact.class)
.select("concat(lastName,', ',firstName) as fullName")
.where().isNotNull("lastName")
.orderBy().asc("lastName")
.asDto(ContactDto.class)
.setFirstRow(2)
.setMaxRows(5)
.findList();
List<ContactDto> contactDtos = Ebean.find(Contact.class)
.select(concat("lastName", ", ", "firstName") + " as fullName").where().isNotNull("lastName").orderBy()
.asc("lastName").asDto(ContactDto.class).setFirstRow(2).setMaxRows(5).findList();
assertThat(contactDtos).isNotEmpty();
@@ -225,10 +204,10 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
}
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql.get(0)).contains("select concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where");
assertThat(sql.get(0))
.contains("select " + concat("t0.last_name", ", ", "t0.first_name") + " fullName from contact t0 where");
}
@Test
public void example_aggregate() {
@@ -236,14 +215,9 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
LoggedSqlCollector.start();
List<ContactTotals> contactDtos
= Ebean.find(Contact.class)
.select("lastName, count(*) as totalCount")
.where().isNotNull("lastName")
.having().gt("count(*)", 1)
.orderBy().desc("count(*)")
.asDto(ContactTotals.class)
.findList();
List<ContactTotals> contactDtos = Ebean.find(Contact.class).select("lastName, count(*) as totalCount").where()
.isNotNull("lastName").having().gt("count(*)", 1).orderBy().desc("count(*)").asDto(ContactTotals.class)
.findList();
assertThat(contactDtos).isNotEmpty();
@@ -253,7 +227,8 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
}
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql.get(0)).contains("select t0.last_name, count(*) totalCount from contact t0 where t0.last_name is not null group by t0.last_name having count(*) > ?");
assertThat(sql.get(0)).contains(
"select t0.last_name, count(*) totalCount from contact t0 where t0.last_name is not null group by t0.last_name having count(*) > ?");
}
@Test
@@ -261,12 +236,8 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
ResetBasicData.reset();
List<ContactTotals> contactDtos
= Ebean.find(Contact.class)
.select("lastName, count(*) as totalCount")
.where().isNotNull("lastName")
.asDto(ContactTotals.class)
.findList();
List<ContactTotals> contactDtos = Ebean.find(Contact.class).select("lastName, count(*) as totalCount").where()
.isNotNull("lastName").asDto(ContactTotals.class).findList();
assertThat(contactDtos).isNotEmpty();
}
@@ -16,6 +16,8 @@ public class SqlRowBooleanTest extends BaseTestCase {
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 if (isHana()) {
sqlQuery = Ebean.createSqlQuery("SELECT 1 AS ISNT_NULL from sys.dummy");
} else {
sqlQuery = Ebean.createSqlQuery("SELECT 1 IS NOT NULL AS ISNT_NULL");
}
@@ -0,0 +1,48 @@
package io.ebean.config.dbplatform;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import org.junit.Test;
import io.ebean.config.dbplatform.hana.HanaHistorySupport;
public class HanaHistorySupportTest {
private HanaHistorySupport support = new HanaHistorySupport();
@Test
public void getAsOfPredicate() {
String asOfPredicate = support.getAsOfPredicate("t0", "sys_period");
assertNull(asOfPredicate);
}
@Test
public void getAsOfViewSuffix() {
String asOfViewSuffix = support.getAsOfViewSuffix("_with_history");
assertEquals(asOfViewSuffix, " for system_time as of ?");
}
@Test
public void getVersionsBetweenSuffix() {
String asOfViewSuffix = support.getVersionsBetweenSuffix("_with_history");
assertEquals(asOfViewSuffix, " for system_time between ? and ?");
}
@Test
public void getLower() throws Exception {
String lower = support.getSysPeriodLower("t0", "sys_period");
assertEquals(lower, "t0.sys_period_start");
}
@Test
public void getUpper() throws Exception {
String upper = support.getSysPeriodUpper("t0", "sys_period");
assertEquals(upper, "t0.sys_period_end");
}
}
@@ -0,0 +1,67 @@
package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HanaPlatformTest {
HanaPlatform platform = new HanaPlatform();
@Test
public void testTypeConversion() {
PlatformDdl ddl = PlatformDdlBuilder.create(platform);
assertThat(ddl.convert("clob", false)).isEqualTo("nclob");
assertThat(ddl.convert("blob", false)).isEqualTo("blob");
assertThat(ddl.convert("json", false)).isEqualTo("nclob");
assertThat(ddl.convert("jsonb", false)).isEqualTo("nclob");
assertThat(ddl.convert("jsonvarchar", false)).isEqualTo("nvarchar(255)");
assertThat(ddl.convert("double", false)).isEqualTo("double");
assertThat(ddl.convert("varchar(20)", false)).isEqualTo("nvarchar(20)");
assertThat(ddl.convert("decimal(10)", false)).isEqualTo("decimal(10)");
assertThat(ddl.convert("decimal(8,4)", false)).isEqualTo("decimal(8,4)");
assertThat(ddl.convert("boolean", false)).isEqualTo("boolean");
assertThat(ddl.convert("bit", false)).isEqualTo("smallint");
assertThat(ddl.convert("tinyint", false)).isEqualTo("smallint");
assertThat(ddl.convert("binary", false)).isEqualTo("varbinary(255)");
assertThat(ddl.convert("binary(16)", false)).isEqualTo("varbinary(16)");
assertThat(ddl.convert("point", false)).isEqualTo("st_point");
assertThat(ddl.convert("multilinestring", false)).isEqualTo("st_geometry");
assertThat(ddl.convert("multipolygon", false)).isEqualTo("st_geometry");
assertThat(ddl.convert("multipoint", false)).isEqualTo("st_geometry");
assertThat(ddl.convert("linestring", false)).isEqualTo("st_geometry");
assertThat(ddl.convert("polygon", false)).isEqualTo("st_geometry");
}
@Test
public void uuid_default() {
HanaPlatform platform = new HanaPlatform();
platform.configure(new PlatformConfig());
DbPlatformType dbType = platform.getDbTypeMap().get(DbPlatformType.UUID);
assertThat(dbType.renderType(0, 0)).isEqualTo("varchar(40)");
}
@Test
public void uuid_as_binary() {
HanaPlatform platform = new HanaPlatform();
PlatformConfig config = new PlatformConfig();
config.setDbUuid(PlatformConfig.DbUuid.AUTO_BINARY);
platform.configure(config);
DbPlatformType dbType = platform.getDbTypeMap().get(DbPlatformType.UUID);
assertThat(dbType.renderType(0, 0)).isEqualTo("varbinary(16)");
}
}
@@ -53,12 +53,14 @@ public class DbMigrationGenerateTest {
migration.addPlatform(Platform.ORACLE, "oracle");
migration.addPlatform(Platform.SQLITE, "sqlite");
migration.addPlatform(Platform.SQLSERVER17, "sqlserver17");
migration.addPlatform(Platform.HANA, "hana");
ServerConfig config = new ServerConfig();
config.setName("migrationtest");
config.loadFromProperties();
config.setRegister(false);
config.setDefaultServer(false);
config.getProperties().put("ebean.hana.generateUniqueDdl", "true"); // need to generate unique statements to prevent them from being filtered out as duplicates by the DdlRunner
config.setPackages(Arrays.asList("misc.migration.v1_0"));
@@ -7,7 +7,6 @@ import io.ebean.SqlUpdate;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import io.ebean.migration.MigrationConfig;
import io.ebean.migration.ddl.DdlRunner;
import io.ebeaninternal.dbmigration.ddlgeneration.Helper;
@@ -90,7 +89,7 @@ public class DbMigrationTest extends BaseTestCase {
runScript(false, "1.0__initial.sql");
if (isOracle()) {
if (isOracle() || isHana()) {
SqlUpdate update = server().createSqlUpdate("insert into migtest_e_basic (id, old_boolean, user_id) values (1, :false, 1)");
update.setParameter("false", false);
assertThat(server().execute(update)).isEqualTo(1);
@@ -199,6 +198,7 @@ public class DbMigrationTest extends BaseTestCase {
for (String table : tables) {
// simple and stupid try to execute all commands on all dialects.
sb.append("alter table ").append(table).append(" set ( system_versioning = OFF );\n");
sb.append("alter table ").append(table).append(" drop system versioning;\n");
sb.append("drop table ").append(table).append(";\n");
sb.append("drop table ").append(table).append(" cascade;\n");
sb.append("drop table ").append(table).append("_history;\n");
@@ -5,6 +5,7 @@ import io.ebean.Ebean;
import io.ebean.config.ServerConfig;
import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform;
import io.ebeaninternal.api.SpiEbeanServer;
@@ -16,7 +17,6 @@ import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class BaseDdlHandlerTest extends BaseTestCase {
private ServerConfig serverConfig = new ServerConfig();
@@ -37,6 +37,10 @@ public class BaseDdlHandlerTest extends BaseTestCase {
return handler(new SqlServer17Platform());
}
private DdlHandler hanaHandler() {
return handler(new HanaPlatform());
}
@Test
public void addColumn_nullable_noConstraint() throws Exception {
@@ -47,6 +51,10 @@ public class BaseDdlHandlerTest extends BaseTestCase {
write = new DdlWrite();
sqlserverHandler().generate(write, Helper.getAddColumn());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add added_to_foo nvarchar(20);\n\n");
write = new DdlWrite();
hanaHandler().generate(write, Helper.getAddColumn());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add ( added_to_foo nvarchar(20));\n\n");
}
@Test
@@ -56,10 +64,16 @@ public class BaseDdlHandlerTest extends BaseTestCase {
h2Handler().generate(write, Helper.getAlterTableAddColumnWithCheckConstraint());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add column status integer;\n"
+ "alter table foo add constraint ck_ordering_status check ( status in (0,1));\n\n");
write = new DdlWrite();
hanaHandler().generate(write, Helper.getAlterTableAddColumnWithCheckConstraint());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add ( status integer);\n"
+ "alter table foo add constraint ck_ordering_status check ( status in (0,1));\n\n");
}
/**
* Test the functionality of the Ebean {@literal @}DbArray extension during DDL generation.
* Test the functionality of the Ebean {@literal @}DbArray extension during DDL
* generation.
*/
@Test
public void addColumn_dbarray() throws Exception {
@@ -76,6 +90,12 @@ public class BaseDdlHandlerTest extends BaseTestCase {
DdlHandler sqlserverHandler = sqlserverHandler();
sqlserverHandler.generate(write, Helper.getAlterTableAddDbArrayColumn());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add dbarray_added_to_foo varchar(1000);\n\n");
write = new DdlWrite();
DdlHandler hanaHandler = hanaHandler();
hanaHandler.generate(write, Helper.getAlterTableAddDbArrayColumn());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add ( dbarray_added_to_foo nvarchar(255) array);\n\n");
}
@Test
@@ -93,6 +113,10 @@ public class BaseDdlHandlerTest extends BaseTestCase {
write = new DdlWrite();
sqlserverHandler().generate(write, Helper.getAlterTableAddDbArrayColumnWithLength());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add dbarray_ninety varchar(90);\n\n");
write = new DdlWrite();
hanaHandler().generate(write, Helper.getAlterTableAddDbArrayColumnWithLength());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add ( dbarray_ninety nvarchar(255) array(90));\n\n");
}
@Test
@@ -113,6 +137,14 @@ public class BaseDdlHandlerTest extends BaseTestCase {
write = new DdlWrite();
sqlserverHandler().generate(write, Helper.getAlterTableAddDbArrayColumnInteger());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add dbarray_integer varchar(1000);\n\n");
write = new DdlWrite();
hanaHandler().generate(write, Helper.getAlterTableAddDbArrayColumnIntegerWithLength());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add ( dbarray_integer integer array(90));\n\n");
write = new DdlWrite();
hanaHandler().generate(write, Helper.getAlterTableAddDbArrayColumnInteger());
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add ( dbarray_integer integer array);\n\n");
}
@Test
@@ -127,7 +159,8 @@ public class BaseDdlHandlerTest extends BaseTestCase {
assertThat(buffer).contains("alter table foo add column some_id integer;");
String fkBuffer = write.applyForeignKeys().getBuffer();
assertThat(fkBuffer).contains("alter table foo add constraint fk_foo_some_id foreign key (some_id) references bar (id) on delete restrict on update restrict;");
assertThat(fkBuffer).contains(
"alter table foo add constraint fk_foo_some_id foreign key (some_id) references bar (id) on delete restrict on update restrict;");
assertThat(fkBuffer).contains("create index idx_foo_some_id on foo (some_id);");
assertThat(write.dropAll().getBuffer()).isEqualTo("");
}
@@ -142,8 +175,15 @@ public class BaseDdlHandlerTest extends BaseTestCase {
assertThat(write.apply().getBuffer()).isEqualTo("alter table foo drop column col2;\n\n");
assertThat(write.dropAll().getBuffer()).isEqualTo("");
}
write = new DdlWrite();
DdlHandler hanaHandler = hanaHandler();
hanaHandler.generate(write, Helper.getDropColumn());
assertThat(write.apply().getBuffer()).isEqualTo("CALL usp_ebean_drop_column('foo', 'col2');\n\n");
assertThat(write.dropAll().getBuffer()).isEqualTo("");
}
@Test
public void createTable() throws Exception {
@@ -157,6 +197,16 @@ public class BaseDdlHandlerTest extends BaseTestCase {
assertThat(write.apply().getBuffer()).isEqualTo(createTableDDL);
assertThat(write.dropAll().getBuffer().trim()).isEqualTo("drop table if exists foo;");
write = new DdlWrite();
DdlHandler hanaHandler = hanaHandler();
hanaHandler.generate(write, Helper.getCreateTable());
String createColumnTableDDL = Helper.asText(this, "/assert/create-column-table.txt");
assertThat(write.apply().getBuffer()).isEqualTo(createColumnTableDDL);
assertThat(write.dropAll().getBuffer().trim()).isEqualTo("drop table foo cascade;");
}
@Test
@@ -174,7 +224,6 @@ public class BaseDdlHandlerTest extends BaseTestCase {
assertThat(write.dropAll().getBuffer()).isEqualTo(rollbackLast);
}
@Ignore
@Test
public void generateChangeSetFromModel() throws Exception {
@@ -0,0 +1,42 @@
package io.ebeaninternal.dbmigration.ddlgeneration.platform;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.junit.Test;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite;
import io.ebeaninternal.dbmigration.migration.Column;
public class HanaDdlTest {
@Test
public void alterTableDropColumn() throws IOException {
HanaColumnStoreDdl ddl = new HanaColumnStoreDdl(new HanaPlatform());
DdlWrite write = new DdlWrite();
ddl.alterTableDropColumn(write.apply(), "my_table", "my_column");
assertEquals("CALL usp_ebean_drop_column('my_table', 'my_column');\n", write.apply().getBuffer());
}
@Test
public void alterTableAddColumn() throws IOException {
HanaColumnStoreDdl ddl = new HanaColumnStoreDdl(new HanaPlatform());
DdlWrite write = new DdlWrite();
Column column = new Column();
column.setName("my_column");
column.setComment("comment");
column.setDefaultValue("1");
column.setNotnull(Boolean.TRUE);
column.setType("int");
column.setUnique("unique");
column.setPrimaryKey(Boolean.TRUE);
column.setCheckConstraint("CHECK(my_column > 0)");
column.setCheckConstraintName("check_constraint");
column.setHistoryExclude(Boolean.TRUE);
column.setIdentity(Boolean.TRUE);
ddl.alterTableAddColumn(write.apply(), "my_table", column, false, "1");
assertEquals("alter table my_table add ( my_column int default 1 not null);\nalter table my_table add constraint check_constraint CHECK(my_column > 0);\n", write.apply().getBuffer());
}
}
@@ -4,6 +4,7 @@ import io.ebean.Ebean;
import io.ebean.config.ServerConfig;
import io.ebean.config.dbplatform.IdType;
import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
@@ -16,6 +17,8 @@ import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public class PlatformDdl_AlterColumnTest {
@@ -24,6 +27,7 @@ public class PlatformDdl_AlterColumnTest {
private PlatformDdl mysqlDdl = PlatformDdlBuilder.create(new MySqlPlatform());
private PlatformDdl oraDdl = PlatformDdlBuilder.create(new OraclePlatform());
private PlatformDdl sqlServerDdl = PlatformDdlBuilder.create(new SqlServer17Platform());
private PlatformDdl hanaDdl = PlatformDdlBuilder.create(new HanaPlatform());
{
ServerConfig serverConfig = Ebean.getDefaultServer().getPluginApi().getServerConfig();
@@ -63,6 +67,14 @@ public class PlatformDdl_AlterColumnTest {
assertThat(pgDdl.convertArrayType("varchar[]")).isEqualTo("varchar[]");
assertThat(pgDdl.convertArrayType("integer[]")).isEqualTo("integer[]");
}
@Test
public void convertArrayType_hana() {
assertThat(hanaDdl.convertArrayType("varchar[](90)")).isEqualTo("nvarchar(255) array(90)");
assertThat(hanaDdl.convertArrayType("integer[](60)")).isEqualTo("integer array(60)");
assertThat(hanaDdl.convertArrayType("varchar[]")).isEqualTo("nvarchar(255) array");
assertThat(hanaDdl.convertArrayType("integer[]")).isEqualTo("integer array");
}
@Test
public void testAlterColumnBaseAttributes() throws Exception {
@@ -77,20 +89,32 @@ public class PlatformDdl_AlterColumnTest {
sql = sqlServerDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab alter column acol nvarchar(5) not null", sql);
sql = hanaDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab alter ( acol nvarchar(5) not null)", sql);
alterColumn.setNotnull(Boolean.FALSE);
sql = mysqlDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab modify acol varchar(5)", sql);
sql = hanaDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab alter ( acol nvarchar(5))", sql);
alterColumn.setNotnull(null);
alterColumn.setType("varchar(100)");
sql = mysqlDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab modify acol varchar(100)", sql);
sql = hanaDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab alter ( acol nvarchar(100))", sql);
alterColumn.setCurrentNotnull(Boolean.TRUE);
sql = mysqlDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab modify acol varchar(100) not null", sql);
sql = hanaDdl.alterColumnBaseAttributes(alterColumn);
assertEquals("alter table mytab alter ( acol nvarchar(100) not null)", sql);
}
@Test
@@ -110,6 +134,9 @@ public class PlatformDdl_AlterColumnTest {
sql = sqlServerDdl.alterColumnType("mytab", "acol", "varchar(20)");
assertNull(sql);
sql = hanaDdl.alterColumnType("mytab", "acol", "varchar(20)");
assertNull(sql);
}
@Test
@@ -129,6 +156,9 @@ public class PlatformDdl_AlterColumnTest {
sql = sqlServerDdl.alterColumnNotnull("mytab", "acol", true);
assertNull(sql);
sql = hanaDdl.alterColumnNotnull("mytab", "acol", true);
assertNull(sql);
}
@Test
@@ -148,6 +178,9 @@ public class PlatformDdl_AlterColumnTest {
sql = sqlServerDdl.alterColumnNotnull("mytab", "acol", false);
assertNull(sql);
sql = hanaDdl.alterColumnNotnull("mytab", "acol", false);
assertNull(sql);
}
@Test
@@ -167,6 +200,15 @@ public class PlatformDdl_AlterColumnTest {
sql = sqlServerDdl.alterColumnDefaultValue("mytab", "acol", "'hi'");
assertEquals("alter table mytab add default 'hi' for acol", sql);
boolean exceptionCaught = false;
try {
hanaDdl.alterColumnDefaultValue("mytab", "acol", "'hi'");
}
catch (UnsupportedOperationException e) {
exceptionCaught = true;
}
assertTrue(exceptionCaught);
}
@Test
@@ -186,6 +228,15 @@ public class PlatformDdl_AlterColumnTest {
sql = sqlServerDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT");
assertEquals("EXEC usp_ebean_drop_default_constraint mytab, acol", sql);
boolean exceptionCaught = false;
try {
hanaDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT");
}
catch (UnsupportedOperationException e) {
exceptionCaught = true;
}
assertTrue(exceptionCaught);
}
@Test
@@ -226,4 +277,14 @@ public class PlatformDdl_AlterColumnTest {
assertEquals(oraDdl.useIdentityType(IdentityType.GENERATOR), IdType.GENERATOR);
assertEquals(oraDdl.useIdentityType(IdentityType.EXTERNAL), IdType.EXTERNAL);
}
@Test
public void useIdentityType_hana() {
assertEquals(hanaDdl.useIdentityType(null), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdentityType.SEQUENCE), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdentityType.IDENTITY), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdentityType.GENERATOR), IdType.GENERATOR);
assertEquals(hanaDdl.useIdentityType(IdentityType.EXTERNAL), IdType.EXTERNAL);
}
}
@@ -1,6 +1,8 @@
package io.ebeaninternal.dbmigration.ddlgeneration.platform;
import io.ebean.config.ServerConfig;
import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
@@ -12,12 +14,12 @@ import static org.junit.Assert.assertEquals;
public class PlatformDdl_dropUniqueConstraintTest {
private PlatformDdl h2Ddl = PlatformDdlBuilder.create(new H2Platform());
private PlatformDdl pgDdl = PlatformDdlBuilder.create(new PostgresPlatform());
private PlatformDdl mysqlDdl = PlatformDdlBuilder.create(new MySqlPlatform());
private PlatformDdl oraDdl = PlatformDdlBuilder.create(new OraclePlatform());
private PlatformDdl sqlServerDdl = PlatformDdlBuilder.create(new SqlServer17Platform());
private PlatformDdl hanaDdl = PlatformDdlBuilder.create(new HanaPlatform());
@Test
public void test() throws Exception {
@@ -30,11 +32,22 @@ public class PlatformDdl_dropUniqueConstraintTest {
assertEquals("alter table mytab drop constraint uq_name", sql);
sql = sqlServerDdl.alterTableDropUniqueConstraint("mytab", "uq_name");
assertEquals("IF (OBJECT_ID('uq_name', 'UQ') IS NOT NULL) alter table mytab drop constraint uq_name;\n"
+ "IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('mytab','U') AND name = 'uq_name') drop index uq_name ON mytab", sql);
+ "IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('mytab','U') AND name = 'uq_name') drop index uq_name ON mytab",
sql);
sql = mysqlDdl.alterTableDropUniqueConstraint("mytab", "uq_name");
assertEquals("alter table mytab drop index uq_name", sql);
ServerConfig serverConfig = new ServerConfig();
hanaDdl.configure(serverConfig);
sql = hanaDdl.alterTableDropUniqueConstraint("mytab", "uq_name");
assertEquals("delimiter $$\n" +
"do\n" +
"begin\n" +
"declare exit handler for sql_error_code 397 begin end;\n" +
"exec 'alter table mytab drop constraint uq_name';\n" +
"end;\n" +
"$$", sql);
}
}
@@ -0,0 +1,70 @@
package io.ebeaninternal.server.expression.platform;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import io.ebeaninternal.api.SpiExpressionRequest;
import io.ebeaninternal.server.expression.DefaultExpressionRequest;
import io.ebeaninternal.server.expression.Op;
public class HanaDbExpressionTest {
private HanaDbExpression expression = new HanaDbExpression();
@Test
public void testArrayContains() {
SpiExpressionRequest request = new DefaultExpressionRequest(null);
expression.arrayContains(request, "arrayproperty", true, "v1", "v2", "v3");
assertEquals("(? member of arrayproperty) and (? member of arrayproperty) and (? member of arrayproperty)",
request.getSql());
}
@Test
public void testArrayNotContains() {
SpiExpressionRequest request = new DefaultExpressionRequest(null);
expression.arrayContains(request, "arrayproperty", false, "v1", "v2", "v3");
assertEquals(
"(? not member of arrayproperty) and (? not member of arrayproperty) and (? not member of arrayproperty)",
request.getSql());
}
@Test
public void testArrayContainsEmpty() {
SpiExpressionRequest request = new DefaultExpressionRequest(null);
expression.arrayContains(request, "arrayproperty", true);
assertEquals("", request.getSql());
}
@Test
public void testArrayIsEmpty() {
SpiExpressionRequest request = new DefaultExpressionRequest(null);
expression.arrayIsEmpty(request, "arrayproperty", true);
assertEquals("cardinality(arrayproperty) = 0", request.getSql());
}
@Test
public void testArrayIsNotEmpty() {
SpiExpressionRequest request = new DefaultExpressionRequest(null);
expression.arrayIsEmpty(request, "arrayproperty", false);
assertEquals("cardinality(arrayproperty) <> 0", request.getSql());
}
@Test
public void testConcat() {
String concat = expression.concat("property0", "separator", "property1", "suffix");
assertEquals("concat(property0, 'separator'||property1||'suffix')", concat);
}
@Test
public void testConcatNullSuffix() {
String concat = expression.concat("property0", "separator", "property1", null);
assertEquals("concat(property0, 'separator'||property1)", concat);
}
@Test
public void testJson() {
SpiExpressionRequest request = new DefaultExpressionRequest(null);
expression.json(request, "jsonproperty", "path", Op.EQ, "val");
assertEquals("json_value(jsonproperty, '$.path') = ? ", request.getSql());
}
}
@@ -3,6 +3,9 @@ package io.ebeaninternal.server.grammer;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
import io.ebean.annotation.ForPlatform;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import io.ebeaninternal.api.SpiQuery;
import org.junit.Test;
import org.tests.model.basic.Customer;
@@ -11,6 +14,8 @@ import org.tests.model.basic.ResetBasicData;
import java.util.Arrays;
import java.util.List;
import javax.xml.ws.RequestWrapper;
import static org.assertj.core.api.Assertions.assertThat;
public class EqlParserTest extends BaseTestCase {
@@ -127,6 +132,7 @@ public class EqlParserTest extends BaseTestCase {
}
@Test
@IgnorePlatform(Platform.HANA) // The HANA JDBC driver checks the field length on binding and rejects 'NEW'
public void where_or1() {
Query<Customer> query = parse("where name = 'Rob' or (status = 'NEW' and smallnote is null)");
@@ -134,8 +140,19 @@ public class EqlParserTest extends BaseTestCase {
assertThat(query.getGeneratedSql()).contains("where (t0.name = ? or (t0.status = ? and t0.smallnote is null ) )");
}
@Test
@ForPlatform(Platform.HANA)
public void where_or1_hana() {
Query<Customer> query = parse("where name = 'Rob' or (status = 'N' and smallnote is null)");
query.findList();
assertThat(query.getGeneratedSql()).contains("where (t0.name = ? or (t0.status = ? and t0.smallnote is null ) )");
}
@Test
@IgnorePlatform(Platform.HANA) // The HANA JDBC driver checks the field length on binding and rejects 'NEW'
public void where_or2() {
Query<Customer> query = parse("where (name = 'Rob' or status = 'NEW') and smallnote is null");
@@ -143,8 +160,19 @@ public class EqlParserTest extends BaseTestCase {
assertThat(query.getGeneratedSql()).contains("where ((t0.name = ? or t0.status = ? ) and t0.smallnote is null )");
}
@Test
@ForPlatform(Platform.HANA)
public void where_or2_hana() {
Query<Customer> query = parse("where (name = 'Rob' or status = 'N') and smallnote is null");
query.findList();
assertThat(query.getGeneratedSql()).contains("where ((t0.name = ? or t0.status = ? ) and t0.smallnote is null )");
}
@Test
@IgnorePlatform(Platform.HANA) // The HANA JDBC driver checks the field length on binding and rejects 'NEW'
public void test_simplifyExpressions() {
Query<Customer> query = parse("where not (name = 'Rob' and status = 'NEW')");
@@ -159,6 +187,23 @@ public class EqlParserTest extends BaseTestCase {
query.findList();
assertThat(query.getGeneratedSql()).contains("where not (t0.name = ? and t0.status = ? )");
}
@Test
@ForPlatform(Platform.HANA)
public void test_simplifyExpressions_hana() {
Query<Customer> query = parse("where not (name = 'Rob' and status = 'N')");
query.findList();
assertThat(query.getGeneratedSql()).contains("where not (t0.name = ? and t0.status = ? )");
query = parse("where not ((name = 'Rob' and status = 'N'))");
query.findList();
assertThat(query.getGeneratedSql()).contains("where not (t0.name = ? and t0.status = ? )");
query = parse("where not (((name = 'Rob') and (status = 'N')))");
query.findList();
assertThat(query.getGeneratedSql()).contains("where not (t0.name = ? and t0.status = ? )");
}
@Test
@@ -18,7 +18,12 @@ public class TestErrorBindLog extends BaseTestCase {
} catch (PersistenceException e) {
String msg = e.getMessage();
Assert.assertTrue(msg.contains("Bind values:"));
if (isHana()) {
Assert.assertTrue(msg.contains("Error with property[1] dt[12]data[JUNK]"));
}
else {
Assert.assertTrue(msg.contains("Bind values:"));
}
}
}
}
@@ -4,7 +4,9 @@ import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import io.ebean.annotation.Transactional;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaTimedMetric;
@@ -119,6 +121,7 @@ public class TestBatchInsertFlush extends BaseTestCase {
@Test
@Transactional(batch = PersistBatch.ALL)
@IgnorePlatform(Platform.HANA)
public void transactional_flushOnGetId() {
EbeanServer server = Ebean.getDefaultServer();
@@ -141,6 +144,7 @@ public class TestBatchInsertFlush extends BaseTestCase {
}
@Test
@IgnorePlatform(Platform.HANA)
public void testFlushOnGetId() {
EbeanServer server = Ebean.getDefaultServer();
@@ -3,7 +3,9 @@ package org.tests.batchinsert;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import io.ebean.annotation.Transactional;
import org.junit.Test;
import org.tests.model.basic.UTDetail;
@@ -46,6 +48,7 @@ public class TestBatchInsertSimple extends BaseTestCase {
}
@Test
@IgnorePlatform(Platform.HANA)
public void testTransactional() {
saveWithFullBatchMode();
@@ -131,7 +134,7 @@ public class TestBatchInsertSimple extends BaseTestCase {
Transaction transaction = Ebean.beginTransaction();
try {
transaction.setBatch(PersistBatch.NONE);
transaction.setBatchOnCascade(PersistBatch.ALL);
transaction.setBatchOnCascade(spiEbeanServer().getDatabasePlatform().getPersistBatchOnCascade());
transaction.setBatchSize(20);
// escalate based on batchOnCascade value
@@ -3,7 +3,9 @@ package org.tests.batchinsert;
import io.ebean.BaseTestCase;
import io.ebean.EbeanServer;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import io.ebeaninternal.api.SpiTransaction;
import io.ebeaninternal.server.persist.BatchControl;
import org.tests.model.basic.EBasicWithUniqueCon;
@@ -20,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class TestBatchOnCascadeExceptionHandling extends BaseTestCase {
@IgnorePlatform(Platform.HANA)
@Test
public void testBatchScenarioWithSavepoint() throws SQLException {
server().save(createEntityWithName("conflict", "before"));
@@ -84,7 +87,7 @@ public class TestBatchOnCascadeExceptionHandling extends BaseTestCase {
Transaction txn = server.beginTransaction();
try {
assertThat(txn.getBatch()).isSameAs(PersistBatch.NONE);
assertThat(txn.getBatchOnCascade()).isSameAs(PersistBatch.ALL);
assertThat(txn.getBatchOnCascade()).isSameAs(spiEbeanServer().getDatabasePlatform().getPersistBatchOnCascade());
failingOperation.run();
Assertions.fail("PersistenceException expected");
@@ -3,6 +3,8 @@ package org.tests.batchinsert;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import io.ebean.annotation.Transactional;
import org.tests.model.basic.Customer;
import org.junit.Test;
@@ -18,6 +20,7 @@ public class TestBatchSaveWithGetBeanId extends BaseTestCase {
*/
@Transactional(batchSize = 10)
@Test
@IgnorePlatform(Platform.HANA) // HANA doesn't support insert batching
public void test() {
EbeanServer server = Ebean.getDefaultServer();
@@ -6,10 +6,12 @@ import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Version;
import java.util.List;
@Entity
@Table(name="`type`") // needs to be quoted because it's a keyword on HANA
public class Type {
@Id
private TypeKey key;
@@ -59,12 +59,23 @@ public class TestMergeBasic extends BaseTestCase {
assertThat(sql.get(2)).contains("update uuone set name=?, description=?, version=? where id=? and version=?");
// persist children ...
assertThat(sql.get(3)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(4)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
if (isPersistBatchOnCascade()) {
assertThat(sql.get(3)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(4)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(5)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(6)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(7)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(5)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(6)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(7)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
}
else {
assertThat(sql.get(3)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(4)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(5)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(6)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(7)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
}
}
@Test
@@ -97,12 +108,23 @@ public class TestMergeBasic extends BaseTestCase {
assertThat(sql.get(2)).contains("update uuone set name=?, description=?, version=? where id=? and version=?");
// persist children ...
assertThat(sql.get(3)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(4)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
if (isPersistBatchOnCascade()) {
assertThat(sql.get(3)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(4)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(5)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(6)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(7)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
}
else {
assertThat(sql.get(3)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
assertThat(sql.get(5)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(6)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(7)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(4)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(5)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(6)).contains("update uutwo set name=?, notes=?, version=?, master_id=? where id=? and version=?");
assertThat(sql.get(7)).contains("insert into uutwo (id, name, notes, version, master_id) values (?,?,?,?,?);");
}
}
@@ -277,10 +277,18 @@ public class TestMergeCustomer extends BaseTestCase {
assertThat(sql.get(2)).contains("delete from mcontact where id=?");
assertThat(sql.get(5)).contains("update mcustomer set name=?, version=?, shipping_address_id=?, billing_address_id=? where id=? and version=?");
assertThat(sql.get(6)).contains("insert into mcontact");
assertThat(sql.get(7)).contains("insert into mcontact");
assertThat(sql.get(8)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
assertThat(sql.get(11)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
if (isPersistBatchOnCascade()) {
assertThat(sql.get(6)).contains("insert into mcontact");
assertThat(sql.get(7)).contains("insert into mcontact");
assertThat(sql.get(8)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
assertThat(sql.get(11)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
}
else {
assertThat(sql.get(6)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
assertThat(sql.get(7)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
assertThat(sql.get(10)).contains("insert into mcontact");
assertThat(sql.get(11)).contains("insert into mcontact");
}
}
@Test
@@ -305,7 +313,7 @@ public class TestMergeCustomer extends BaseTestCase {
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql.get(0)).contains("select t0.id, t3.id, t1.id, t2.id from mcustomer t0 left join maddress t3 on t3.id = t0.shipping_address_id left join maddress t1 on t1.id = t0.billing_address_id left join mcontact t2 on t2.customer_id = t0.id where t0.id = ?");
if (isH2()) {
if (isH2() || isHana()) {
// with nested OneToMany .. we need a second query to read the contact message ids
assertThat(sql.get(1)).contains("select t0.contact_id, t0.id from mcontact_message t0 where (t0.contact_id) in (?, ?, ?, ?, ?, ?, ?, ?, ?, ? )");
}
@@ -317,10 +325,18 @@ public class TestMergeCustomer extends BaseTestCase {
assertThat(sql.get(6)).contains("update maddress set street=?, city=?, version=? where id=? and version=?");
assertThat(sql.get(7)).contains("update mcustomer set name=?, notes=?, version=?, shipping_address_id=?, billing_address_id=? where id=? and version=?");
assertThat(sql.get(8)).contains("insert into mcontact");
assertThat(sql.get(9)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
assertThat(sql.get(13)).contains("update mcontact_message set title=?, subject=?, notes=?, version=?, contact_id=? where id=? and version=?");
if (isPersistBatchOnCascade()) {
assertThat(sql.get(8)).contains("insert into mcontact");
assertThat(sql.get(9)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
assertThat(sql.get(13)).contains("update mcontact_message set title=?, subject=?, notes=?, version=?, contact_id=? where id=? and version=?");
}
else {
assertThat(sql.get(8)).contains("update mcontact set email=?, first_name=?, last_name=?, version=?, customer_id=? where id=? and version=?");
assertThat(sql.get(9)).contains("update mcontact_message set title=?, subject=?, notes=?, version=?, contact_id=? where id=? and version=?");
assertThat(sql.get(sql.size()-1)).contains("insert into mcontact");
}
}
@@ -40,10 +40,20 @@ public class TestMergeM2M extends BaseTestCase {
Ebean.merge(machine, options);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("select");
assertThat(sql.get(1)).contains("insert into mmachine");
assertThat(sql.get(2)).contains("insert into mmachine_mgroup");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("select");
assertThat(sql.get(1)).contains("insert into mmachine");
assertThat(sql.get(2)).contains("insert into mmachine_mgroup");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("select");
assertThat(sql.get(1)).contains("insert into mmachine");
assertThat(sql.get(2)).contains("insert into mmachine_mgroup");
assertThat(sql.get(3)).contains("insert into mmachine_mgroup");
assertThat(sql.get(4)).contains("insert into mmachine_mgroup");
}
machine.setName("mac1-mod");
machine.getGroups().remove(group2);
@@ -3,6 +3,9 @@ package org.tests.model.array;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -22,6 +25,7 @@ public class TestDbArray_asSet extends BaseTestCase {
private EArraySetBean found;
@Test
@IgnorePlatform(Platform.HANA)
public void insert() {
bean.setName("some stuff");
@@ -122,6 +126,7 @@ public class TestDbArray_asSet extends BaseTestCase {
}
@Test
@IgnorePlatform(Platform.HANA)
public void insertNulls() {
EArraySetBean bean = new EArraySetBean();
@@ -135,6 +140,7 @@ public class TestDbArray_asSet extends BaseTestCase {
}
@Test
@IgnorePlatform(Platform.HANA)
public void insertAll_when_hasNulls() {
EArraySetBean bean = new EArraySetBean();
@@ -17,6 +17,8 @@ import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
import io.ebean.SqlRow;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
public class TestDbArray_basic extends BaseTestCase {
@@ -25,6 +27,7 @@ public class TestDbArray_basic extends BaseTestCase {
private EArrayBean found;
@Test
@IgnorePlatform(Platform.HANA)
public void insert() throws SQLException {
bean.setName("some stuff");
@@ -159,6 +162,7 @@ public class TestDbArray_basic extends BaseTestCase {
}
@Test
@IgnorePlatform(Platform.HANA)
public void insertNulls() {
EArrayBean bean = new EArrayBean();
@@ -172,6 +176,7 @@ public class TestDbArray_basic extends BaseTestCase {
}
@Test
@IgnorePlatform(Platform.HANA)
public void insertAll_when_hasNulls() {
EArrayBean bean = new EArrayBean();
@@ -280,6 +280,8 @@ public class TestCacheViaComplexNaturalKey3 extends BaseTestCase {
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and concat(t0.sku,'-',t0.code) in (?, ? ) order by t0.sku desc; --bind(def,Array[2]={2-1000,3-1000})");
} else if (isPostgres()) {
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and (t0.sku||'-'||t0.code)");
} else if (isHana()) {
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and concat(t0.sku, '-'||t0.code)");
} else {
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and concat(t0.sku,'-',t0.code)");
}
@@ -319,6 +321,8 @@ public class TestCacheViaComplexNaturalKey3 extends BaseTestCase {
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and concat(t0.sku,':',t0.code,'-foo') in (?, ? ) order by t0.sku desc; --bind(def,Array[2]={2:1000-foo,3:1000-foo})");
} else if (isPostgres()){
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and (t0.sku||':'||t0.code||'-foo')");
} else if (isHana()){
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and concat(t0.sku, ':'||t0.code||'-foo')");
} else {
assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and concat(t0.sku,':',t0.code,'-foo')");
}
@@ -3,7 +3,10 @@ package org.tests.model.basic.xtra;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -16,6 +19,7 @@ import static org.junit.Assert.assertTrue;
public class TestInsertBatchThenFlushThenUpdate extends BaseTestCase {
@Test
@IgnorePlatform(Platform.HANA)
public void test() {
LoggedSqlCollector.start();
@@ -3,7 +3,10 @@ package org.tests.model.basic.xtra;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -16,6 +19,7 @@ import static org.junit.Assert.assertEquals;
public class TestInsertBatchThenUpdate extends BaseTestCase {
@Test
@IgnorePlatform(Platform.HANA)
public void test() {
LoggedSqlCollector.start();
@@ -60,6 +64,7 @@ public class TestInsertBatchThenUpdate extends BaseTestCase {
@Test
@IgnorePlatform(Platform.HANA)
public void test_noFlushOn_getterOfNonGeneratedProperty() {
LoggedSqlCollector.start();
@@ -3,7 +3,10 @@ package org.tests.model.basic.xtra;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -15,6 +18,7 @@ import static org.junit.Assert.assertEquals;
public class TestInsertBatchWithDifferentRootTypes extends BaseTestCase {
@Test
@IgnorePlatform(Platform.HANA)
public void testDifferRootTypes() {
LoggedSqlCollector.start();
@@ -29,9 +29,17 @@ public class TestElementCollectionBasic extends BaseTestCase {
assertThat(eventLog()).containsExactly("preInsert", "postInsert");
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ec_person");
assertThat(sql.get(1)).contains("insert into ec_person_phone");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ec_person");
assertThat(sql.get(1)).contains("insert into ec_person_phone");
}
else {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("insert into ec_person");
assertThat(sql.get(1)).contains("insert into ec_person_phone");
assertThat(sql.get(2)).contains("insert into ec_person_phone");
}
EcPerson person1 = new EcPerson("Fiona09");
person1.getPhoneNumbers().add("09 1234");
@@ -121,10 +129,20 @@ public class TestElementCollectionBasic extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ec_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ec_person_phone where owner_id=?");
assertThat(sql.get(2)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ec_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ec_person_phone where owner_id=?");
assertThat(sql.get(2)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("update ec_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ec_person_phone where owner_id=?");
assertThat(sql.get(2)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
assertThat(sql.get(3)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
assertThat(sql.get(4)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
}
assertThat(eventLog()).containsExactly("preUpdate", "postUpdate");
@@ -189,9 +207,21 @@ public class TestElementCollectionBasic extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ec_person_phone where owner_id=?");
assertThat(sql.get(1)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ec_person_phone where owner_id=?");
assertThat(sql.get(1)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
}
else {
assertThat(sql).hasSize(7);
assertThat(sql.get(0)).contains("delete from ec_person_phone where owner_id=?");
assertThat(sql.get(1)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
assertThat(sql.get(2)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
assertThat(sql.get(3)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
assertThat(sql.get(4)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
assertThat(sql.get(5)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
assertThat(sql.get(6)).contains("insert into ec_person_phone (owner_id,phone) values (?,?)");
}
assertThat(eventLog()).containsExactly("preUpdate", "postUpdate");
@@ -1,6 +1,9 @@
package org.tests.model.elementcollection;
import io.ebean.Ebean;
import io.ebean.annotation.PersistBatch;
import io.ebeaninternal.api.SpiEbeanServer;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -39,7 +42,12 @@ public class TestElementCollectionBasicCache {
Ebean.save(two);
sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
}
else {
assertThat(sql).hasSize(5);
}
Ebean.save(two);
@@ -60,7 +68,12 @@ public class TestElementCollectionBasicCache {
Ebean.save(three);
sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2); // cache hit
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2); // cache hit
}
else {
assertThat(sql).hasSize(5); // cache hit
}
EcPerson four = Ebean.find(EcPerson.class)
.setId(person.getId())
@@ -77,4 +90,8 @@ public class TestElementCollectionBasicCache {
LoggedSqlCollector.stop();
}
public boolean isPersistBatchOnCascade() {
return ((SpiEbeanServer) Ebean.getDefaultServer()).getDatabasePlatform().getPersistBatchOnCascade() != PersistBatch.NONE;
}
}
@@ -2,6 +2,8 @@ package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.annotation.PersistBatch;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -24,9 +26,17 @@ public class TestElementCollectionBasicMap extends BaseTestCase {
Ebean.save(person);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecm_person");
assertThat(sql.get(1)).contains("insert into ecm_person_phone");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecm_person");
assertThat(sql.get(1)).contains("insert into ecm_person_phone");
}
else {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("insert into ecm_person");
assertThat(sql.get(1)).contains("insert into ecm_person_phone");
assertThat(sql.get(2)).contains("insert into ecm_person_phone");
}
EcmPerson person1 = new EcmPerson("Fiona09");
person1.getPhoneNumbers().put("home", "09 1234");
@@ -96,10 +106,20 @@ public class TestElementCollectionBasicMap extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecm_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecm_person_phone_numbers where ecm_person_id=?");
assertThat(sql.get(2)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecm_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecm_person_phone_numbers where ecm_person_id=?");
assertThat(sql.get(2)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("update ecm_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecm_person_phone_numbers where ecm_person_id=?");
assertThat(sql.get(2)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
assertThat(sql.get(3)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
assertThat(sql.get(4)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
}
updateNothing(bean);
}
@@ -120,9 +140,19 @@ public class TestElementCollectionBasicMap extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecm_person_phone_numbers where ecm_person_id=?");
assertThat(sql.get(1)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecm_person_phone_numbers where ecm_person_id=?");
assertThat(sql.get(1)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("delete from ecm_person_phone_numbers where ecm_person_id=?");
assertThat(sql.get(1)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
assertThat(sql.get(2)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
assertThat(sql.get(3)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
assertThat(sql.get(4)).contains("insert into ecm_person_phone_numbers (ecm_person_id,type,number) values (?,?,?)");
}
delete(bean);
}
@@ -1,6 +1,9 @@
package org.tests.model.elementcollection;
import io.ebean.Ebean;
import io.ebean.annotation.PersistBatch;
import io.ebeaninternal.api.SpiEbeanServer;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -41,7 +44,12 @@ public class TestElementCollectionBasicMapCache {
Ebean.save(two);
sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
}
else {
assertThat(sql).hasSize(5);
}
Ebean.save(two);
@@ -64,7 +72,12 @@ public class TestElementCollectionBasicMapCache {
Ebean.save(three);
sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2); // cache hit
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2); // cache hit
}
else {
assertThat(sql).hasSize(3); // cache hit
}
EcmPerson four = Ebean.find(EcmPerson.class)
.setId(person.getId())
@@ -82,4 +95,8 @@ public class TestElementCollectionBasicMapCache {
LoggedSqlCollector.stop();
}
public boolean isPersistBatchOnCascade() {
return ((SpiEbeanServer) Ebean.getDefaultServer()).getDatabasePlatform().getPersistBatchOnCascade() != PersistBatch.NONE;
}
}
@@ -23,9 +23,17 @@ public class TestElementCollectionBasicSet extends BaseTestCase {
Ebean.save(person);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecs_person");
assertThat(sql.get(1)).contains("insert into ecs_person_phone");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecs_person");
assertThat(sql.get(1)).contains("insert into ecs_person_phone");
}
else {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("insert into ecs_person");
assertThat(sql.get(1)).contains("insert into ecs_person_phone");
assertThat(sql.get(2)).contains("insert into ecs_person_phone");
}
EcsPerson person1 = new EcsPerson("Fiona09");
person1.getPhoneNumbers().add("09 1234");
@@ -94,10 +102,20 @@ public class TestElementCollectionBasicSet extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecs_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecs_person_phone where ecs_person_id=?");
assertThat(sql.get(2)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecs_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecs_person_phone where ecs_person_id=?");
assertThat(sql.get(2)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("update ecs_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecs_person_phone where ecs_person_id=?");
assertThat(sql.get(2)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
assertThat(sql.get(3)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
assertThat(sql.get(4)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
}
updateNothing(bean);
}
@@ -118,9 +136,19 @@ public class TestElementCollectionBasicSet extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecs_person_phone where ecs_person_id=?");
assertThat(sql.get(1)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecs_person_phone where ecs_person_id=?");
assertThat(sql.get(1)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("delete from ecs_person_phone where ecs_person_id=?");
assertThat(sql.get(1)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
assertThat(sql.get(2)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
assertThat(sql.get(3)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
assertThat(sql.get(4)).contains("insert into ecs_person_phone (ecs_person_id,phone) values (?,?)");
}
delete(bean);
}
@@ -22,9 +22,17 @@ public class TestElementCollectionEmbeddedList extends BaseTestCase {
Ebean.save(person);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecbl_person");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecbl_person");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers");
}
else {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("insert into ecbl_person");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers");
assertThat(sql.get(2)).contains("insert into ecbl_person_phone_numbers");
}
EcblPerson person1 = new EcblPerson("Fiona6409");
person1.getPhoneNumbers().add(new EcPhone("61","09","1234"));
@@ -94,10 +102,20 @@ public class TestElementCollectionEmbeddedList extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecbl_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(2)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecbl_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(2)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("update ecbl_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(2)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
assertThat(sql.get(3)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
assertThat(sql.get(4)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
}
updateNothing(bean);
}
@@ -118,9 +136,19 @@ public class TestElementCollectionEmbeddedList extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
assertThat(sql.get(2)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
assertThat(sql.get(3)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
assertThat(sql.get(4)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
}
delete(bean);
}
@@ -2,6 +2,8 @@ package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.annotation.PersistBatch;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -47,9 +49,17 @@ public class TestElementCollectionEmbeddedListCache extends BaseTestCase {
Ebean.save(two);
sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2); // update of collection only
assertThat(sql.get(0)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2); // update of collection only
assertThat(sql.get(0)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
}
else {
assertThat(sql).hasSize(3); // update of collection only
assertThat(sql.get(0)).contains("delete from ecbl_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
assertThat(sql.get(2)).contains("insert into ecbl_person_phone_numbers (person_id,country_code,area,number) values (?,?,?,?)");
}
EcblPerson three = Ebean.find(EcblPerson.class)
.setId(person.getId())
@@ -23,9 +23,17 @@ public class TestElementCollectionEmbeddedMap extends BaseTestCase {
Ebean.save(person);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecbm_person");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into ecbm_person");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers");
}
else {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("insert into ecbm_person");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers");
assertThat(sql.get(2)).contains("insert into ecbm_person_phone_numbers");
}
EcbmPerson person1 = new EcbmPerson("Fiona6409");
person1.getPhoneNumbers().put("home",new EcPhone("64","09","1234"));
@@ -87,10 +95,20 @@ public class TestElementCollectionEmbeddedMap extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecbm_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(2)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update ecbm_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(2)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("update ecbm_person set name=?, version=? where id=? and version=?");
assertThat(sql.get(1)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(2)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number)");
assertThat(sql.get(3)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number)");
assertThat(sql.get(4)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number)");
}
updateNothing(bean);
}
@@ -111,9 +129,19 @@ public class TestElementCollectionEmbeddedMap extends BaseTestCase {
Ebean.save(bean);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
}
else {
assertThat(sql).hasSize(5);
assertThat(sql.get(0)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
assertThat(sql.get(2)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
assertThat(sql.get(3)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
assertThat(sql.get(4)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
}
delete(bean);
}
@@ -48,9 +48,17 @@ public class TestElementCollectionEmbeddedMapCache extends BaseTestCase {
Ebean.save(two);
sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(2); // update of collection only
assertThat(sql.get(0)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(2); // update of collection only
assertThat(sql.get(0)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
}
else {
assertThat(sql).hasSize(3); // update of collection only
assertThat(sql.get(0)).contains("delete from ecbm_person_phone_numbers where person_id=?");
assertThat(sql.get(1)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
assertThat(sql.get(2)).contains("insert into ecbm_person_phone_numbers (person_id,mkey,country_code,area,number) values (?,?,?,?,?)");
}
EcbmPerson three = Ebean.find(EcbmPerson.class)
.setId(person.getId())
@@ -18,7 +18,7 @@ public class TestManyToOneAsOne extends BaseTestCase {
@Transactional(batchSize = 20)
@Test
@IgnorePlatform({Platform.SQLSERVER, Platform.ORACLE}) // probably due the use of sequences - Empl has already an ID and Addr refers to it.
@IgnorePlatform({Platform.SQLSERVER, Platform.ORACLE, Platform.HANA}) // probably due the use of sequences - Empl has already an ID and Addr refers to it.
public void test_when_jdbcBatch() {
runInserts();
}
@@ -216,7 +216,12 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase {
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("update cover set s3url=?, deleted=? where id=?");
if (isPersistBatchOnCascade()) {
assertThat(sql.get(0)).contains("update cover set s3url=?, deleted=? where id=?");
}
else {
assertThat(sql.get(0)).contains("update cover set deleted=? where id=?");
}
}
@Test
@@ -232,7 +237,12 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase {
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("update cover set s3url=?, deleted=? where id=?");
if (isPersistBatchOnCascade()) {
assertThat(sql.get(0)).contains("update cover set s3url=?, deleted=? where id=?");
}
else {
assertThat(sql.get(0)).contains("update cover set deleted=? where id=?");
}
}
@Test
@@ -254,7 +264,12 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase {
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("update cover set s3url=?, deleted=? where id=?");
if (isPersistBatchOnCascade()) {
assertThat(sql.get(0)).contains("update cover set s3url=?, deleted=? where id=?");
}
else {
assertThat(sql.get(0)).contains("update cover set deleted=? where id=?");
}
}
@Test
@@ -2,10 +2,13 @@ package org.tests.o2m.jointable;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.annotation.PersistBatch;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -37,8 +40,15 @@ public class TestOneToManyJoinTable extends BaseTestCase {
Ebean.save(troop);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(1);
assertThat(sql.get(0)).contains("insert into troop_monkey (troop_pid, monkey_mid) values (?, ?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(1);
assertThat(sql.get(0)).contains("insert into troop_monkey (troop_pid, monkey_mid) values (?, ?)");
}
else {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into troop_monkey (troop_pid, monkey_mid) values (?, ?)");
assertThat(sql.get(1)).contains("insert into troop_monkey (troop_pid, monkey_mid) values (?, ?)");
}
int intersectionRows = Ebean.createSqlQuery("select count(*) as total from troop_monkey where troop_pid = ?")
.setParameter(1, troop.getPid())
@@ -87,12 +97,23 @@ public class TestOneToManyJoinTable extends BaseTestCase {
Ebean.save(trainer);
List<String> sql = LoggedSqlCollector.current();
//Collections.sort(sql);
assertThat(sql).hasSize(6);
assertThat(sql.get(0)).contains("insert into trainer ");
assertThat(sql.get(1)).contains("insert into monkey ");
assertThat(sql.get(4)).contains("update monkey set name=?, food_preference=?, version=? where mid=? and version=?");
assertThat(sql.get(5)).contains("insert into trainer_monkey ");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(6);
assertThat(sql.get(0)).contains("insert into trainer ");
assertThat(sql.get(1)).contains("insert into monkey ");
assertThat(sql.get(4)).contains("update monkey set name=?, food_preference=?, version=? where mid=? and version=?");
assertThat(sql.get(5)).contains("insert into trainer_monkey ");
}
else {
assertThat(sql).hasSize(10);
assertThat(sql.get(0)).contains("insert into trainer ");
assertThat(sql.get(1)).contains("update monkey set food_preference=?, version=? where mid=? and version=?");
assertThat(sql.get(2)).contains("insert into monkey ");
assertThat(sql.get(5)).contains("insert into trainer_monkey ");
assertThat(sql.get(9)).contains("insert into trainer_monkey ");
}
int intersectionRows = Ebean.createSqlQuery("select count(*) as total from trainer_monkey where trainer_tid = ?")
@@ -37,8 +37,15 @@ public class TestOneToManyJoinTableNoTableName extends BaseTestCase {
Ebean.save(troop);
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(1);
assertThat(sql.get(0)).contains("insert into mkeygroup_monkey (mkeygroup_pid, monkey_mid) values (?, ?)");
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(1);
assertThat(sql.get(0)).contains("insert into mkeygroup_monkey (mkeygroup_pid, monkey_mid) values (?, ?)");
}
else {
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("insert into mkeygroup_monkey (mkeygroup_pid, monkey_mid) values (?, ?)");
assertThat(sql.get(1)).contains("insert into mkeygroup_monkey (mkeygroup_pid, monkey_mid) values (?, ?)");
}
int intersectionRows = Ebean.createSqlQuery("select count(*) as total from mkeygroup_monkey where mkeygroup_pid = ?")
.setParameter(1, troop.getPid())
@@ -1,8 +1,12 @@
package org.tests.query.aggregation;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.StrictAssertions.assertThat;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import org.ebeantest.LoggedSqlCollector;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -13,11 +17,9 @@ import org.tests.model.basic.ResetBasicData;
import org.tests.model.tevent.TEventMany;
import org.tests.model.tevent.TEventOne;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
public class TestAggregationCount extends BaseTestCase {
@@ -383,7 +385,7 @@ public class TestAggregationCount extends BaseTestCase {
List<String> names =
Ebean.find(Contact.class)
.select("concat(lastName,', ',firstName)")
.select(concat("lastName",", ","firstName"))
.where().isNull("phone")
.orderBy().asc("lastName")
.findSingleAttributeList();
@@ -391,7 +393,7 @@ public class TestAggregationCount extends BaseTestCase {
assertThat(names).isNotEmpty();
List<String> sql = LoggedSqlCollector.stop();
assertThat(trimSql(sql.get(0))).contains("select concat(t0.last_name,', ',t0.first_name) from contact t0 where t0.phone is null order by t0.last_name");
assertThat(trimSql(sql.get(0))).contains("select " + concat("t0.last_name",", ","t0.first_name") + " from contact t0 where t0.phone is null order by t0.last_name");
}
@Test
@@ -404,7 +406,7 @@ public class TestAggregationCount extends BaseTestCase {
List<String> names =
Ebean.find(Contact.class)
.select("concat(updtime,', ',firstName)")
.select(concat("updtime",", ","firstName"))
.where().isNull("phone")
.orderBy().asc("lastName")
.findSingleAttributeList();
@@ -412,7 +414,7 @@ public class TestAggregationCount extends BaseTestCase {
assertThat(names).isNotEmpty();
List<String> sql = LoggedSqlCollector.stop();
assertThat(trimSql(sql.get(0))).contains("select concat(t0.updtime,', ',t0.first_name) from contact t0");
assertThat(trimSql(sql.get(0))).contains("select " + concat("t0.updtime",", ","t0.first_name") + " from contact t0");
}
@Test
@@ -446,7 +448,7 @@ public class TestAggregationCount extends BaseTestCase {
List<Contact> contacts =
Ebean.find(Contact.class)
.select("email, concat(lastName,', ',firstName) as lastName")
.select("email, " + concat("lastName",", ","firstName") + " as lastName")
.where().isNull("phone")
.orderBy().asc("lastName")
.findList();
@@ -459,7 +461,7 @@ public class TestAggregationCount extends BaseTestCase {
}
List<String> sql = LoggedSqlCollector.stop();
assertThat(trimSql(sql.get(0))).contains("select t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) lastName from contact t0 where t0.phone is null order by t0.last_name; --bind()");
assertThat(trimSql(sql.get(0))).contains("select t0.id, t0.email, " + concat("t0.last_name",", ","t0.first_name") + " lastName from contact t0 where t0.phone is null order by t0.last_name; --bind()");
}
}
@@ -4,7 +4,10 @@ import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.Transaction;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import org.tests.model.basic.UTDetail;
import org.tests.model.basic.UTMaster;
import org.ebeantest.LoggedSqlCollector;
@@ -21,6 +24,7 @@ public class TestBatchPersistCascade extends BaseTestCase {
Logger logger = LoggerFactory.getLogger(TestBatchPersistCascade.class);
@Test
@IgnorePlatform(Platform.HANA)
public void test() {
EbeanServer ebeanServer = Ebean.getServer(null);
@@ -20,7 +20,7 @@ public class TestNestedSubTransaction extends BaseTestCase {
/**
* MySql only supports named savepoints - review.
*/
@IgnorePlatform({Platform.MYSQL, Platform.SQLSERVER})
@IgnorePlatform({Platform.MYSQL, Platform.SQLSERVER, Platform.HANA})
@Test
public void ebeanServer_commitTransaction_expect_sameAsTransactionCommit() {
@@ -65,7 +65,7 @@ public class TestNestedSubTransaction extends BaseTestCase {
}
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL})
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL, Platform.HANA})
@Test
public void nestedUseSavepoint_doubleNested_rollbackCommit() {
@@ -102,7 +102,7 @@ public class TestNestedSubTransaction extends BaseTestCase {
}
}
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL})
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL, Platform.HANA})
@Test
public void nestedUseSavepoint_doubleNested_commitRollback() {
@@ -139,7 +139,7 @@ public class TestNestedSubTransaction extends BaseTestCase {
}
}
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL})
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL, Platform.HANA})
@Test
public void nestedUseSavepoint_nested_RequiresNew() {
@@ -175,7 +175,7 @@ public class TestNestedSubTransaction extends BaseTestCase {
assertNull(after);
}
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL})
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL, Platform.HANA})
@Test
public void nestedUseSavepoint() {