Skip to content

Commit

Permalink
GRAILS-6641 fixed join table name generation when a table name is quo…
Browse files Browse the repository at this point in the history
…ted with backticks
  • Loading branch information
burtbeckwith committed Aug 24, 2010
1 parent af181a3 commit 478caff
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ private static void bindListSecondPass(GrailsDomainClassProperty property, Mappi
if (!isCompositeIdProperty(m,property.getOtherSide())) {
Backref prop = new Backref();
prop.setEntityName(property.getDomainClass().getFullName());
prop.setName(UNDERSCORE + property.getDomainClass().getShortName() + UNDERSCORE + property.getName() + "Backref");
prop.setName(UNDERSCORE + addUnderscore(property.getDomainClass().getShortName(), property.getName()) + "Backref");
prop.setSelectable(false);
prop.setUpdateable(false);
if (isManyToMany) {
Expand Down Expand Up @@ -594,8 +594,8 @@ private static void bindCollectionWithJoinTable(GrailsDomainClassProperty proper
}
else {
columnName = isEnum ? namingStrategy.propertyToColumnName(className) :
namingStrategy.propertyToColumnName(property.getName()) + UNDERSCORE +
namingStrategy.propertyToColumnName(className);
addUnderscore(namingStrategy.propertyToColumnName(property.getName()),
namingStrategy.propertyToColumnName(className));
}

if (isEnum) {
Expand Down Expand Up @@ -642,7 +642,15 @@ private static void bindCollectionWithJoinTable(GrailsDomainClassProperty proper
bindCollectionForPropertyConfig(collection, config);
}

private static Column getColumnForSimpleValue(SimpleValue element) {
private static String addUnderscore(String s1, String s2) {
return removeBackticks(s1) + UNDERSCORE + removeBackticks(s2);
}

private static String removeBackticks(String s) {
return s.startsWith("`") && s.endsWith("`") ? s.substring(1, s.length() - 1) : s;
}

private static Column getColumnForSimpleValue(SimpleValue element) {
return (Column)element.getColumnIterator().next();
}

Expand Down Expand Up @@ -803,7 +811,7 @@ private static void bindUnidirectionalOneToMany(GrailsDomainClassProperty proper
PersistentClass referenced = mappings.getClass(entityName);
Backref prop = new Backref();
prop.setEntityName(property.getDomainClass().getFullName());
prop.setName(UNDERSCORE + property.getDomainClass().getShortName() + UNDERSCORE + property.getName() + "Backref");
prop.setName(UNDERSCORE + addUnderscore(property.getDomainClass().getShortName(), property.getName()) + "Backref");
prop.setUpdateable(false);
prop.setInsertable(true);
prop.setCollectionRole(collection.getRole());
Expand Down Expand Up @@ -990,14 +998,14 @@ private static String calculateTableForMany(GrailsDomainClassProperty property)
if (hasJoinTableMapping) {
return jt.getName();
}
return left + UNDERSCORE + propertyColumnName;
return addUnderscore(left, propertyColumnName);
}

if (property.isBasicCollectionType()) {
if (hasJoinTableMapping) {
return jt.getName();
}
return left + UNDERSCORE + propertyColumnName;
return addUnderscore(left, propertyColumnName);
}

String right = getTableName(property.getReferencedDomainClass());
Expand All @@ -1007,9 +1015,9 @@ private static String calculateTableForMany(GrailsDomainClassProperty property)
return jt.getName();
}
if (property.isOwningSide()) {
return left + UNDERSCORE + propertyColumnName;
return addUnderscore(left, propertyColumnName);
}
return right + UNDERSCORE + namingStrategy.propertyToColumnName(property.getOtherSide().getName());
return addUnderscore(right, namingStrategy.propertyToColumnName(property.getOtherSide().getName()));
}

if (shouldCollectionBindWithJoinColumn(property)) {
Expand All @@ -1018,13 +1026,13 @@ private static String calculateTableForMany(GrailsDomainClassProperty property)
}
left = trimBackTigs(left);
right = trimBackTigs(right);
return left + UNDERSCORE + right;
return addUnderscore(left, right);
}

if (property.isOwningSide()) {
return left + UNDERSCORE + right;
return addUnderscore(left, right);
}
return right + UNDERSCORE + left;
return addUnderscore(right, left);
}

private static String trimBackTigs(String tableName) {
Expand Down Expand Up @@ -1961,8 +1969,8 @@ private static void bindCompositeIdentifierToManyToOne(GrailsDomainClassProperty

for (String propertyName : propertyNames) {
final ColumnConfig cc = new ColumnConfig();
cc.setName(namingStrategy.classToTableName(refDomainClass.getShortName()) + UNDERSCORE +
getDefaultColumnName(refDomainClass.getPropertyByName(propertyName)));
cc.setName(addUnderscore(namingStrategy.classToTableName(refDomainClass.getShortName()),
getDefaultColumnName(refDomainClass.getPropertyByName(propertyName))));
config.getColumns().add(cc);
}
bindSimpleValue(property, value, path, config);
Expand Down Expand Up @@ -2515,9 +2523,8 @@ else if (c != null && c.getColumn() != null) {

if (columnName == null) {
if (StringHelper.isNotEmpty(path)) {
columnName = namingStrategy.propertyToColumnName(path) +
UNDERSCORE +
getDefaultColumnName(grailsProp);
columnName = addUnderscore(namingStrategy.propertyToColumnName(path),
getDefaultColumnName(grailsProp));
} else {
columnName = getDefaultColumnName(grailsProp);
}
Expand All @@ -2544,7 +2551,7 @@ private static String getDefaultColumnName(GrailsDomainClassProperty property) {

if (!property.isBidirectional() && property.isOneToMany()) {
String prefix = namingStrategy.classToTableName(property.getDomainClass().getName());
return prefix + UNDERSCORE + columnName + FOREIGN_KEY_SUFFIX;
return addUnderscore(prefix, columnName) + FOREIGN_KEY_SUFFIX;
}

if (property.isInherited() && isBidirectionalManyToOne(property)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package org.codehaus.groovy.grails.orm.hibernate

import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder
import org.codehaus.groovy.grails.orm.hibernate.cfg.Mapping
import org.codehaus.groovy.grails.commons.GrailsDomainClass
import org.codehaus.groovy.grails.validation.ConstrainedProperty
import org.codehaus.groovy.grails.plugins.GrailsPlugin
import org.hibernate.dialect.HSQLDialect
import org.hibernate.type.YesNoType
import org.codehaus.groovy.grails.commons.ConfigurationHolder

/**
* @author Burt Beckwith
*/
class NamingTests extends AbstractGrailsHibernateTests {

protected void onSetUp() {
gcl.parseClass '''
import grails.persistence.*
@Entity
class NamingTests1 {
String name
}
@Entity
class NamingTests2 {
String name
static hasMany = [foos: NamingTests1]
}
@Entity
class NamingTests3 {
String name
static hasMany = [foos: NamingTests4]
}
@Entity
class NamingTests4 {
String name
static hasMany = [bars: NamingTests3]
static belongsTo = NamingTests3
}
@Entity
class NamingTests5 {
String name
static hasMany = [foos: NamingTests6]
static mapping = {
table '`NamingTest5`'
}
}
@Entity
class NamingTests6 {
String name
static hasMany = [bars: NamingTests5]
static belongsTo = NamingTests5
}
'''
}

void testNames() {

def hibernateConfig = appCtx.getBean('&sessionFactory').configuration
def sql = hibernateConfig.generateSchemaCreationScript(new HSQLDialect()).sort()
def tableNames = findTableNames(sql)

assertEquals 9, tableNames.size()
4.times { assertTrue "naming_tests${it + 1}}", tableNames.contains('naming_tests' + (it + 1)) }
assertTrue tableNames.contains('"NamingTest5"')
assertTrue tableNames.contains("naming_tests6")

assertTrue tableNames.contains('naming_tests2_naming_tests1')
assertTrue tableNames.contains('naming_tests3_foos')
assertTrue tableNames.contains('NamingTest5_foos')
}

private List<String> findTableNames(sql) {
def names = []
sql.each { String ddl ->
if (ddl.startsWith('create table ')) {
ddl -= 'create table '
names << ddl.substring(0, ddl.indexOf(' '))
}
}
names
}
}

0 comments on commit 478caff

Please sign in to comment.