From eda6350d8960bfb8f741c309ce89751d63a237cc Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 9 Mar 2018 17:40:34 +1300 Subject: [PATCH] #1344 - ENH: Add initial Cockroach DB support ... need to review JSON Adds in the DB ARRAY support (exactly the same as Postgres) --- .../config/dbplatform/DatabasePlatform.java | 7 +++++++ .../dbplatform/postgres/PostgresPlatform.java | 8 +++++++ .../ddlgeneration/platform/CockroachDdl.java | 8 +++---- .../ddlgeneration/platform/NativeDbArray.java | 20 ++++++++++++++++++ .../ddlgeneration/platform/PostgresDdl.java | 8 +------ .../server/type/DefaultTypeManager.java | 12 +++++------ .../platform/NativeDbArrayTest.java | 21 +++++++++++++++++++ src/test/resources/ebean.properties | 2 +- 8 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArray.java create mode 100644 src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArrayTest.java diff --git a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java index b1ddadc2c..ced70893c 100644 --- a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java @@ -381,6 +381,13 @@ public class DatabasePlatform { this.historySupport = historySupport; } + /** + * So no except for Postgres and CockroachDB. + */ + public boolean isNativeArrayType() { + return false; + } + /** * Return true if the DB supports native UUID. */ diff --git a/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java b/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java index 9a9b584fd..75a395568 100644 --- a/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java @@ -88,6 +88,14 @@ public class PostgresPlatform extends DatabasePlatform { return new DbPlatformType("geometry(" + type + "," + srid + ")"); } + /** + * So we can generate varchar[], int[], uuid[] column definitions and use the associated scalar types. + */ + @Override + public boolean isNativeArrayType() { + return true; + } + /** * Create a Postgres specific sequence IdGenerator. */ diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/CockroachDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/CockroachDdl.java index 303c887bd..f1fa243ef 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/CockroachDdl.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/CockroachDdl.java @@ -17,10 +17,10 @@ public class CockroachDdl extends PlatformDdl { this.columnSetNull = "drop not null"; } -// @Override -// protected String convertArrayType(String logicalArrayType) { -// TODO: Need to look at DB Array support ... -// } + @Override + protected String convertArrayType(String logicalArrayType) { + return NativeDbArray.logicalToNative(logicalArrayType); + } /** * Map bigint, integer and smallint all into serial. diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArray.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArray.java new file mode 100644 index 000000000..8b6723e29 --- /dev/null +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArray.java @@ -0,0 +1,20 @@ +package io.ebeaninternal.dbmigration.ddlgeneration.platform; + +/** + * Helper for logical type conversion. + */ +class NativeDbArray { + + /** + * Covert the 'logical' array type to a native one (for Postgres and Cockroach). + */ + static String logicalToNative(String logicalArrayType) { + int colonPos = logicalArrayType.lastIndexOf(']'); + if (colonPos == -1) { + return logicalArrayType; + } else { + // trim of the fallback varchar length + return logicalArrayType.substring(0, colonPos + 1); + } + } +} diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java index 774ce97d3..709e6f026 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java @@ -18,13 +18,7 @@ public class PostgresDdl extends PlatformDdl { @Override protected String convertArrayType(String logicalArrayType) { - int colonPos = logicalArrayType.lastIndexOf(']'); - if (colonPos == -1) { - return logicalArrayType; - } else { - // trim of the fallback varchar length - return logicalArrayType.substring(0, colonPos + 1); - } + return NativeDbArray.logicalToNative(logicalArrayType); } /** diff --git a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index e474ac482..ddd4c31f4 100644 --- a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -189,8 +189,8 @@ public final class DefaultTypeManager implements TypeManager { this.extraTypeFactory = new DefaultTypeFactory(config); this.postgres = isPostgres(config.getDatabasePlatform()); - this.arrayTypeListFactory = arrayTypeListFactory(postgres, config.getDatabasePlatform()); - this.arrayTypeSetFactory = arrayTypeSetFactory(postgres, config.getDatabasePlatform()); + this.arrayTypeListFactory = arrayTypeListFactory(config.getDatabasePlatform()); + this.arrayTypeSetFactory = arrayTypeSetFactory(config.getDatabasePlatform()); this.offlineMigrationGeneration = DbOffline.isGenerateMigration(); @@ -211,8 +211,8 @@ public final class DefaultTypeManager implements TypeManager { /** * Return the factory to use to support DB ARRAY types. */ - private PlatformArrayTypeFactory arrayTypeListFactory(boolean postgres, DatabasePlatform databasePlatform) { - if (postgres) { + private PlatformArrayTypeFactory arrayTypeListFactory(DatabasePlatform databasePlatform) { + if (databasePlatform.isNativeArrayType()) { return ScalarTypeArrayList.factory(); } else if (databasePlatform.isPlatform(Platform.H2)) { return ScalarTypeArrayListH2.factory(); @@ -224,8 +224,8 @@ public final class DefaultTypeManager implements TypeManager { /** * Return the factory to use to support DB ARRAY types. */ - private PlatformArrayTypeFactory arrayTypeSetFactory(boolean postgres, DatabasePlatform databasePlatform) { - if (postgres) { + private PlatformArrayTypeFactory arrayTypeSetFactory(DatabasePlatform databasePlatform) { + if (databasePlatform.isNativeArrayType()) { return ScalarTypeArraySet.factory(); } else if (databasePlatform.isPlatform(Platform.H2)) { return ScalarTypeArraySetH2.factory(); diff --git a/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArrayTest.java b/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArrayTest.java new file mode 100644 index 000000000..7d37363e4 --- /dev/null +++ b/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/NativeDbArrayTest.java @@ -0,0 +1,21 @@ +package io.ebeaninternal.dbmigration.ddlgeneration.platform; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class NativeDbArrayTest { + + @Test + public void logicalToNative() { + + assertThat(NativeDbArray.logicalToNative("uuid[]")).isEqualTo("uuid[]"); + assertThat(NativeDbArray.logicalToNative("varchar[]")).isEqualTo("varchar[]"); + } + + @Test + public void logicalToNative_withFallbackDefined() { + + assertThat(NativeDbArray.logicalToNative("uuid[]:(1000)")).isEqualTo("uuid[]"); + } +} diff --git a/src/test/resources/ebean.properties b/src/test/resources/ebean.properties index 3b048c4c2..b33a6e823 100644 --- a/src/test/resources/ebean.properties +++ b/src/test/resources/ebean.properties @@ -19,7 +19,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=pg ebean.autoReadOnlyDataSource=true