#1788 - ENH: Add support for NuoDB database platform

This commit is contained in:
rob bygrave
2019-08-11 16:24:37 +12:00
parent fea840c859
commit c640524bfc
50 changed files with 371 additions and 54 deletions
+17 -3
View File
@@ -118,7 +118,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-annotation</artifactId>
<version>4.11</version>
<version>4.12</version>
</dependency>
<dependency>
@@ -130,7 +130,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-datasource</artifactId>
<version>4.5.2</version>
<version>4.6.1</version>
</dependency>
<dependency>
@@ -220,6 +220,13 @@
<!-- Test scope -->
<dependency>
<groupId>com.nuodb.jdbc</groupId>
<artifactId>nuodb-jdbc</artifactId>
<version>20.2.0</version>
<scope>test</scope>
</dependency>
<!--<dependency>-->
<!--<groupId>oracle</groupId>-->
<!--<artifactId>oracle-jdbc</artifactId>-->
@@ -230,7 +237,7 @@
<dependency>
<groupId>io.ebean.test</groupId>
<artifactId>ebean-test-docker</artifactId>
<version>2.8.1</version>
<version>2.10.1</version>
<scope>test</scope>
</dependency>
@@ -285,6 +292,13 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.avaje.composite</groupId>
<artifactId>avaje-composite-testing</artifactId>
@@ -0,0 +1,10 @@
package io.ebean.config.dbplatform.nuodb;
import io.ebean.config.dbplatform.DbViewHistorySupport;
/**
* Runtime support for @History with NuoDB.
*/
public class NuoDbHistorySupport extends DbViewHistorySupport {
}
@@ -0,0 +1,61 @@
package io.ebean.config.dbplatform.nuodb;
import io.ebean.BackgroundExecutor;
import io.ebean.Query;
import io.ebean.annotation.Platform;
import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.config.dbplatform.DbPlatformType;
import io.ebean.config.dbplatform.DbType;
import io.ebean.config.dbplatform.IdType;
import io.ebean.config.dbplatform.PlatformIdGenerator;
import io.ebean.config.dbplatform.SqlErrorCodes;
import javax.sql.DataSource;
/**
* NuoDb specific platform.
*/
public class NuoDbPlatform extends DatabasePlatform {
public NuoDbPlatform() {
super();
this.platform = Platform.NUODB;
this.idInExpandedForm = true;
this.supportsResultSetConcurrencyModeUpdatable = false;
this.supportsDeleteTableAlias = true;
this.columnAliasPrefix = null;
this.likeClauseRaw = "like ?";
this.historySupport = new NuoDbHistorySupport();
//this.dbEncrypt = ...
dbIdentity.setIdType(IdType.IDENTITY);
dbIdentity.setSupportsIdentity(true);
dbIdentity.setSupportsSequence(true);
dbIdentity.setSupportsGetGeneratedKeys(true);
// No referential integrity exception to map
this.exceptionTranslator =
new SqlErrorCodes()
//.addAcquireLock("")
.addDuplicateKey("23000")
.build();
dbTypeMap.put(DbType.INTEGER, new DbPlatformType("integer", false));
}
@Override
public PlatformIdGenerator createSequenceIdGenerator(BackgroundExecutor be, DataSource ds, int stepSize, String seqName) {
return new NuoDbSequence(be, ds, seqName, stepSize);
}
@Override
protected String withForUpdate(String sql, Query.ForUpdate forUpdateMode) {
switch (forUpdateMode) {
case NOWAIT:
return sql + " for update nowait";
case SKIPLOCKED:
default:
return sql + " for update";
}
}
}
@@ -0,0 +1,24 @@
package io.ebean.config.dbplatform.nuodb;
import io.ebean.BackgroundExecutor;
import io.ebean.config.dbplatform.SequenceStepIdGenerator;
import javax.sql.DataSource;
public class NuoDbSequence extends SequenceStepIdGenerator {
private final String nextSql;
/**
* Construct where batchSize is the sequence step size.
*/
public NuoDbSequence(BackgroundExecutor be, DataSource ds, String seqName, int stepSize) {
super(be, ds, seqName, stepSize);
this.nextSql = "select next value for " + seqName + " from dual";
}
@Override
public String getSql(int batchSize) {
return nextSql;
}
}
@@ -15,6 +15,7 @@ import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebean.config.dbplatform.hsqldb.HsqldbPlatform;
import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebean.config.dbplatform.nuodb.NuoDbPlatform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
import io.ebean.config.dbplatform.sqlanywhere.SqlAnywherePlatform;
@@ -804,6 +805,8 @@ public class DefaultDbMigration implements DbMigration {
return new SQLitePlatform();
case HANA:
return new HanaPlatform();
case NUODB:
return new NuoDbPlatform();
case COCKROACH:
return new CockroachPlatform();
case CLICKHOUSE:
@@ -29,9 +29,9 @@ public abstract class DbTriggerBasedHistoryDdl implements PlatformHistoryDdl {
protected String viewSuffix;
protected String historySuffix;
protected String currentTimestamp = "now(6)";
protected String sysPeriodType = "datetime(6)";
protected String now = "now(6)";
protected String sysPeriodEndValue = "now(6)";
DbTriggerBasedHistoryDdl() {
}
@@ -164,7 +164,7 @@ public abstract class DbTriggerBasedHistoryDdl implements PlatformHistoryDdl {
protected void addSysPeriodColumns(DdlBuffer apply, String baseTableName, String whenCreatedColumn) throws IOException {
apply.append("alter table ").append(baseTableName).append(" add column ")
.append(sysPeriodStart).append(" ").append(sysPeriodType).append(" default ").append(currentTimestamp).endOfStatement();
.append(sysPeriodStart).append(" ").append(sysPeriodType).append(" default ").append(now).endOfStatement();
apply.append("alter table ").append(baseTableName).append(" add column ")
.append(sysPeriodEnd).append(" ").append(sysPeriodType).endOfStatement();
@@ -246,12 +246,12 @@ public abstract class DbTriggerBasedHistoryDdl implements PlatformHistoryDdl {
buffer.append(" insert into ").append(historyTable).append(" (").append(sysPeriodStart).append(",").append(sysPeriodEnd).append(",");
appendColumnNames(buffer, columns, "");
buffer.append(") values (OLD.").append(sysPeriodStart).append(", ").append(currentTimestamp).append(",");
buffer.append(") values (OLD.").append(sysPeriodStart).append(", ").append(sysPeriodEndValue).append(",");
appendColumnNames(buffer, columns, "OLD.");
buffer.append(");").newLine();
}
protected void appendColumnNames(DdlBuffer buffer, List<String> columns, String columnPrefix) throws IOException {
void appendColumnNames(DdlBuffer buffer, List<String> columns, String columnPrefix) throws IOException {
for (int i = 0; i < columns.size(); i++) {
if (i > 0) {
buffer.append(", ");
@@ -264,7 +264,7 @@ public abstract class DbTriggerBasedHistoryDdl implements PlatformHistoryDdl {
/**
* Append a single column to the buffer if it is not null.
*/
protected void appendColumnName(DdlBuffer buffer, String prefix, String columnName) throws IOException {
void appendColumnName(DdlBuffer buffer, String prefix, String columnName) throws IOException {
if (columnName != null) {
buffer.append(prefix).append(columnName);
}
@@ -278,7 +278,7 @@ public abstract class DbTriggerBasedHistoryDdl implements PlatformHistoryDdl {
* the column.
* </p>
*/
protected List<String> columnNamesForApply(MTable table) {
List<String> columnNamesForApply(MTable table) {
return table.allHistoryColumns(true);
}
@@ -14,9 +14,10 @@ public class H2HistoryDdl extends DbTriggerBasedHistoryDdl {
private static final String TRIGGER_CLASS = H2HistoryTrigger.class.getName();
public H2HistoryDdl() {
H2HistoryDdl() {
this.sysPeriodType = "timestamp";
this.currentTimestamp = "now()";
this.now = "now()";
this.sysPeriodEndValue = "now()";
}
@Override
@@ -11,13 +11,11 @@ import java.io.IOException;
*/
public class MySqlHistoryDdl extends DbTriggerBasedHistoryDdl {
public MySqlHistoryDdl() {
MySqlHistoryDdl() {
}
@Override
protected void dropTriggers(DdlBuffer buffer, String baseTable) throws IOException {
buffer.append("drop trigger ").append(updateTriggerName(baseTable)).endOfStatement();
buffer.append("drop trigger ").append(deleteTriggerName(baseTable)).endOfStatement();
}
@@ -0,0 +1,41 @@
package io.ebeaninternal.dbmigration.ddlgeneration.platform;
import io.ebean.annotation.ConstraintMode;
import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer;
public class NuoDbDdl extends PlatformDdl {
public NuoDbDdl(DatabasePlatform platform) {
super(platform);
this.historyDdl = new NuoDbHistoryDdl();
this.identitySuffix = " generated by default as identity";
this.dropConstraintIfExists = "drop constraint";
}
@Override
public void addTableComment(DdlBuffer apply, String tableName, String tableComment) {
// do nothing
}
@Override
public void addColumnComment(DdlBuffer apply, String table, String column, String comment) {
// do nothing
}
@Override
protected void appendForeignKeyOnUpdate(StringBuilder buffer, ConstraintMode mode) {
// do nothing
}
@Override
protected void appendForeignKeyOnDelete(StringBuilder buffer, ConstraintMode mode) {
if (mode == ConstraintMode.RESTRICT) {
// do nothing
} else if (mode == ConstraintMode.SET_NULL) {
// do nothing
} else {
super.appendForeignKeyOnDelete(buffer, mode);
}
}
}
@@ -0,0 +1,79 @@
package io.ebeaninternal.dbmigration.ddlgeneration.platform;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite;
import io.ebeaninternal.dbmigration.model.MTable;
import java.io.IOException;
/**
* NuoDB history support using DB triggers to maintain a history table.
*/
public class NuoDbHistoryDdl extends DbTriggerBasedHistoryDdl {
NuoDbHistoryDdl() {
this.now = "now()";
this.sysPeriodEndValue = "NEW.sys_period_start";
}
@Override
protected void dropTriggers(DdlBuffer buffer, String baseTable) throws IOException {
buffer.append("drop trigger ").append(updateTriggerName(baseTable)).endOfStatement();
buffer.append("drop trigger ").append(deleteTriggerName(baseTable)).endOfStatement();
}
@Override
protected void createTriggers(DdlWrite writer, MTable table) throws IOException {
DbTriggerUpdate update = createDbTriggerUpdate(writer, table);
addBeforeUpdate(updateTriggerName(update.getBaseTable()), update);
addBeforeDelete(deleteTriggerName(update.getBaseTable()), update);
}
@Override
protected void updateHistoryTriggers(DbTriggerUpdate update) throws IOException {
recreateHistoryView(update);
DdlBuffer buffer = update.historyTriggerBuffer();
String baseTable = update.getBaseTable();
dropTriggers(buffer, baseTable);
addBeforeUpdate(updateTriggerName(baseTable), update);
addBeforeDelete(deleteTriggerName(baseTable), update);
}
private void addBeforeUpdate(String triggerName, DbTriggerUpdate update) throws IOException {
DdlBuffer apply = update.historyTriggerBuffer();
addTriggerStart(triggerName, update, apply, " before update for each row as ");
apply.append(" NEW.sys_period_start = greatest(current_timestamp, date_add(OLD.sys_period_start, interval 1 microsecond))").endOfStatement();
appendInsertIntoHistory(apply, update.getHistoryTable(), update.getColumns());
addEndTrigger(apply);
}
private void addBeforeDelete(String triggerName, DbTriggerUpdate update) throws IOException {
DdlBuffer apply = update.historyTriggerBuffer();
addTriggerStart(triggerName, update, apply, " before delete for each row as");
appendInsertIntoHistory(apply, update.getHistoryTable(), update.getColumns());
addEndTrigger(apply);
}
private void addTriggerStart(String triggerName, DbTriggerUpdate update, DdlBuffer apply, String s) throws IOException {
apply
.append("delimiter $$").newLine()
.append("create or replace trigger ").append(triggerName).append(" for ").append(update.getBaseTable())
.append(s).newLine();
}
private void addEndTrigger(DdlBuffer apply) throws IOException {
apply.append("end_trigger")
.endOfStatement()
.append("$$").newLine()
.newLine();
}
}
@@ -12,9 +12,9 @@ import java.util.List;
*/
public class PostgresHistoryDdl extends DbTriggerBasedHistoryDdl {
public PostgresHistoryDdl() {
this.currentTimestamp = "current_timestamp";
PostgresHistoryDdl() {
this.now = "current_timestamp";
this.sysPeriodEndValue = "current_timestamp";
}
/**
@@ -36,7 +36,7 @@ public class PostgresHistoryDdl extends DbTriggerBasedHistoryDdl {
protected void addSysPeriodColumns(DdlBuffer apply, String baseTableName, String whenCreatedColumn) throws IOException {
apply
.append("alter table ").append(baseTableName)
.append(" add column ").append(sysPeriod).append(" tstzrange not null default tstzrange(").append(currentTimestamp).append(", null)")
.append(" add column ").append(sysPeriod).append(" tstzrange not null default tstzrange(").append(now).append(", null)")
.endOfStatement();
if (whenCreatedColumn != null) {
@@ -9,6 +9,7 @@ import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebean.config.dbplatform.hsqldb.HsqldbPlatform;
import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebean.config.dbplatform.nuodb.NuoDbPlatform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebean.config.dbplatform.postgres.Postgres8Platform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
@@ -108,6 +109,9 @@ public class DatabasePlatformFactory {
if (dbName.equals("clickhouse")) {
return new ClickHousePlatform();
}
if (dbName.equals("nuodb")) {
return new NuoDbPlatform();
}
if (dbName.equals("sqlite")) {
return new SQLitePlatform();
}
@@ -158,6 +162,8 @@ public class DatabasePlatformFactory {
return new HsqldbPlatform();
} else if (dbProductName.contains("postgres")) {
return readPostgres(connection);
} else if (dbProductName.contains("nuo")) {
return new NuoDbPlatform();
} else if (dbProductName.contains("sqlite")) {
return new SQLitePlatform();
} else if (dbProductName.contains("db2")) {
@@ -177,7 +183,7 @@ public class DatabasePlatformFactory {
/**
* Use a select version() query as it could be Postgres or CockroachDB.
*/
private static PostgresPlatform readPostgres(Connection connection) {
private static DatabasePlatform readPostgres(Connection connection) {
// Postgres driver uses a hardcoded product name so use version() query
PreparedStatement statement = null;
ResultSet resultSet = null;
@@ -8,6 +8,7 @@ import io.ebeaninternal.dbmigration.ddlgeneration.platform.H2Ddl;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.HanaColumnStoreDdl;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.HsqldbDdl;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.MySqlDdl;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.NuoDbDdl;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.Oracle10Ddl;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PostgresDdl;
@@ -33,6 +34,8 @@ public class PlatformDdlBuilder {
return new MySqlDdl(platform);
case HSQLDB:
return new HsqldbDdl(platform);
case NUODB:
return new NuoDbDdl(platform);
case ORACLE:
return new Oracle10Ddl(platform);
case SQLITE:
+4
View File
@@ -170,6 +170,10 @@ public abstract class BaseTestCase {
return Platform.ORACLE == platform();
}
public boolean isNuoDb() {
return Platform.NUODB == platform();
}
public boolean isDb2() {
return Platform.DB2 == platform();
}
@@ -12,7 +12,7 @@ public class SqlRowBooleanTest extends BaseTestCase {
SqlQuery sqlQuery;
if (isSqlServer()) {
sqlQuery = Ebean.createSqlQuery("SELECT 1 AS ISNT_NULL");
} else if (isOracle()) {
} else if (isOracle() || isNuoDb()) {
sqlQuery = Ebean.createSqlQuery("SELECT 1 AS ISNT_NULL from dual");
} else if (isDb2()) {
sqlQuery = Ebean.createSqlQuery("SELECT 1 AS ISNT_NULL from SYSIBM.SYSDUMMY1");
@@ -50,7 +50,7 @@ public class DbMigrationTest extends BaseTestCase {
}
}
@IgnorePlatform(Platform.ORACLE)
@IgnorePlatform({Platform.ORACLE, Platform.NUODB})
@Test
public void testRunMigration() throws IOException {
// first clean up previously created objects
@@ -37,7 +37,7 @@ public class CacheBeanDataTest extends BaseTestCase {
c.setSmallnote("somenote");
Address billingAddress = new Address();
billingAddress.setId((short) 12);
billingAddress.setId(12);
billingAddress.setCity("Auckland");
billingAddress.setCountry(server.getReference(Country.class, "NZ"));
billingAddress.setLine1("92 Someplace Else");
@@ -31,7 +31,7 @@ public class CachedBeanDataFromBeanTest extends BaseTestCase {
customer.setAnniversary(largeDate);
Address billingAddress = new Address();
billingAddress.setId(Short.valueOf("12"));
billingAddress.setId(12);
billingAddress.setCity("SomePlace");
customer.setBillingAddress(billingAddress);
+17
View File
@@ -0,0 +1,17 @@
package main;
import io.ebean.docker.commands.NuoDBConfig;
import io.ebean.docker.commands.NuoDBContainer;
public class StartNuoDB {
public static void main(String[] args) {
NuoDBConfig config = new NuoDBConfig();
config.setDbName("unit");
NuoDBContainer container = new NuoDBContainer(config);
container.stopRemove();
container.startWithDropCreate();
}
}
@@ -19,7 +19,7 @@ import static org.junit.Assert.assertNotNull;
public class TestAggregateFormula extends BaseTestCase {
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL})
@IgnorePlatform({Platform.SQLSERVER, Platform.MYSQL, Platform.NUODB})
@Test
public void minDistinctOrderByNulls() {
@@ -29,7 +29,7 @@ public class TestAssocOneEqExpression extends BaseTestCase {
Assert.assertTrue(sql.contains("where t0.kcustomer_id = ?"));
Address b = new Address();
b.setId((short) 1);
b.setId(1);
Query<Order> q2 = Ebean.find(Order.class)
.where().eq("customer.billingAddress", b)
@@ -22,7 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class TestBatchOnCascadeExceptionHandling extends BaseTestCase {
@IgnorePlatform(Platform.HANA)
@IgnorePlatform({Platform.HANA, Platform.NUODB})
@Test
public void testBatchScenarioWithSavepoint() throws SQLException {
server().save(createEntityWithName("conflict", "before"));
@@ -52,6 +52,7 @@ public class TestBatchOnCascadeExceptionHandling extends BaseTestCase {
assertThat(winner.getDescription()).isEqualTo("after");
}
@IgnorePlatform(Platform.NUODB)
@Test
public void testBatchedInsertFailure() {
server().save(createEntityWithName("foo"));
@@ -60,6 +61,7 @@ public class TestBatchOnCascadeExceptionHandling extends BaseTestCase {
});
}
@IgnorePlatform(Platform.NUODB)
@Test
public void testBatchedUpdateFailure() {
server().save(createEntityWithName("bla"));
@@ -71,6 +73,7 @@ public class TestBatchOnCascadeExceptionHandling extends BaseTestCase {
});
}
@IgnorePlatform(Platform.NUODB)
@Test
public void testBatchedDeleteFailure() {
final EOptOneC c = new EOptOneC();
+3 -1
View File
@@ -2,6 +2,7 @@ package org.tests.cache;
import io.ebean.BaseTestCase;
import io.ebean.CacheMode;
import io.ebean.DB;
import io.ebean.Ebean;
import io.ebean.bean.BeanCollection;
import io.ebean.cache.ServerCache;
@@ -52,6 +53,7 @@ public class TestQueryCache extends BaseTestCase {
@Test
public void findSingleAttribute() {
DB.find(EColAB.class).delete();
new EColAB("03", "SingleAttribute").save();
new EColAB("03", "SingleAttribute").save();
@@ -260,11 +262,11 @@ public class TestQueryCache extends BaseTestCase {
@Test
public void findIds() {
DB.find(EColAB.class).delete();
new EColAB("03", "someId").save();
new EColAB("04", "someId").save();
new EColAB("05", "someId").save();
LoggedSqlCollector.start();
List<Integer> colA_first = Ebean.find(EColAB.class)
@@ -2,6 +2,8 @@ package org.tests.cascade;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import io.ebean.bean.BeanCollection;
import org.tests.model.basic.TSDetailTwo;
import org.tests.model.basic.TSMasterTwo;
@@ -13,6 +15,7 @@ import java.util.Set;
public class TestPrivateOwnedNoCascadeRemove extends BaseTestCase {
@IgnorePlatform(Platform.NUODB)
@Test
public void test() {
@@ -1,7 +1,7 @@
package org.tests.compositekeys;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.DB;
import org.junit.Test;
import org.tests.model.basic.CKeyParent;
import org.tests.model.basic.CKeyParentId;
@@ -24,20 +24,21 @@ public class TestCKeyDelete extends BaseTestCase {
p.setId(id);
p.setName("testDelete");
Ebean.save(p);
DB.save(p);
CKeyParent found = Ebean.find(CKeyParent.class).where().idEq(searchId).findOne();
CKeyParent found = DB.find(CKeyParent.class).where().idEq(searchId).findOne();
assertNotNull(found);
Ebean.delete(CKeyParent.class, searchId);
DB.delete(CKeyParent.class, searchId);
CKeyParent notFound = Ebean.find(CKeyParent.class).where().idEq(searchId).findOne();
CKeyParent notFound = DB.find(CKeyParent.class).where().idEq(searchId).findOne();
assertNull(notFound);
}
@Test
public void testDeleteWhere() {
DB.truncate(CKeyParent.class);
CKeyParentId id = new CKeyParentId(101, "deleteMe2");
CKeyParentId searchId = new CKeyParentId(101, "deleteMe2");
@@ -46,18 +47,18 @@ public class TestCKeyDelete extends BaseTestCase {
p.setId(id);
p.setName("testDelete");
Ebean.save(p);
DB.save(p);
List<CKeyParentId> ids = Ebean.find(CKeyParent.class).where().eq("id.oneKey", 101).findIds();
List<CKeyParentId> ids = DB.find(CKeyParent.class).where().eq("id.oneKey", 101).findIds();
assertThat(ids).hasSize(1);
CKeyParentId foundId = ids.get(0);
assertThat(foundId.getOneKey()).isEqualTo(101);
assertThat(foundId.getTwoKey()).isEqualTo("deleteMe2");
Ebean.createQuery(CKeyParent.class).where().eq("id.oneKey", 101).delete();
DB.createQuery(CKeyParent.class).where().eq("id.oneKey", 101).delete();
CKeyParent found = Ebean.find(CKeyParent.class).where().idEq(searchId).findOne();
CKeyParent found = DB.find(CKeyParent.class).where().idEq(searchId).findOne();
assertNull(found);
}
}
@@ -2,6 +2,8 @@ package org.tests.ddl;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -82,6 +84,7 @@ public class TestForeignKeyModes extends BaseTestCase {
assertThat(sql.get(1)).contains("delete from dfk_none_via_mto_m where id=?");
}
@IgnorePlatform(Platform.NUODB)
@Test
public void setNullOnDelete() {
@@ -99,6 +102,7 @@ public class TestForeignKeyModes extends BaseTestCase {
assertThat(found.getOne()).isNull();
}
@IgnorePlatform(Platform.NUODB)
@Test
public void onDeleteCascade() {
@@ -47,7 +47,7 @@ public class TestPathExpression {
assertEquals(c1.getStatus(), Customer.Status.ACTIVE);
assertEquals(c1.getBillingAddress().getLine1(), "12 someplace");
assertEquals(c1.getBillingAddress().getCity(), "Auckland");
assertEquals(c1.getBillingAddress().getId(), Short.valueOf("4"));
assertEquals(c1.getBillingAddress().getId(), Integer.valueOf("4"));
assertEquals(c1.getBillingAddress().getCountry().getCode(), "NZ");
assertEquals(c1.getBillingAddress().getCountry().getName(), "New Zealand");
@@ -57,7 +57,7 @@ public class TestPathExpression {
public void pathGet() {
Address billingAddress = new Address();
billingAddress.setId((short) 12);
billingAddress.setId(12);
billingAddress.setLine1("line1");
billingAddress.setCity("Auckland");
@@ -72,7 +72,7 @@ public class TestPathExpression {
EntityBean e0 = (EntityBean) c0;
assertEquals(line1.pathGet(e0), "line1");
assertEquals(city.pathGet(e0), "Auckland");
assertEquals(billingId.pathGet(e0), Short.valueOf("12"));
assertEquals(billingId.pathGet(e0), Integer.valueOf("12"));
assertEquals(beanType.getExpressionPath("billingAddress.country.code").pathGet(e0), "NZ");
@@ -1,8 +1,11 @@
package org.tests.insert;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.DataIntegrityException;
import io.ebean.Ebean;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import org.junit.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.Order;
@@ -11,6 +14,7 @@ import org.tests.model.basic.ResetBasicData;
public class TestInsertDataIntegrityException extends BaseTestCase {
@IgnorePlatform(Platform.NUODB)
@Test(expected = DataIntegrityException.class)
public void insert_invalidForeignKey() {
@@ -23,6 +27,6 @@ public class TestInsertDataIntegrityException extends BaseTestCase {
order.setStatus(Order.Status.NEW);
order.setCustomer(invalidCustomer);
Ebean.save(order);
DB.save(order);
}
}
@@ -1,6 +1,7 @@
package org.tests.m2m;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import io.ebean.SqlQuery;
import io.ebean.SqlRow;
@@ -16,6 +17,8 @@ public class TestM2MDeleteCascadeFromParent extends BaseTestCase {
@Test
public void test() {
DB.truncate("mny_b_mny_c","mny_c","mny_b", "mny_a");
MnyC c0 = new MnyC();
c0.setName("c0");
c0.save();
@@ -2,6 +2,8 @@ package org.tests.m2m;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import org.tests.model.basic.MnocRole;
import org.tests.model.basic.MnocUser;
import org.junit.Assert;
@@ -12,6 +14,7 @@ import java.util.List;
public class TestM2MDeleteNoCascade extends BaseTestCase {
@IgnorePlatform(Platform.NUODB)
@Test
public void test() {
@@ -25,7 +25,7 @@ import java.sql.Timestamp;
public class Address {
@Id
Short id;
Integer id;
@Size(max = 100)
@Column(name = "line_1")
@@ -55,14 +55,14 @@ public class Address {
/**
* Return id.
*/
public Short getId() {
public Integer getId() {
return id;
}
/**
* Set id.
*/
public void setId(Short id) {
public void setId(Integer id) {
this.id = id;
}
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import io.ebean.Transaction;
import org.ebeantest.LoggedSqlCollector;
@@ -18,6 +19,7 @@ public class TestElementCollectionBasic extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcPerson.class);
eventLog();
LoggedSqlCollector.start();
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import io.ebean.annotation.PersistBatch;
import io.ebeaninternal.api.SpiEbeanServer;
@@ -15,6 +16,7 @@ public class TestElementCollectionBasicCache extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcPerson.class);
EcPerson person = new EcPerson("Cache1");
person.getPhoneNumbers().add("021 1234");
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -15,6 +16,7 @@ public class TestElementCollectionBasicMap extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcmPerson.class);
LoggedSqlCollector.start();
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -13,6 +14,7 @@ public class TestElementCollectionBasicMapAsLob extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcmcPerson.class);
LoggedSqlCollector.start();
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import io.ebean.annotation.PersistBatch;
import io.ebeaninternal.api.SpiEbeanServer;
@@ -15,6 +16,7 @@ public class TestElementCollectionBasicMapCache extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcmPerson.class);
EcmPerson person = new EcmPerson("CacheMap");
person.getPhoneNumbers().put("home", "021 1234");
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -14,6 +15,7 @@ public class TestElementCollectionBasicSet extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcsPerson.class);
LoggedSqlCollector.start();
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -13,6 +14,7 @@ public class TestElementCollectionEmbeddedList extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcblPerson.class);
LoggedSqlCollector.start();
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -13,6 +14,7 @@ public class TestElementCollectionEmbeddedListCache extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcblPerson.class);
EcblPerson person = new EcblPerson("CacheL");
person.getPhoneNumbers().add(new EcPhone("64", "021","1234"));
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -14,6 +15,7 @@ public class TestElementCollectionEmbeddedMap extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcbmPerson.class);
LoggedSqlCollector.start();
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -13,6 +14,7 @@ public class TestElementCollectionEmbeddedMapCache extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcbmPerson.class);
EcbmPerson person = new EcbmPerson("Cache1");
person.getPhoneNumbers().put("home", new EcPhone("64", "021", "1234"));
@@ -1,6 +1,7 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.junit.Test;
@@ -10,6 +11,7 @@ public class TestElementCollectionEnumSet extends BaseTestCase {
@Test
public void test() {
DB.truncate(EcEnumPerson.class);
EcEnumPerson person = new EcEnumPerson("Enum Person");
person.getTags().add(EcEnumPerson.Tags.BLUE);
@@ -1,17 +1,18 @@
package org.tests.model.lazywithid;
import static org.junit.Assert.assertEquals;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import org.junit.Test;
import java.util.List;
import org.junit.Test;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import static org.junit.Assert.assertEquals;
public class TestColumnIdName extends BaseTestCase {
@Test
public void test() {
DB.truncate(Tune.class);
Tune tune = new Tune();
tune.getLoonies().add(new Looney("Taz"));
@@ -41,7 +41,7 @@ public class TestOrderByWithDistinct extends BaseTestCase {
}
@Test
@IgnorePlatform({Platform.MYSQL, Platform.SQLSERVER}) // do not support nulls first/last
@IgnorePlatform({Platform.MYSQL, Platform.SQLSERVER, Platform.NUODB}) // do not support nulls first/last
public void testDistinctOn() {
MRole role = Ebean.getReference(MRole.class, 1);
@@ -26,7 +26,7 @@ public class TestWhereLikeWithSlash extends BaseTestCase {
Query<EBasic> query1 = Ebean.find(EBasic.class).where().like("name", "slash\\mon%").query();
List<EBasic> list1 = query1.findList();
if (!isMySql()) {
if (!isMySql() && !isNuoDb()) {
// For mysql this assert depends on no_backslash_escapes setting so we won't assert here
// Still good on Postgres which was the original issue
assertEquals(1, list1.size());
@@ -1,6 +1,7 @@
package org.tests.repository;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import org.junit.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
@@ -15,6 +16,7 @@ public class TestBeanRepository extends BaseTestCase {
@Test
public void test() {
DB.find(Customer.class).where().in("name", "c0", "c1").delete();
ResetBasicData.reset();
@@ -1,6 +1,7 @@
package org.tests.softdelete;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.Ebean;
import io.ebean.Query;
import io.ebean.SqlQuery;
@@ -113,6 +114,7 @@ public class TestSoftDeleteBasic extends BaseTestCase {
@Test
public void testFindSoftDeleted() {
DB.truncate(EBasicSoftDelete.class);
EBasicSoftDelete bean = new EBasicSoftDelete();
bean.setName("softDelFetch");
+7 -1
View File
@@ -21,7 +21,7 @@ ebean.ddl.generate=true
ebean.ddl.run=true
ebean.ddl.header=-- Generated by ebean ${version} at ${timestamp}
ebean.packages=org.tests
datasource.default=h2
datasource.default=nuodb
ebean.dumpMetricsOnShutdown=true
ebean.dumpMetricsOptions=sql,hash
@@ -172,6 +172,12 @@ datasource.sqlserver.password=SqlS3rv#r
datasource.sqlserver.url=jdbc:sqlserver://localhost:1433;databaseName=test_ebean;sendTimeAsDateTime=false
datasource.sqlserver.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
datasource.nuodb.schema=test_user
datasource.nuodb.username=test_user
datasource.nuodb.password=test
datasource.nuodb.url=jdbc:com.nuodb://localhost/unit
datasource.nuodb.driver=com.nuodb.jdbc.Driver
datasource.db2.username=db2admin
datasource.db2.password=veryverysecret#1234
datasource.db2.databaseUrl=jdbc:db2://127.0.0.1:50000/SAMPLE
+1 -1
View File
@@ -5,7 +5,7 @@
drop view order_agg_vw if exists;
</ddl-script>
<ddl-script name="order views" platforms="db2,h2,postgres,oracle,mysql">
<ddl-script name="order views" platforms="db2,h2,postgres,oracle,mysql,nuodb">
create or replace view order_agg_vw as
select d.order_id, sum(d.order_qty * d.unit_price) as order_total,
sum(d.ship_qty * d.unit_price) as ship_total
+1 -1
View File
@@ -77,7 +77,7 @@
<logger name="io.ebean" level="INFO"/>
<logger name="io.ebean.docker" level="TRACE"/>
<!--<logger name="io.ebean.DDL" level="DEBUG"/>-->
<!-- <logger name="io.ebean.DDL" level="DEBUG"/>-->
<logger name="io.ebean.SQL" level="TRACE"/>
<!-- <logger name="io.ebean.TXN" level="TRACE"/>-->