diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java index 9b78e91f2c..4b57c9310e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java @@ -112,6 +112,7 @@ import org.hibernate.metamodel.spi.source.AggregatedCompositeIdentifierSource; import org.hibernate.metamodel.spi.source.AttributeSource; import org.hibernate.metamodel.spi.source.AttributeSourceContainer; import org.hibernate.metamodel.spi.source.BasicPluralAttributeElementSource; +import org.hibernate.metamodel.spi.source.BasicPluralAttributeIndexSource; import org.hibernate.metamodel.spi.source.ColumnSource; import org.hibernate.metamodel.spi.source.ComponentAttributeSource; import org.hibernate.metamodel.spi.source.CompositePluralAttributeElementSource; @@ -161,7 +162,6 @@ import org.hibernate.type.ComponentType; import org.hibernate.type.EntityType; import org.hibernate.type.ForeignKeyDirection; import org.hibernate.type.Type; - import org.jboss.logging.Logger; /** @@ -1428,10 +1428,14 @@ public class Binder { if ( attribute == null ) { attribute = attributeBindingContainer.getAttributeContainer().createList( attributeSource.getName() ); } - final int base = IndexedPluralAttributeSource.class.isInstance( attributeSource ) ? IndexedPluralAttributeSource.class - .cast( attributeSource ) - .getIndexSource() - .base() : 0; + int base = 0; + if ( IndexedPluralAttributeSource.class.isInstance( attributeSource ) ) { + IndexedPluralAttributeSource indexedAttributeSource + = ( IndexedPluralAttributeSource ) attributeSource; + base = BasicPluralAttributeIndexSource.class.isInstance( attributeSource ) + ? BasicPluralAttributeIndexSource.class.cast( + indexedAttributeSource.getIndexSource() ).base() : 0; + } return attributeBindingContainer.makeListAttributeBinding( attribute, pluralAttributeElementNature( attributeSource ), @@ -1450,10 +1454,14 @@ public class Binder { if ( attribute == null ) { attribute = attributeBindingContainer.getAttributeContainer().createArray( attributeSource.getName() ); } - final int base = IndexedPluralAttributeSource.class.isInstance( attributeSource ) ? IndexedPluralAttributeSource.class - .cast( attributeSource ) - .getIndexSource() - .base() : 0; + int base = 0; + if ( IndexedPluralAttributeSource.class.isInstance( attributeSource ) ) { + IndexedPluralAttributeSource indexedAttributeSource + = ( IndexedPluralAttributeSource ) attributeSource; + base = BasicPluralAttributeIndexSource.class.isInstance( attributeSource ) + ? BasicPluralAttributeIndexSource.class.cast( + indexedAttributeSource.getIndexSource() ).base() : 0; + } return attributeBindingContainer.makeArrayAttributeBinding( attribute, pluralAttributeElementNature( attributeSource ), @@ -1622,8 +1630,8 @@ public class Binder { final PluralAttributeIndexSource attributeSource, final String defaultIndexJavaTypeName) { IndexedPluralAttributeBinding indexedAttributeBinding = attributeBinding; - final BasicPluralAttributeIndexBinding indexBinding = - (BasicPluralAttributeIndexBinding) indexedAttributeBinding.getPluralAttributeIndexBinding(); + final PluralAttributeIndexBinding indexBinding = + indexedAttributeBinding.getPluralAttributeIndexBinding(); indexBinding.setIndexRelationalValue( bindValues( indexedAttributeBinding.getContainer(), diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/PluralAttributeIndexSourceImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/BasicPluralAttributeIndexSourceImpl.java similarity index 71% rename from hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/PluralAttributeIndexSourceImpl.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/BasicPluralAttributeIndexSourceImpl.java index 8e7cc3ea9b..d8e445e896 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/PluralAttributeIndexSourceImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/BasicPluralAttributeIndexSourceImpl.java @@ -4,29 +4,28 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.jboss.jandex.AnnotationInstance; - import org.hibernate.metamodel.internal.source.annotations.attribute.Column; import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute; import org.hibernate.metamodel.internal.source.annotations.util.HibernateDotNames; import org.hibernate.metamodel.internal.source.annotations.util.JPADotNames; import org.hibernate.metamodel.internal.source.annotations.util.JandexHelper; import org.hibernate.metamodel.spi.binding.PluralAttributeIndexBinding; +import org.hibernate.metamodel.spi.source.BasicPluralAttributeIndexSource; import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource; -import org.hibernate.metamodel.spi.source.PluralAttributeIndexSource; import org.hibernate.metamodel.spi.source.RelationalValueSource; +import org.jboss.jandex.AnnotationInstance; /** * @author Strong Liu + * @author Brett Meyer */ -public class PluralAttributeIndexSourceImpl implements PluralAttributeIndexSource { - private final PluralAssociationAttribute attribute; - private final IndexedPluralAttributeSourceImpl indexedPluralAttributeSource; +public class BasicPluralAttributeIndexSourceImpl implements BasicPluralAttributeIndexSource { +// private final PluralAssociationAttribute attribute; private final int base; private final List relationalValueSources = new ArrayList( 1 ); - public PluralAttributeIndexSourceImpl(IndexedPluralAttributeSourceImpl indexedPluralAttributeSource, PluralAssociationAttribute attribute) { - this.attribute = attribute; - this.indexedPluralAttributeSource = indexedPluralAttributeSource; + public BasicPluralAttributeIndexSourceImpl( + PluralAssociationAttribute attribute ) { +// this.attribute = attribute; AnnotationInstance columnAnnotation = JandexHelper.getSingleAnnotation( attribute.annotations(), HibernateDotNames.INDEX_COLUMN @@ -46,17 +45,7 @@ public class PluralAttributeIndexSourceImpl implements PluralAttributeIndexSourc @Override public PluralAttributeIndexBinding.Nature getNature() { - switch ( indexedPluralAttributeSource.getElementSource().getNature() ) { - case BASIC: - return PluralAttributeIndexBinding.Nature.BASIC; - case AGGREGATE: - return PluralAttributeIndexBinding.Nature.AGGREGATE; - case MANY_TO_ANY: - return PluralAttributeIndexBinding.Nature.MANY_TO_ANY; - case MANY_TO_MANY: - return PluralAttributeIndexBinding.Nature.MANY_TO_MANY; - } - return null; + return PluralAttributeIndexBinding.Nature.BASIC; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/CompositePluralAttributeIndexSourceImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/CompositePluralAttributeIndexSourceImpl.java new file mode 100644 index 0000000000..b23300d410 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/CompositePluralAttributeIndexSourceImpl.java @@ -0,0 +1,67 @@ +package org.hibernate.metamodel.internal.source.annotations; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute; +import org.hibernate.metamodel.spi.binding.PluralAttributeIndexBinding; +import org.hibernate.metamodel.spi.source.CompositePluralAttributeIndexSource; +import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource; +import org.hibernate.metamodel.spi.source.RelationalValueSource; + +/** + * @author Brett Meyer + */ +public class CompositePluralAttributeIndexSourceImpl implements CompositePluralAttributeIndexSource { + private final PluralAssociationAttribute attribute; + private final List relationalValueSources = new ArrayList( 1 ); + public CompositePluralAttributeIndexSourceImpl( + PluralAssociationAttribute attribute ) { + this.attribute = attribute; +// Column indexColumn = new Column( columnAnnotation ); +// relationalValueSources.add( new ColumnValuesSourceImpl( indexColumn ) ); + + } + + @Override + public PluralAttributeIndexBinding.Nature getNature() { + return PluralAttributeIndexBinding.Nature.AGGREGATE; + } + + @Override + public ExplicitHibernateTypeSource explicitHibernateTypeSource() { + return new ExplicitHibernateTypeSource() { + @Override + public String getName() { + return attribute.getReferencedKeyType(); + } + + @Override + public Map getParameters() { + // TODO? + return java.util.Collections.emptyMap(); + } + }; + } + + @Override + public List relationalValueSources() { + return relationalValueSources; + } + + @Override + public boolean areValuesIncludedInInsertByDefault() { + return false; + } + + @Override + public boolean areValuesIncludedInUpdateByDefault() { + return false; + } + + @Override + public boolean areValuesNullableByDefault() { + return false; + } +} diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/IndexedPluralAttributeSourceImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/IndexedPluralAttributeSourceImpl.java index d8ab0a9709..3b708e4f51 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/IndexedPluralAttributeSourceImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/IndexedPluralAttributeSourceImpl.java @@ -5,7 +5,6 @@ import java.util.EnumSet; import org.hibernate.metamodel.internal.source.annotations.attribute.MappedAttribute; import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute; import org.hibernate.metamodel.internal.source.annotations.entity.ConfiguredClass; -import org.hibernate.metamodel.internal.source.annotations.entity.EntityClass; import org.hibernate.metamodel.spi.source.IndexedPluralAttributeSource; import org.hibernate.metamodel.spi.source.MappingException; import org.hibernate.metamodel.spi.source.PluralAttributeIndexSource; @@ -31,7 +30,14 @@ public class IndexedPluralAttributeSourceImpl extends PluralAttributeSourceImpl attribute.getContext().getOrigin() ); } - this.indexSource = new PluralAttributeIndexSourceImpl( this, attribute ); + switch ( attribute.getPluralAttributeNature() ) { + case MAP: + // TODO: Need to support MANY_TO_MANY too + this.indexSource = new CompositePluralAttributeIndexSourceImpl( attribute ); + break; + default: + this.indexSource = new BasicPluralAttributeIndexSourceImpl( attribute ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/attribute/PluralAssociationAttribute.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/attribute/PluralAssociationAttribute.java index 1ac03d9ade..40756c36cf 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/attribute/PluralAssociationAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/attribute/PluralAssociationAttribute.java @@ -33,11 +33,6 @@ import java.util.SortedSet; import javax.persistence.FetchType; -import org.jboss.jandex.AnnotationInstance; -import org.jboss.jandex.ClassInfo; -import org.jboss.jandex.DotName; - -import org.hibernate.AnnotationException; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.LazyCollectionOption; @@ -53,12 +48,16 @@ import org.hibernate.metamodel.spi.binding.Caching; import org.hibernate.metamodel.spi.binding.CustomSQL; import org.hibernate.metamodel.spi.source.MappingException; import org.hibernate.metamodel.spi.source.PluralAttributeSource; +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.DotName; /** * Represents an collection (collection, list, set, map) association attribute. * * @author Hardy Ferentschik * @author Strong Liu + * @author Brett Meyer */ public class PluralAssociationAttribute extends AssociationAttribute { private final String whereClause; @@ -86,104 +85,15 @@ public class PluralAssociationAttribute extends AssociationAttribute { private LazyCollectionOption lazyOption; private final boolean isCollectionIdPresent; + + private final String referencedKeyType; - public static PluralAssociationAttribute createPluralAssociationAttribute( - ClassInfo entityClassInfo, - String name, - Class attributeType, - Class referencedAttributeType, - Nature attributeNature, - String accessType, - Map> annotations, - EntityBindingContext context) { - return new PluralAssociationAttribute( - entityClassInfo, - name, - attributeType, - referencedAttributeType, - attributeNature, - accessType, - annotations, - context - ); - } - - public PluralAttributeSource.Nature getPluralAttributeNature() { - return pluralAttributeNature; - } - - public String getWhereClause() { - return whereClause; - } - - public String getOrderBy() { - return orderBy; - } - - public String getInverseForeignKeyName() { - return inverseForeignKeyName; - } - public String getExplicitForeignKeyName(){ - return explicitForeignKeyName; - } - - public Caching getCaching() { - return caching; - } - - public String getCustomPersister() { - return customPersister; - } - - public String getCustomLoaderName() { - return customLoaderName; - } - - public CustomSQL getCustomInsert() { - return customInsert; - } - - public CustomSQL getCustomUpdate() { - return customUpdate; - } - - public CustomSQL getCustomDelete() { - return customDelete; - } - - public CustomSQL getCustomDeleteAll() { - return customDeleteAll; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); - sb.append( "PluralAssociationAttribute" ); - sb.append( "{name='" ).append( getName() ).append( '\'' ); - sb.append( '}' ); - return sb.toString(); - } - public OnDeleteAction getOnDeleteAction() { - return onDeleteAction; - } - - public String getComparatorName() { - return comparatorName; - } - - public boolean isSorted() { - return sorted; - } - - public boolean isIndexed() { - return isIndexed; - } - - private PluralAssociationAttribute( + public PluralAssociationAttribute( final ClassInfo entityClassInfo, final String name, final Class attributeType, + final Class referencedKeyType, final Class referencedAttributeType, final Nature associationType, final String accessType, @@ -260,12 +170,91 @@ public class PluralAssociationAttribute extends AssociationAttribute { getContext().getOrigin() ); } - this.isIndexed = orderColumnAnnotation != null || indexColumnAnnotation != null; + this.isIndexed = orderColumnAnnotation != null + || indexColumnAnnotation != null + || Map.class.isAssignableFrom( getAttributeType() ); this.pluralAttributeNature = resolvePluralAttributeNature(); + + this.referencedKeyType = determineReferencedKeyType( referencedKeyType ); validateMapping(); } + public PluralAttributeSource.Nature getPluralAttributeNature() { + return pluralAttributeNature; + } + + public String getWhereClause() { + return whereClause; + } + + public String getOrderBy() { + return orderBy; + } + + public String getInverseForeignKeyName() { + return inverseForeignKeyName; + } + public String getExplicitForeignKeyName(){ + return explicitForeignKeyName; + } + + public Caching getCaching() { + return caching; + } + + public String getCustomPersister() { + return customPersister; + } + + public String getCustomLoaderName() { + return customLoaderName; + } + + public CustomSQL getCustomInsert() { + return customInsert; + } + + public CustomSQL getCustomUpdate() { + return customUpdate; + } + + public CustomSQL getCustomDelete() { + return customDelete; + } + + public CustomSQL getCustomDeleteAll() { + return customDeleteAll; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append( "PluralAssociationAttribute" ); + sb.append( "{name='" ).append( getName() ).append( '\'' ); + sb.append( '}' ); + return sb.toString(); + } + public OnDeleteAction getOnDeleteAction() { + return onDeleteAction; + } + + public String getComparatorName() { + return comparatorName; + } + + public boolean isSorted() { + return sorted; + } + + public boolean isIndexed() { + return isIndexed; + } + + public String getReferencedKeyType() { + return referencedKeyType; + } + private void validateMapping() { checkSortedTypeIsSortable(); checkIfCollectionIdIsWronglyPlaced(); @@ -486,8 +475,27 @@ public class PluralAssociationAttribute extends AssociationAttribute { } return caching; } + + // TODO: For Maps only -- should this be here? + private String determineReferencedKeyType( + Class referencedKeyType ) { + String typeName = null; + // @MapKeyClass + AnnotationInstance mapKeyClassAnnotation + = JandexHelper.getSingleAnnotation( + annotations(), JPADotNames.MAP_KEY_CLASS ); + if ( mapKeyClassAnnotation != null ) { + typeName = mapKeyClassAnnotation.value().asClass().name().toString(); + } + else { + if ( referencedKeyType != null ) { + typeName = referencedKeyType.getName(); + } + } + return typeName; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/entity/ConfiguredClass.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/entity/ConfiguredClass.java index 8322e98360..7c3d2a9221 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/entity/ConfiguredClass.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/entity/ConfiguredClass.java @@ -533,10 +533,11 @@ public class ConfiguredClass { case ELEMENT_COLLECTION_BASIC: case ONE_TO_MANY: case MANY_TO_MANY: { - AssociationAttribute attribute = PluralAssociationAttribute.createPluralAssociationAttribute( + AssociationAttribute attribute = new PluralAssociationAttribute( classInfo, attributeName, resolvedMember.getType().getErasedType(), + resolveCollectionKeyType( resolvedMember ), referencedCollectionType, attributeNature, accessTypeString, @@ -712,6 +713,16 @@ public class ConfiguredClass { } } + private Class resolveCollectionKeyType(ResolvedMember resolvedMember) { + Class type = resolvedMember.getType().getErasedType(); + if ( Map.class.isAssignableFrom( type ) ) { + return resolvedMember.getType().getTypeParameters().get( 0 ).getErasedType(); + } + else { + return null; + } + } + /** * Populates the sets of transient field and method names. */ diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/ListAttributeIndexSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/ListAttributeIndexSource.java index 12d402b5a1..e0c68118c5 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/ListAttributeIndexSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/ListAttributeIndexSource.java @@ -32,14 +32,14 @@ import org.hibernate.jaxb.spi.hbm.JaxbColumnElement; import org.hibernate.jaxb.spi.hbm.JaxbIndexElement; import org.hibernate.jaxb.spi.hbm.JaxbListIndexElement; import org.hibernate.metamodel.spi.binding.PluralAttributeIndexBinding; +import org.hibernate.metamodel.spi.source.BasicPluralAttributeIndexSource; import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource; -import org.hibernate.metamodel.spi.source.PluralAttributeIndexSource; import org.hibernate.metamodel.spi.source.RelationalValueSource; /** * */ -public class ListAttributeIndexSource extends AbstractHbmSourceNode implements PluralAttributeIndexSource { +public class ListAttributeIndexSource extends AbstractHbmSourceNode implements BasicPluralAttributeIndexSource { private final List< RelationalValueSource > valueSources; private final ExplicitHibernateTypeSource typeSource; private final int base; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/MapAttributeIndexSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/MapAttributeIndexSource.java index 82b58a3ec5..185dd6adbf 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/MapAttributeIndexSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/MapAttributeIndexSource.java @@ -30,14 +30,15 @@ import org.hibernate.jaxb.spi.hbm.JaxbColumnElement; import org.hibernate.jaxb.spi.hbm.JaxbIndexElement; import org.hibernate.jaxb.spi.hbm.JaxbMapKeyElement; import org.hibernate.metamodel.spi.binding.PluralAttributeIndexBinding; +import org.hibernate.metamodel.spi.source.BasicPluralAttributeIndexSource; import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource; -import org.hibernate.metamodel.spi.source.PluralAttributeIndexSource; import org.hibernate.metamodel.spi.source.RelationalValueSource; /** * */ -public class MapAttributeIndexSource extends AbstractHbmSourceNode implements PluralAttributeIndexSource { +// TODO: This probably needs to support non-basic. +public class MapAttributeIndexSource extends AbstractHbmSourceNode implements BasicPluralAttributeIndexSource { private final PluralAttributeIndexBinding.Nature nature; private final List valueSources; private final ExplicitHibernateTypeSource typeSource; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/CompositePluralAttributeIndexBinding.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/CompositePluralAttributeIndexBinding.java new file mode 100644 index 0000000000..5185f39f97 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/CompositePluralAttributeIndexBinding.java @@ -0,0 +1,75 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2011, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.metamodel.spi.binding; + +import org.hibernate.metamodel.spi.domain.IndexedPluralAttribute; +import org.hibernate.metamodel.spi.domain.Type; +import org.hibernate.metamodel.spi.relational.Value; + +/** + * @author Brett Meyer + */ +public class CompositePluralAttributeIndexBinding implements PluralAttributeIndexBinding { + + private final IndexedPluralAttributeBinding pluralAttributeBinding; + private final Nature pluralAttributeIndexNature; + private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor(); + private Value value; + + public CompositePluralAttributeIndexBinding( + IndexedPluralAttributeBinding pluralAttributeBinding, + Nature pluralAttributeIndexNature) { + this.pluralAttributeBinding = pluralAttributeBinding; + this.pluralAttributeIndexNature = pluralAttributeIndexNature; + } + + @Override + public HibernateTypeDescriptor getHibernateTypeDescriptor() { + return hibernateTypeDescriptor; + } + + @Override + public Value getIndexRelationalValue() { + return value; + } + + @Override + public IndexedPluralAttributeBinding getIndexedPluralAttributeBinding() { + return pluralAttributeBinding; + } + + public void setIndexRelationalValue( Value value ) { + this.value = value; + } + + @Override + public Type getPluralAttributeIndexType() { + return ( (IndexedPluralAttribute) getIndexedPluralAttributeBinding().getAttribute() ).getIndexType(); + } + + @Override + public Nature getNature() { + return Nature.AGGREGATE; + } +} diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/MapBinding.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/MapBinding.java index 28c22c35db..7dabb48e9b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/MapBinding.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/MapBinding.java @@ -51,7 +51,15 @@ public class MapBinding extends AbstractPluralAttributeBinding implements Indexe includedInOptimisticLocking, metaAttributeContext ); - pluralAttributeIndexBinding = new BasicPluralAttributeIndexBinding( this, pluralAttributeIndexNature ); + switch ( pluralAttributeIndexNature ) { + // TODO: support MANY_TO_MANY & MANY_TO_ANY + case AGGREGATE: + pluralAttributeIndexBinding = new CompositePluralAttributeIndexBinding( this, pluralAttributeIndexNature ); + break; + default: + // TODO: Will this ever happen? + pluralAttributeIndexBinding = new BasicPluralAttributeIndexBinding( this, pluralAttributeIndexNature ); + } } /** diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeIndexBinding.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeIndexBinding.java index 136b5020d3..599d849c69 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeIndexBinding.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/PluralAttributeIndexBinding.java @@ -36,6 +36,9 @@ public interface PluralAttributeIndexBinding { Value getIndexRelationalValue(); + // TODO: Easier to add this here, but maybe it shouldn't be. + void setIndexRelationalValue(Value value); + HibernateTypeDescriptor getHibernateTypeDescriptor(); Type getPluralAttributeIndexType(); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/BasicPluralAttributeIndexSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/BasicPluralAttributeIndexSource.java new file mode 100644 index 0000000000..b4358ec4a4 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/BasicPluralAttributeIndexSource.java @@ -0,0 +1,28 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * JBoss, Home of Professional Open Source + * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors + * as indicated by the @authors tag. All rights reserved. + * See the copyright.txt in the distribution for a + * full listing of individual contributors. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * This program is distributed in the hope that it will be useful, but WITHOUT A + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * You should have received a copy of the GNU Lesser General Public License, + * v.2.1 along with this distribution; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ +package org.hibernate.metamodel.spi.source; + +/** + * @author Brett Meyer + */ +public interface BasicPluralAttributeIndexSource extends PluralAttributeIndexSource { + int base(); +} diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/CompositePluralAttributeIndexSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/CompositePluralAttributeIndexSource.java new file mode 100644 index 0000000000..8c5a99d34e --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/CompositePluralAttributeIndexSource.java @@ -0,0 +1,28 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * JBoss, Home of Professional Open Source + * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors + * as indicated by the @authors tag. All rights reserved. + * See the copyright.txt in the distribution for a + * full listing of individual contributors. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * This program is distributed in the hope that it will be useful, but WITHOUT A + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * You should have received a copy of the GNU Lesser General Public License, + * v.2.1 along with this distribution; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ +package org.hibernate.metamodel.spi.source; + +/** + * @author Brett Meyer + */ +public interface CompositePluralAttributeIndexSource extends PluralAttributeIndexSource { + +} diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/PluralAttributeIndexSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/PluralAttributeIndexSource.java index ce99eba611..c0b907d6d0 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/PluralAttributeIndexSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/PluralAttributeIndexSource.java @@ -26,10 +26,10 @@ package org.hibernate.metamodel.spi.source; import org.hibernate.metamodel.spi.binding.PluralAttributeIndexBinding; /** - * + * @author Brett Meyer */ public interface PluralAttributeIndexSource extends RelationalValueSourceContainer { - PluralAttributeIndexBinding.Nature getNature(); + // TODO: Should these be basic only? ExplicitHibernateTypeSource explicitHibernateTypeSource(); - int base(); + PluralAttributeIndexBinding.Nature getNature(); }