From c640524bfc4f0dd5fd1c01f65b476775064fd248 Mon Sep 17 00:00:00 2001
From: rob bygrave
Date: Sun, 11 Aug 2019 16:24:37 +1200
Subject: [PATCH] #1788 - ENH: Add support for NuoDB database platform
---
pom.xml | 20 ++++-
.../dbplatform/nuodb/NuoDbHistorySupport.java | 10 +++
.../dbplatform/nuodb/NuoDbPlatform.java | 61 ++++++++++++++
.../dbplatform/nuodb/NuoDbSequence.java | 24 ++++++
.../dbmigration/DefaultDbMigration.java | 3 +
.../platform/DbTriggerBasedHistoryDdl.java | 14 ++--
.../ddlgeneration/platform/H2HistoryDdl.java | 5 +-
.../platform/MySqlHistoryDdl.java | 4 +-
.../ddlgeneration/platform/NuoDbDdl.java | 41 ++++++++++
.../platform/NuoDbHistoryDdl.java | 79 +++++++++++++++++++
.../platform/PostgresHistoryDdl.java | 8 +-
.../server/core/DatabasePlatformFactory.java | 8 +-
.../server/core/PlatformDdlBuilder.java | 3 +
src/test/java/io/ebean/BaseTestCase.java | 4 +
src/test/java/io/ebean/SqlRowBooleanTest.java | 2 +-
.../dbmigration/DbMigrationTest.java | 2 +-
.../server/cache/CacheBeanDataTest.java | 2 +-
.../cache/CachedBeanDataFromBeanTest.java | 2 +-
src/test/java/main/StartNuoDB.java | 17 ++++
.../TestAggregateFormula.java | 2 +-
.../tests/basic/TestAssocOneEqExpression.java | 2 +-
.../TestBatchOnCascadeExceptionHandling.java | 5 +-
.../java/org/tests/cache/TestQueryCache.java | 4 +-
.../TestPrivateOwnedNoCascadeRemove.java | 3 +
.../tests/compositekeys/TestCKeyDelete.java | 19 ++---
.../org/tests/ddl/TestForeignKeyModes.java | 4 +
.../java/org/tests/el/TestPathExpression.java | 6 +-
.../TestInsertDataIntegrityException.java | 6 +-
.../m2m/TestM2MDeleteCascadeFromParent.java | 3 +
.../org/tests/m2m/TestM2MDeleteNoCascade.java | 3 +
.../java/org/tests/model/basic/Address.java | 6 +-
.../TestElementCollectionBasic.java | 2 +
.../TestElementCollectionBasicCache.java | 2 +
.../TestElementCollectionBasicMap.java | 2 +
.../TestElementCollectionBasicMapAsLob.java | 2 +
.../TestElementCollectionBasicMapCache.java | 2 +
.../TestElementCollectionBasicSet.java | 2 +
.../TestElementCollectionEmbeddedList.java | 2 +
...estElementCollectionEmbeddedListCache.java | 2 +
.../TestElementCollectionEmbeddedMap.java | 2 +
...TestElementCollectionEmbeddedMapCache.java | 2 +
.../TestElementCollectionEnumSet.java | 2 +
.../model/lazywithid/TestColumnIdName.java | 11 +--
.../orderby/TestOrderByWithDistinct.java | 2 +-
.../query/other/TestWhereLikeWithSlash.java | 2 +-
.../tests/repository/TestBeanRepository.java | 2 +
.../tests/softdelete/TestSoftDeleteBasic.java | 2 +
src/test/resources/ebean.properties | 8 +-
src/test/resources/extra-ddl.xml | 2 +-
src/test/resources/logback-test.xml | 2 +-
50 files changed, 371 insertions(+), 54 deletions(-)
create mode 100644 src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbHistorySupport.java
create mode 100644 src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java
create mode 100644 src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbSequence.java
create mode 100644 src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbDdl.java
create mode 100644 src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbHistoryDdl.java
create mode 100644 src/test/java/main/StartNuoDB.java
diff --git a/pom.xml b/pom.xml
index 1d07f2859..a51556f80 100644
--- a/pom.xml
+++ b/pom.xml
@@ -118,7 +118,7 @@
io.ebean
ebean-annotation
- 4.11
+ 4.12
@@ -130,7 +130,7 @@
io.ebean
ebean-datasource
- 4.5.2
+ 4.6.1
@@ -220,6 +220,13 @@
+
+ com.nuodb.jdbc
+ nuodb-jdbc
+ 20.2.0
+ test
+
+
@@ -230,7 +237,7 @@
io.ebean.test
ebean-test-docker
- 2.8.1
+ 2.10.1
test
@@ -285,6 +292,13 @@
test
+
+ org.mockito
+ mockito-core
+ 3.0.0
+ test
+
+
org.avaje.composite
avaje-composite-testing
diff --git a/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbHistorySupport.java b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbHistorySupport.java
new file mode 100644
index 000000000..2bb0918fc
--- /dev/null
+++ b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbHistorySupport.java
@@ -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 {
+
+}
diff --git a/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java
new file mode 100644
index 000000000..f58cedb54
--- /dev/null
+++ b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java
@@ -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";
+ }
+ }
+
+}
diff --git a/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbSequence.java b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbSequence.java
new file mode 100644
index 000000000..6767231c4
--- /dev/null
+++ b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbSequence.java
@@ -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;
+ }
+}
diff --git a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java
index 0ce03379c..d886c7433 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java
@@ -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:
diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java
index 5a5583139..78d3839ca 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java
@@ -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 columns, String columnPrefix) throws IOException {
+ void appendColumnNames(DdlBuffer buffer, List 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.
*
*/
- protected List columnNamesForApply(MTable table) {
+ List columnNamesForApply(MTable table) {
return table.allHistoryColumns(true);
}
diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2HistoryDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2HistoryDdl.java
index a1f8f1806..bb474c1e4 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2HistoryDdl.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2HistoryDdl.java
@@ -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
diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlHistoryDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlHistoryDdl.java
index d67e1c08a..16d07136e 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlHistoryDdl.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlHistoryDdl.java
@@ -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();
}
diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbDdl.java
new file mode 100644
index 000000000..0f0c15871
--- /dev/null
+++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbDdl.java
@@ -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);
+ }
+ }
+}
diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbHistoryDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbHistoryDdl.java
new file mode 100644
index 000000000..89d81eb9b
--- /dev/null
+++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NuoDbHistoryDdl.java
@@ -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();
+ }
+
+}
diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresHistoryDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresHistoryDdl.java
index d1b34b976..fe9b17f1b 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresHistoryDdl.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresHistoryDdl.java
@@ -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) {
diff --git a/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java b/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java
index 9cd221c92..0854ae4f3 100644
--- a/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java
+++ b/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java
@@ -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;
diff --git a/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java b/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java
index 34e696735..bacee903e 100644
--- a/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java
+++ b/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java
@@ -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:
diff --git a/src/test/java/io/ebean/BaseTestCase.java b/src/test/java/io/ebean/BaseTestCase.java
index b53b095ec..c9fe57ba1 100644
--- a/src/test/java/io/ebean/BaseTestCase.java
+++ b/src/test/java/io/ebean/BaseTestCase.java
@@ -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();
}
diff --git a/src/test/java/io/ebean/SqlRowBooleanTest.java b/src/test/java/io/ebean/SqlRowBooleanTest.java
index e5aa7d148..172b24787 100644
--- a/src/test/java/io/ebean/SqlRowBooleanTest.java
+++ b/src/test/java/io/ebean/SqlRowBooleanTest.java
@@ -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");
diff --git a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationTest.java b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationTest.java
index d8a0caef0..ee53a1ef7 100644
--- a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationTest.java
+++ b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationTest.java
@@ -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
diff --git a/src/test/java/io/ebeaninternal/server/cache/CacheBeanDataTest.java b/src/test/java/io/ebeaninternal/server/cache/CacheBeanDataTest.java
index 6ac8e78b7..2ba1b9747 100644
--- a/src/test/java/io/ebeaninternal/server/cache/CacheBeanDataTest.java
+++ b/src/test/java/io/ebeaninternal/server/cache/CacheBeanDataTest.java
@@ -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");
diff --git a/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java b/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java
index 3dc2077fb..1490bead6 100644
--- a/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java
+++ b/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java
@@ -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);
diff --git a/src/test/java/main/StartNuoDB.java b/src/test/java/main/StartNuoDB.java
new file mode 100644
index 000000000..e80beb78b
--- /dev/null
+++ b/src/test/java/main/StartNuoDB.java
@@ -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();
+ }
+}
diff --git a/src/test/java/org/tests/aggregateformula/TestAggregateFormula.java b/src/test/java/org/tests/aggregateformula/TestAggregateFormula.java
index 6bf12e1f6..f06cc223b 100644
--- a/src/test/java/org/tests/aggregateformula/TestAggregateFormula.java
+++ b/src/test/java/org/tests/aggregateformula/TestAggregateFormula.java
@@ -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() {
diff --git a/src/test/java/org/tests/basic/TestAssocOneEqExpression.java b/src/test/java/org/tests/basic/TestAssocOneEqExpression.java
index 9d4ad50c7..77d987761 100644
--- a/src/test/java/org/tests/basic/TestAssocOneEqExpression.java
+++ b/src/test/java/org/tests/basic/TestAssocOneEqExpression.java
@@ -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 q2 = Ebean.find(Order.class)
.where().eq("customer.billingAddress", b)
diff --git a/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java b/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java
index 757a79881..a1a084dcb 100644
--- a/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java
+++ b/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java
@@ -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();
diff --git a/src/test/java/org/tests/cache/TestQueryCache.java b/src/test/java/org/tests/cache/TestQueryCache.java
index 31b59ff70..f9e732220 100644
--- a/src/test/java/org/tests/cache/TestQueryCache.java
+++ b/src/test/java/org/tests/cache/TestQueryCache.java
@@ -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 colA_first = Ebean.find(EColAB.class)
diff --git a/src/test/java/org/tests/cascade/TestPrivateOwnedNoCascadeRemove.java b/src/test/java/org/tests/cascade/TestPrivateOwnedNoCascadeRemove.java
index d521f672f..473f96d88 100644
--- a/src/test/java/org/tests/cascade/TestPrivateOwnedNoCascadeRemove.java
+++ b/src/test/java/org/tests/cascade/TestPrivateOwnedNoCascadeRemove.java
@@ -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() {
diff --git a/src/test/java/org/tests/compositekeys/TestCKeyDelete.java b/src/test/java/org/tests/compositekeys/TestCKeyDelete.java
index c3697e043..22a032854 100644
--- a/src/test/java/org/tests/compositekeys/TestCKeyDelete.java
+++ b/src/test/java/org/tests/compositekeys/TestCKeyDelete.java
@@ -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 ids = Ebean.find(CKeyParent.class).where().eq("id.oneKey", 101).findIds();
+ List 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);
}
}
diff --git a/src/test/java/org/tests/ddl/TestForeignKeyModes.java b/src/test/java/org/tests/ddl/TestForeignKeyModes.java
index 113c72e16..e0eab0a7b 100644
--- a/src/test/java/org/tests/ddl/TestForeignKeyModes.java
+++ b/src/test/java/org/tests/ddl/TestForeignKeyModes.java
@@ -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() {
diff --git a/src/test/java/org/tests/el/TestPathExpression.java b/src/test/java/org/tests/el/TestPathExpression.java
index c5254a305..1fa061269 100644
--- a/src/test/java/org/tests/el/TestPathExpression.java
+++ b/src/test/java/org/tests/el/TestPathExpression.java
@@ -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");
diff --git a/src/test/java/org/tests/insert/TestInsertDataIntegrityException.java b/src/test/java/org/tests/insert/TestInsertDataIntegrityException.java
index 94518ddce..539f05f8d 100644
--- a/src/test/java/org/tests/insert/TestInsertDataIntegrityException.java
+++ b/src/test/java/org/tests/insert/TestInsertDataIntegrityException.java
@@ -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);
}
}
diff --git a/src/test/java/org/tests/m2m/TestM2MDeleteCascadeFromParent.java b/src/test/java/org/tests/m2m/TestM2MDeleteCascadeFromParent.java
index 491c605db..4df6c7efb 100644
--- a/src/test/java/org/tests/m2m/TestM2MDeleteCascadeFromParent.java
+++ b/src/test/java/org/tests/m2m/TestM2MDeleteCascadeFromParent.java
@@ -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();
diff --git a/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java b/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java
index a3717b0b7..dcb4f984e 100644
--- a/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java
+++ b/src/test/java/org/tests/m2m/TestM2MDeleteNoCascade.java
@@ -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() {
diff --git a/src/test/java/org/tests/model/basic/Address.java b/src/test/java/org/tests/model/basic/Address.java
index a11d38a0d..3b68776bd 100644
--- a/src/test/java/org/tests/model/basic/Address.java
+++ b/src/test/java/org/tests/model/basic/Address.java
@@ -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;
}
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java
index c4bd282d0..2bf32672a 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java
@@ -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();
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicCache.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicCache.java
index e36c86a53..a91ce35d0 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicCache.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicCache.java
@@ -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");
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMap.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMap.java
index 225a7316d..ed4f219a1 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMap.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMap.java
@@ -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();
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapAsLob.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapAsLob.java
index 3b65b22ba..830cb5b5b 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapAsLob.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapAsLob.java
@@ -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();
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapCache.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapCache.java
index 3e33693c9..7830a62af 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapCache.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapCache.java
@@ -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");
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java
index ea0e3c213..57b7500be 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java
@@ -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();
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedList.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedList.java
index 923054961..145081116 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedList.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedList.java
@@ -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();
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java
index a1153b074..b6dc16487 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java
@@ -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"));
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMap.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMap.java
index 5d13fcf5e..bad87bc76 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMap.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMap.java
@@ -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();
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMapCache.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMapCache.java
index 9fe0ecc21..e4f6af4c3 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMapCache.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedMapCache.java
@@ -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"));
diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java
index 988097da5..ae03beeb6 100644
--- a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java
+++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java
@@ -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);
diff --git a/src/test/java/org/tests/model/lazywithid/TestColumnIdName.java b/src/test/java/org/tests/model/lazywithid/TestColumnIdName.java
index 4d8a16106..b36bb48cb 100644
--- a/src/test/java/org/tests/model/lazywithid/TestColumnIdName.java
+++ b/src/test/java/org/tests/model/lazywithid/TestColumnIdName.java
@@ -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"));
diff --git a/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java b/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java
index 7e03b1b6f..37a9c2ea3 100644
--- a/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java
+++ b/src/test/java/org/tests/query/orderby/TestOrderByWithDistinct.java
@@ -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);
diff --git a/src/test/java/org/tests/query/other/TestWhereLikeWithSlash.java b/src/test/java/org/tests/query/other/TestWhereLikeWithSlash.java
index 328682e7a..71dfe5600 100644
--- a/src/test/java/org/tests/query/other/TestWhereLikeWithSlash.java
+++ b/src/test/java/org/tests/query/other/TestWhereLikeWithSlash.java
@@ -26,7 +26,7 @@ public class TestWhereLikeWithSlash extends BaseTestCase {
Query query1 = Ebean.find(EBasic.class).where().like("name", "slash\\mon%").query();
List 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());
diff --git a/src/test/java/org/tests/repository/TestBeanRepository.java b/src/test/java/org/tests/repository/TestBeanRepository.java
index 3649dccc5..6bb90a87d 100644
--- a/src/test/java/org/tests/repository/TestBeanRepository.java
+++ b/src/test/java/org/tests/repository/TestBeanRepository.java
@@ -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();
diff --git a/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java b/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java
index e9557baeb..605d9a3e6 100644
--- a/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java
+++ b/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java
@@ -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");
diff --git a/src/test/resources/ebean.properties b/src/test/resources/ebean.properties
index 45f5209aa..66205aa64 100644
--- a/src/test/resources/ebean.properties
+++ b/src/test/resources/ebean.properties
@@ -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
diff --git a/src/test/resources/extra-ddl.xml b/src/test/resources/extra-ddl.xml
index b01ed35b2..c8e1ed92a 100644
--- a/src/test/resources/extra-ddl.xml
+++ b/src/test/resources/extra-ddl.xml
@@ -5,7 +5,7 @@
drop view order_agg_vw if exists;
-
+
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
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index 50294ed9b..0e19a7c4b 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -77,7 +77,7 @@
-
+