diff --git a/src/main/java/com/avaje/ebean/config/DbConstraintNaming.java b/src/main/java/com/avaje/ebean/config/DbConstraintNaming.java index a31c13ee7..2fab40df1 100644 --- a/src/main/java/com/avaje/ebean/config/DbConstraintNaming.java +++ b/src/main/java/com/avaje/ebean/config/DbConstraintNaming.java @@ -45,13 +45,29 @@ public class DbConstraintNaming { protected String ckPrefix = "ck_"; protected String ckSuffix = ""; - protected boolean lowerCaseNames = true; - protected MaxLength maxLength; - protected DbConstraintNormalise normalise = new DbConstraintNormalise(); + protected DbConstraintNormalise normalise; + /** + * Construct using default of lower case for both table and column names. + */ public DbConstraintNaming() { + this(true, true); + } + + /** + * Construct specifying if lower case should be used (for both table and column names). + */ + public DbConstraintNaming(boolean lowerCase) { + this(lowerCase, lowerCase); + } + + /** + * Construct specifying if lower case should be used for both table and column names. + */ + public DbConstraintNaming(boolean lowerCaseTableNames, boolean lowerCaseColumnNames) { + this.normalise = new DbConstraintNormalise(lowerCaseTableNames, lowerCaseColumnNames); } /** @@ -167,7 +183,6 @@ public class DbConstraintNaming { * quoted identifier characters (",',[,] etc). */ public String normaliseTable(String tableName) { - return normalise.normaliseTable(tableName); } @@ -175,18 +190,20 @@ public class DbConstraintNaming { * Normalise the column name by removing any quoted identifier characters (",',[,] etc). */ public String normaliseColumn(String tableName) { - return normalise.normaliseColumn(tableName); } /** - * Lower case the table or column name checking for quoted identifiers. + * Lower case the table name checking for quoted identifiers. */ - public String lowerName(String tableName) { - if (lowerCaseNames && normalise.notQuoted(tableName)) { - return tableName.toLowerCase(); - } - return tableName; + public String lowerTableName(String tableName) { + return normalise.lowerTableName(tableName); } + /** + * Lower case the column name checking for quoted identifiers. + */ + public String lowerColumnName(String name) { + return normalise.lowerColumnName(name); + } } diff --git a/src/main/java/com/avaje/ebean/config/DbConstraintNormalise.java b/src/main/java/com/avaje/ebean/config/DbConstraintNormalise.java index 90a9ff1ff..8779af15f 100644 --- a/src/main/java/com/avaje/ebean/config/DbConstraintNormalise.java +++ b/src/main/java/com/avaje/ebean/config/DbConstraintNormalise.java @@ -8,11 +8,17 @@ public class DbConstraintNormalise { protected final String[] quotedIdentifiers; - protected boolean lowerCaseTables = true; + protected final boolean lowerCaseTables; - protected boolean lowerCaseColumns = true; + protected final boolean lowerCaseColumns; public DbConstraintNormalise() { + this(true, true); + } + + public DbConstraintNormalise(boolean lowerCaseTables, boolean lowerCaseColumns) { + this.lowerCaseTables = lowerCaseTables; + this.lowerCaseColumns = lowerCaseColumns; this.quotedIdentifiers = new String[]{"\"", "'", "[", "]", "`"}; } @@ -46,6 +52,26 @@ public class DbConstraintNormalise { return columnName; } + /** + * Lower case the table name checking for quoted identifiers. + */ + public String lowerTableName(String tableName) { + if (lowerCaseTables && notQuoted(tableName)) { + return tableName.toLowerCase(); + } + return tableName; + } + + /** + * Lower case the column name checking for quoted identifiers. + */ + public String lowerColumnName(String name) { + if (lowerCaseColumns && notQuoted(name)) { + return name.toLowerCase(); + } + return name; + } + /** * Trim off the platform quoted identifier quotes like [ ' and ". */ diff --git a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java index 1354f5550..a793cd594 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java +++ b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/BaseTableDdl.java @@ -98,7 +98,7 @@ public class BaseTableDdl implements TableDdl { reset(); - String tableName = lowerName(createTable.getName()); + String tableName = lowerTableName(createTable.getName()); List columns = createTable.getColumn(); List pk = determinePrimaryKeyColumns(columns); @@ -248,7 +248,7 @@ public class BaseTableDdl implements TableDdl { protected void writeForeignKey(DdlWrite write, String fkName, String tableName, String[] columns, String refTable, String[] refColumns, String indexName) throws IOException { - tableName = lowerName(tableName); + tableName = lowerTableName(tableName); DdlBuffer fkeyBuffer = write.applyForeignKeys(); alterTableAddForeignKey(fkeyBuffer, fkName, tableName, columns, refTable, refColumns); @@ -282,7 +282,7 @@ public class BaseTableDdl implements TableDdl { if (i > 0) { buffer.append(","); } - buffer.append(lowerName(columns[i].trim())); + buffer.append(lowerColumnName(columns[i].trim())); } buffer.append(")"); } @@ -367,7 +367,7 @@ public class BaseTableDdl implements TableDdl { buffer.append(",").newLine(); buffer.append(" constraint ").append(uqName).append(" unique "); buffer.append("("); - buffer.append(lowerName(column.getName())); + buffer.append(lowerColumnName(column.getName())); buffer.append(")"); } @@ -401,14 +401,17 @@ public class BaseTableDdl implements TableDdl { } /** - * Convert the table or column name to lower case. - *

- * This is passed up to the platformDdl to override as desired. - * Generally lower case with underscore is a good cross database - * choice for column/table names. + * Convert the table lower case. */ - protected String lowerName(String name) { - return naming.lowerName(name); + protected String lowerTableName(String name) { + return naming.lowerTableName(name); + } + + /** + * Convert the column name to lower case. + */ + protected String lowerColumnName(String name) { + return naming.lowerColumnName(name); } /** diff --git a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java index 73cf0f8c5..f892531cd 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java +++ b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/DbTriggerBasedHistoryDdl.java @@ -176,7 +176,7 @@ public abstract class DbTriggerBasedHistoryDdl implements PlatformHistoryDdl { String platformType = platformDdl.convert(type, false); buffer.append(" "); - buffer.append(platformDdl.lowerName(columnName), 29); + buffer.append(platformDdl.lowerColumnName(columnName), 29); buffer.append(platformType); } diff --git a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java index d5d5520bc..ce272983f 100644 --- a/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java +++ b/src/main/java/com/avaje/ebean/dbmigration/ddlgeneration/platform/PlatformDdl.java @@ -136,7 +136,7 @@ public class PlatformDdl { String platformType = convert(column.getType(), identityColumn); buffer.append(" "); - buffer.append(lowerName(column.getName()), 29); + buffer.append(lowerColumnName(column.getName()), 29); buffer.append(platformType); if (isTrue(column.isNotnull()) || isTrue(column.isPrimaryKey())) { buffer.append(" not null"); @@ -254,7 +254,7 @@ public class PlatformDdl { appendColumns(columns, buffer); buffer .append(" references ") - .append(lowerName(refTable)); + .append(lowerTableName(refTable)); appendColumns(refColumns, buffer); appendWithSpace(foreignKeyRestrict, buffer); @@ -346,7 +346,7 @@ public class PlatformDdl { if (i > 0) { buffer.append(","); } - buffer.append(lowerName(columns[i].trim())); + buffer.append(lowerColumnName(columns[i].trim())); } buffer.append(")"); } @@ -358,16 +358,26 @@ public class PlatformDdl { } /** - * Convert the table or column name to lower case. + * Convert the table to lower case. *

- * This is passed up to the platformDdl to override as desired. - * Generally lower case with underscore is a good cross database + * Override as desired. Generally lower case with underscore is a good cross database * choice for column/table names. */ - protected String lowerName(String name) { - return naming.lowerName(name); + protected String lowerTableName(String name) { + return naming.lowerTableName(name); } + /** + * Convert the column name to lower case. + *

+ * Override as desired. Generally lower case with underscore is a good cross database + * choice for column/table names. + */ + protected String lowerColumnName(String name) { + return naming.lowerColumnName(name); + } + + /** * Null safe Boolean true test. */ diff --git a/src/test/java/com/avaje/ebean/config/DbConstraintNamingTest.java b/src/test/java/com/avaje/ebean/config/DbConstraintNamingTest.java index 3b2aae36a..88ecf927f 100644 --- a/src/test/java/com/avaje/ebean/config/DbConstraintNamingTest.java +++ b/src/test/java/com/avaje/ebean/config/DbConstraintNamingTest.java @@ -34,4 +34,40 @@ public class DbConstraintNamingTest { assertThat(naming.normaliseTable("foo_bar]")).isEqualTo("foo_bar"); } + @Test + public void testDefaultToLower() throws Exception { + assertThat(naming.normaliseTable("SCH.FOO_BAR]")).isEqualTo("foo_bar"); + + assertThat(naming.lowerTableName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); + assertThat(naming.lowerTableName("SCH.FOO_BAR")).isEqualTo("sch.foo_bar"); + assertThat(naming.lowerColumnName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); + assertThat(naming.lowerColumnName("SCH.FOO_BAR")).isEqualTo("sch.foo_bar"); + } + + @Test + public void testNoLowerCaseTable() throws Exception { + + DbConstraintNaming naming = new DbConstraintNaming(false, true); + assertThat(naming.normaliseTable("SCH.FOO_BAR]")).isEqualTo("FOO_BAR"); + assertThat(naming.normaliseColumn("SCH.FOO_BAR]")).isEqualTo("sch.foo_bar"); + assertThat(naming.lowerTableName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); + // table name not lowered + assertThat(naming.lowerTableName("SCH.FOO_BAR")).isEqualTo("SCH.FOO_BAR"); + assertThat(naming.lowerColumnName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); + assertThat(naming.lowerColumnName("SCH.FOO_BAR")).isEqualTo("sch.foo_bar"); + } + + @Test + public void testNoLowerCaseColumn() throws Exception { + + DbConstraintNaming naming = new DbConstraintNaming(true, false); + assertThat(naming.normaliseTable("SCH.FOO_BAR]")).isEqualTo("foo_bar"); + assertThat(naming.normaliseColumn("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR"); + assertThat(naming.lowerTableName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); + assertThat(naming.lowerTableName("SCH.FOO_BAR")).isEqualTo("sch.foo_bar"); + assertThat(naming.lowerColumnName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); + // column name not lowered + assertThat(naming.lowerColumnName("SCH.FOO_BAR")).isEqualTo("SCH.FOO_BAR"); + } + } \ No newline at end of file