This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch merge-hibernate6 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 8cbd4aced63bfe1af0b57824815c39632a39006c Author: Walter Duque de Estrada <[email protected]> AuthorDate: Sat Jul 12 19:23:28 2025 -0500 refactor ColumnConfigToColumnBinder --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 44 ++++------ .../domainbinding/ColumnConfigToColumnBinder.java | 29 +++++++ .../ColumnConfigToColumnBinderSpec.groovy | 94 ++++++++++++++++++++++ 3 files changed, 137 insertions(+), 30 deletions(-) diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java index 53cc91f2e2..5cf0186fbe 100644 --- a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java @@ -35,6 +35,7 @@ import org.grails.datastore.mapping.reflect.EntityReflector; import org.grails.datastore.mapping.reflect.NameUtils; import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; import org.grails.orm.hibernate.cfg.domainbinding.ClassBinder; +import org.grails.orm.hibernate.cfg.domainbinding.ColumnConfigToColumnBinder; import org.grails.orm.hibernate.cfg.domainbinding.ConfigureDerivedPropertiesConsumer; import org.grails.orm.hibernate.cfg.domainbinding.NamingStrategyProvider; import org.grails.orm.hibernate.cfg.domainbinding.SimpleValueBinder; @@ -285,7 +286,10 @@ public class GrailsDomainBinder implements MetadataContributor { new SimpleValueBinder().bindSimpleValue(value, type, columnName1, true); PropertyConfig pc = getPropertyConfig(property); if (pc != null && pc.getIndexColumn() != null) { - bindColumnConfigToColumn(property, getColumnForSimpleValue(value), getSingleColumnConfig(pc.getIndexColumn())); + Column column = getColumnForSimpleValue(value); + ColumnConfig columnConfig = getSingleColumnConfig(pc.getIndexColumn()); + final PropertyConfig mappedForm = getPropertyConfig(property); + new ColumnConfigToColumnBinder().bindColumnConfigToColumn(column, columnConfig, mappedForm); } if (!value.isTypeSpecified()) { @@ -771,7 +775,10 @@ public class GrailsDomainBinder implements MetadataContributor { new SimpleValueBinder().bindSimpleValue(element, typeName, columnName, true); if (hasJoinColumnMapping) { - bindColumnConfigToColumn(property, getColumnForSimpleValue(element), config.getJoinTable().getColumn()); + Column column = getColumnForSimpleValue(element); + ColumnConfig columnConfig = config.getJoinTable().getColumn(); + final PropertyConfig mappedForm = getPropertyConfig(property); + new ColumnConfigToColumnBinder().bindColumnConfigToColumn(column, columnConfig, mappedForm); } } } else { @@ -813,31 +820,6 @@ public class GrailsDomainBinder implements MetadataContributor { return element.getColumns().iterator().next(); } - private void bindColumnConfigToColumn(PersistentProperty property, Column column, ColumnConfig columnConfig) { - final PropertyConfig mappedForm = getPropertyConfig(property); - boolean allowUnique = mappedForm != null && !mappedForm.isUniqueWithinGroup(); - - if (columnConfig == null) { - return; - } - - if (columnConfig.getLength() != -1) { - column.setLength(columnConfig.getLength()); - } - if (columnConfig.getPrecision() != -1) { - column.setPrecision(columnConfig.getPrecision()); - } - if (columnConfig.getScale() != -1) { - column.setScale(columnConfig.getScale()); - } - if (columnConfig.getSqlType() != null && !columnConfig.getSqlType().isEmpty()) { - column.setSqlType(columnConfig.getSqlType()); - } - if(allowUnique) { - column.setUnique(columnConfig.getUnique()); - } - } - private boolean hasJoinColumnMapping(PropertyConfig config) { return config != null && config.getJoinTable() != null && config.getJoinTable().getColumn() != null; } @@ -1712,7 +1694,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (cc.getName() != null) { c.setName(cc.getName()); } - bindColumnConfigToColumn(null, c, cc); + new ColumnConfigToColumnBinder().bindColumnConfigToColumn(c, cc, null); } } @@ -2128,8 +2110,10 @@ public class GrailsDomainBinder implements MetadataContributor { PropertyConfig propertyConfig = getPropertyConfig(property); if (propertyConfig != null && !propertyConfig.getColumns().isEmpty()) { - bindIndex(columnName, column, propertyConfig.getColumns().get(0), t); - bindColumnConfigToColumn(property, column, propertyConfig.getColumns().get(0)); + ColumnConfig columnConfig = propertyConfig.getColumns().get(0); + bindIndex(columnName, column, columnConfig, t); + final PropertyConfig mappedForm = getPropertyConfig(property); + new ColumnConfigToColumnBinder().bindColumnConfigToColumn(column, columnConfig, mappedForm); } } diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinder.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinder.java new file mode 100644 index 0000000000..795b31d740 --- /dev/null +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinder.java @@ -0,0 +1,29 @@ +package org.grails.orm.hibernate.cfg.domainbinding; + +import org.grails.orm.hibernate.cfg.ColumnConfig; +import org.grails.orm.hibernate.cfg.PropertyConfig; +import org.hibernate.mapping.Column; + +public class ColumnConfigToColumnBinder { + + public void bindColumnConfigToColumn(Column column, ColumnConfig columnConfig, PropertyConfig mappedForm) { + if (columnConfig == null) { + return; + } + if (columnConfig.getLength() != -1) { + column.setLength(columnConfig.getLength()); + } + if (columnConfig.getPrecision() != -1) { + column.setPrecision(columnConfig.getPrecision()); + } + if (columnConfig.getScale() != -1) { + column.setScale(columnConfig.getScale()); + } + if (columnConfig.getSqlType() != null && !columnConfig.getSqlType().isEmpty()) { + column.setSqlType(columnConfig.getSqlType()); + } + if(mappedForm != null && !mappedForm.isUniqueWithinGroup()) { + column.setUnique(columnConfig.getUnique()); + } + } +} diff --git a/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinderSpec.groovy b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinderSpec.groovy new file mode 100644 index 0000000000..84c12f7390 --- /dev/null +++ b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinderSpec.groovy @@ -0,0 +1,94 @@ +package org.grails.orm.hibernate.cfg.domainbinding + +import org.grails.orm.hibernate.cfg.ColumnConfig +import org.grails.orm.hibernate.cfg.PropertyConfig +import org.hibernate.mapping.Column +import spock.lang.Specification + +class ColumnConfigToColumnBinderSpec extends Specification { + + def binder = new ColumnConfigToColumnBinder() + def column = Mock(Column) + + def "should handle null column config"() { + when: + binder.bindColumnConfigToColumn(column, null, null) + + then: + 0 * column._ // verifies no interactions with column + } + + def "should bind column properties when values are valid"() { + given: + def columnConfig = new ColumnConfig() + columnConfig.length = 100 + columnConfig.precision = 10 + columnConfig.scale = 2 + columnConfig.sqlType = "VARCHAR" + columnConfig.unique = true + + when: + binder.bindColumnConfigToColumn(column, columnConfig, null) + + then: + 1 * column.setLength(100) + 1 * column.setPrecision(10) + 1 * column.setScale(2) + 1 * column.setSqlType("VARCHAR") + 0 * column.setUnique(_) + } + + def "should not bind properties when values are -1"() { + given: + def columnConfig = new ColumnConfig() + columnConfig.length = -1 + columnConfig.precision = -1 + columnConfig.scale = -1 + + when: + binder.bindColumnConfigToColumn(column, columnConfig, null) + + then: + 0 * column.setLength(_) + 0 * column.setPrecision(_) + 0 * column.setScale(_) + 0 * column.setUnique(_) + } + + def "column config honors uniqueness property"() { + given: + def columnConfig = new ColumnConfig() + columnConfig.length = -1 + columnConfig.precision = -1 + columnConfig.scale = -1 + PropertyConfig mappedForm = new PropertyConfig() + mappedForm.setUnique("name") + + when: + binder.bindColumnConfigToColumn(column, columnConfig, mappedForm) + + then: + 0 * column.setLength(_) + 0 * column.setPrecision(_) + 0 * column.setScale(_) + 0 * column.setUnique(_) + } + + def "column config honors uniqueness property"() { + given: + def columnConfig = new ColumnConfig() + columnConfig.length = -1 + columnConfig.precision = -1 + columnConfig.scale = -1 + PropertyConfig mappedForm = new PropertyConfig() + + when: + binder.bindColumnConfigToColumn(column, columnConfig, mappedForm) + + then: + 0 * column.setLength(_) + 0 * column.setPrecision(_) + 0 * column.setScale(_) + 1 * column.setUnique(_) + } +} \ No newline at end of file
