From: <fab...@us...> - 2011-04-05 17:26:21
|
Revision: 5611 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5611&view=rev Author: fabiomaulo Date: 2011-04-05 17:26:13 +0000 (Tue, 05 Apr 2011) Log Message: ----------- ClassCustomizer with Joins Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -29,6 +29,8 @@ private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>(); private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>(); private readonly Dictionary<System.Type, Action<System.Type>> delayedEntityRegistrations = new Dictionary<System.Type, Action<System.Type>>(); + private readonly Dictionary<System.Type, HashSet<string>> typeSplitGroups = new Dictionary<System.Type, HashSet<string>>(); + private readonly Dictionary<MemberInfo, string> memberSplitGroup = new Dictionary<MemberInfo, string>(); #region IModelExplicitDeclarationsHolder Members @@ -132,6 +134,27 @@ get { return properties; } } + public IEnumerable<string> GetSplitGroupsFor(System.Type type) + { + HashSet<string> splitsGroupsIds; + if (typeSplitGroups.TryGetValue(type, out splitsGroupsIds)) + { + return splitsGroupsIds; + } + return Enumerable.Empty<string>(); + } + + public string GetSplitGroupFor(MemberInfo member) + { + var memberKey = member.GetMemberFromDeclaringType(); + string splitGroup; + if (memberSplitGroup.TryGetValue(memberKey, out splitGroup)) + { + return splitGroup; + } + return null; + } + public void AddAsRootEntity(System.Type type) { if (IsComponent(type)) @@ -343,6 +366,32 @@ properties.Add(member); } + public void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member) + { + /* Note: if the user "jump/exclude" a class and then map the property in two subclasses the usage of GetMemberFromDeclaringType() may cause a problem + for a legal usage... we will see when the case happen */ + + var memberKey = member.GetMemberFromDeclaringType(); + string splitGroup; + if (!memberSplitGroup.TryGetValue(memberKey, out splitGroup)) + { + AddTypeSplits(propertyContainer, splitGroupId); + memberSplitGroup[memberKey] = splitGroupId; + } + } + + private void AddTypeSplits(System.Type propertyContainer, string splitGroupId) + { + HashSet<string> splitsGroupsIds; + typeSplitGroups.TryGetValue(propertyContainer, out splitsGroupsIds); + if(splitsGroupsIds == null) + { + splitsGroupsIds = new HashSet<string>(); + typeSplitGroups[propertyContainer] = splitsGroupsIds; + } + splitsGroupsIds.Add(splitGroupId); + } + #endregion #region Implementation of IModelInspector @@ -370,7 +419,7 @@ public bool IsTablePerClassSplit(System.Type type, object splitGroupId, MemberInfo member) { - return false; + return Equals(splitGroupId, GetSplitGroupFor(member)); } public bool IsTablePerClassHierarchy(System.Type type) @@ -518,7 +567,7 @@ public IEnumerable<string> GetPropertiesSplits(System.Type type) { - return null; + return GetSplitGroupsFor(type); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -135,6 +136,16 @@ get { return properties; } } + public IEnumerable<string> GetSplitGroupsFor(System.Type type) + { + return Enumerable.Empty<string>(); + } + + public string GetSplitGroupFor(MemberInfo member) + { + return null; + } + public void AddAsRootEntity(System.Type type) {} public void AddAsComponent(System.Type type) {} @@ -176,6 +187,7 @@ public void AddAsMap(MemberInfo member) {} public void AddAsProperty(MemberInfo member) {} + public void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member) {} #endregion } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinMapper.cs =================================================================== (Binary files differ) Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -28,6 +28,8 @@ IEnumerable<MemberInfo> Arrays { get; } IEnumerable<MemberInfo> Dictionaries { get; } IEnumerable<MemberInfo> Properties { get; } + IEnumerable<string> GetSplitGroupsFor(System.Type type); + string GetSplitGroupFor(MemberInfo member); void AddAsRootEntity(System.Type type); void AddAsComponent(System.Type type); @@ -52,5 +54,6 @@ void AddAsArray(MemberInfo member); void AddAsMap(MemberInfo member); void AddAsProperty(MemberInfo member); + void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -50,7 +50,7 @@ #endregion - private Dictionary<string, IJoinMapper> JoinMappers + public Dictionary<string, IJoinMapper> JoinMappers { get { return joinMappers ?? (joinMappers = new Dictionary<string, IJoinMapper>()); } } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -53,8 +53,8 @@ private readonly Dictionary<PropertyPath, List<Action<IPropertyMapper>>> propertyCustomizers = new Dictionary<PropertyPath, List<Action<IPropertyMapper>>>(); - private readonly Dictionary<System.Type, List<Action<IClassAttributesMapper>>> rootClassCustomizers = - new Dictionary<System.Type, List<Action<IClassAttributesMapper>>>(); + private readonly Dictionary<System.Type, List<Action<IClassMapper>>> rootClassCustomizers = + new Dictionary<System.Type, List<Action<IClassMapper>>>(); private readonly Dictionary<PropertyPath, List<Action<ISetPropertiesMapper>>> setCustomizers = new Dictionary<PropertyPath, List<Action<ISetPropertiesMapper>>>(); @@ -65,9 +65,12 @@ private readonly Dictionary<System.Type, List<Action<IUnionSubclassAttributesMapper>>> unionClassCustomizers = new Dictionary<System.Type, List<Action<IUnionSubclassAttributesMapper>>>(); + private readonly Dictionary<System.Type, List<Action<IJoinAttributesMapper>>> joinCustomizers = + new Dictionary<System.Type, List<Action<IJoinAttributesMapper>>>(); + #region ICustomizersHolder Members - public void AddCustomizer(System.Type type, Action<IClassAttributesMapper> classCustomizer) + public void AddCustomizer(System.Type type, Action<IClassMapper> classCustomizer) { AddCustomizer(rootClassCustomizers, type, classCustomizer); } @@ -92,6 +95,11 @@ AddCustomizer(componentClassCustomizers, type, classCustomizer); } + public void AddCustomizer(System.Type type, Action<IJoinAttributesMapper> joinCustomizer) + { + AddCustomizer(joinCustomizers, type, joinCustomizer); + } + public void AddCustomizer(PropertyPath member, Action<IPropertyMapper> propertyCustomizer) { AddCustomizer(propertyCustomizers, member, propertyCustomizer); @@ -167,7 +175,7 @@ AddCustomizer(mapKeyElementCustomizers, member, mapKeyElementCustomizer); } - public void InvokeCustomizers(System.Type type, IClassAttributesMapper mapper) + public void InvokeCustomizers(System.Type type, IClassMapper mapper) { InvokeCustomizers(rootClassCustomizers, type, mapper); } @@ -192,6 +200,11 @@ InvokeCustomizers(componentClassCustomizers, type, mapper); } + public void InvokeCustomizers(System.Type type, IJoinAttributesMapper mapper) + { + InvokeCustomizers(joinCustomizers, type, mapper); + } + public void InvokeCustomizers(PropertyPath member, IPropertyMapper mapper) { InvokeCustomizers(propertyCustomizers, member, mapper); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; using NHibernate.Persister.Entity; @@ -7,6 +8,8 @@ { public class ClassCustomizer<TEntity> : PropertyContainerCustomizer<TEntity>, IClassMapper<TEntity> where TEntity : class { + private Dictionary<string, IJoinMapper<TEntity>> joinCustomizers; + public ClassCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder) : base(explicitDeclarationsHolder, customizersHolder, null) { @@ -17,6 +20,11 @@ explicitDeclarationsHolder.AddAsRootEntity(typeof (TEntity)); } + private Dictionary<string, IJoinMapper<TEntity>> JoinCustomizers + { + get { return joinCustomizers ?? (joinCustomizers = new Dictionary<string, IJoinMapper<TEntity>>()); } + } + #region Implementation of IClassAttributesMapper<TEntity> public void Id(Action<IIdMapper> idMapper) @@ -39,27 +47,27 @@ public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Discriminator(discriminatorMapping)); + CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassMapper m) => m.Discriminator(discriminatorMapping)); } public void DiscriminatorValue(object value) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.DiscriminatorValue(value)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.DiscriminatorValue(value)); } public void Table(string tableName) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Table(tableName)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Table(tableName)); } public void Catalog(string catalogName) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Catalog(catalogName)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Catalog(catalogName)); } public void Schema(string schemaName) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Schema(schemaName)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Schema(schemaName)); } #endregion @@ -68,20 +76,20 @@ public void Mutable(bool isMutable) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Mutable(isMutable)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Mutable(isMutable)); } public void Version<TProperty>(Expression<Func<TEntity, TProperty>> versionProperty, Action<IVersionMapper> versionMapping) { MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(versionProperty); ExplicitDeclarationsHolder.AddAsVersionProperty(member); - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Version(member, versionMapping)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Version(member, versionMapping)); } public void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping, Action<INaturalIdAttributesMapper> naturalIdMapping) { naturalIdPropertiesMapping(new NaturalIdCustomizer<TEntity>(ExplicitDeclarationsHolder, CustomizersHolder)); - CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassAttributesMapper m) => m.NaturalId(nidm => naturalIdMapping(nidm))); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.NaturalId(nidm => naturalIdMapping(nidm))); } public void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping) @@ -91,67 +99,76 @@ public void Cache(Action<ICacheMapper> cacheMapping) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Cache(cacheMapping)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Cache(cacheMapping)); } public void Filter(string filterName, Action<IFilterMapper> filterMapping) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Filter(filterName, filterMapping)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Filter(filterName, filterMapping)); } public void Where(string whereClause) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Where(whereClause)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Where(whereClause)); } public void SchemaAction(SchemaAction action) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SchemaAction(action)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SchemaAction(action)); } public void Join(string splitGroupId, Action<IJoinMapper<TEntity>> splittedMapping) { - throw new NotImplementedException(); + // add the customizer only to create the JoinMapper instance + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Join(splitGroupId, j => { })); + + IJoinMapper<TEntity> joinCustomizer; + if (!JoinCustomizers.TryGetValue(splitGroupId, out joinCustomizer)) + { + joinCustomizer = new JoinCustomizer<TEntity>(splitGroupId, ExplicitDeclarationsHolder, CustomizersHolder); + JoinCustomizers.Add(splitGroupId, joinCustomizer); + } + splittedMapping(joinCustomizer); } public void EntityName(string value) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.EntityName(value)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.EntityName(value)); } public void Proxy(System.Type proxy) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Proxy(proxy)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Proxy(proxy)); } public void Lazy(bool value) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Lazy(value)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Lazy(value)); } public void DynamicUpdate(bool value) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.DynamicUpdate(value)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.DynamicUpdate(value)); } public void DynamicInsert(bool value) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.DynamicInsert(value)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.DynamicInsert(value)); } public void BatchSize(int value) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.BatchSize(value)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.BatchSize(value)); } public void SelectBeforeUpdate(bool value) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SelectBeforeUpdate(value)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SelectBeforeUpdate(value)); } public void Persister<T>() where T : IEntityPersister { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Persister<T>()); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Persister<T>()); } #endregion @@ -160,27 +177,27 @@ public void Loader(string namedQueryReference) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Loader(namedQueryReference)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Loader(namedQueryReference)); } public void SqlInsert(string sql) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SqlInsert(sql)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SqlInsert(sql)); } public void SqlUpdate(string sql) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SqlUpdate(sql)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SqlUpdate(sql)); } public void SqlDelete(string sql) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SqlDelete(sql)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SqlDelete(sql)); } public void Subselect(string sql) { - CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Subselect(sql)); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Subselect(sql)); } #endregion Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl +{ + public class JoinCustomizer<TEntity> : PropertyContainerCustomizer<TEntity>, IJoinMapper<TEntity> + where TEntity : class + { + private readonly string splitGroupId; + private readonly IKeyMapper<TEntity> keyMapper; + + public JoinCustomizer(string splitGroupId, IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder) + : base(explicitDeclarationsHolder, customizersHolder, null) + { + if (explicitDeclarationsHolder == null) + { + throw new ArgumentNullException("explicitDeclarationsHolder"); + } + this.splitGroupId = splitGroupId; + keyMapper = new JoinKeyCustomizer<TEntity>(customizersHolder); + } + + public void Loader(string namedQueryReference) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Loader(namedQueryReference)); + } + + public void SqlInsert(string sql) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.SqlInsert(sql)); + } + + public void SqlUpdate(string sql) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.SqlUpdate(sql)); + } + + public void SqlDelete(string sql) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.SqlDelete(sql)); + } + + public void Subselect(string sql) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Subselect(sql)); + } + + public void Table(string tableName) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Table(tableName)); + } + + public void Catalog(string catalogName) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Catalog(catalogName)); + } + + public void Schema(string schemaName) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Schema(schemaName)); + } + + public void Key(Action<IKeyMapper<TEntity>> keyMapping) + { + keyMapping(keyMapper); + } + + public void Inverse(bool value) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Inverse(value)); + } + + public void Optional(bool isOptional) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Optional(isOptional)); + } + + public void Fetch(FetchKind fetchMode) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Fetch(fetchMode)); + } + + public override void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Set(property, collectionMapping, mapping); + } + + public override void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Bag(property, collectionMapping, mapping); + } + + public override void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.List(property, collectionMapping, mapping); + } + + public override void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Map(property, collectionMapping, keyMapping, mapping); + } + + public override void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Map(property, collectionMapping, mapping); + } + + public override void Property<TProperty>(Expression<Func<TEntity, TProperty>> property) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Property(property); + } + + public override void Property<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IPropertyMapper> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Property(property, mapping); + } + + public override void Property(FieldInfo member, Action<IPropertyMapper> mapping) + { + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Property(member, mapping); + } + + public override void Component<TComponent>(Expression<Func<TEntity, TComponent>> property, Action<IComponentMapper<TComponent>> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Component(property, mapping); + } + + public override void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IManyToOneMapper> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.ManyToOne(property, mapping); + } + + public override void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.ManyToOne(property); + } + + public override void Any<TProperty>(Expression<Func<TEntity, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member); + base.Any(property, idTypeOfMetaType, mapping); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -0,0 +1,57 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl +{ + public class JoinKeyCustomizer<TEntity> : IKeyMapper<TEntity> + where TEntity : class + { + public JoinKeyCustomizer(ICustomizersHolder customizersHolder) + { + CustomizersHolder = customizersHolder; + } + + public ICustomizersHolder CustomizersHolder { get; private set; } + + #region Implementation of IKeyMapper<TEntity> + + public void Column(Action<IColumnMapper> columnMapper) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Column(columnMapper))); + } + + public void Columns(params Action<IColumnMapper>[] columnMapper) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Columns(columnMapper))); + } + + public void Column(string columnName) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Column(columnName))); + } + + public void OnDelete(OnDeleteAction deleteAction) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.OnDelete(deleteAction))); + } + + public void PropertyRef<TProperty>(Expression<Func<TEntity, TProperty>> propertyGetter) + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(propertyGetter); + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.PropertyRef(member))); + } + + public void Update(bool consideredInUpdateQuery) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Update(consideredInUpdateQuery))); + } + + public void ForeignKey(string foreingKeyName) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.ForeignKey(foreingKeyName))); + } + + #endregion + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -27,7 +27,7 @@ get { return explicitDeclarationsHolder; } } - public void Property<TProperty>(Expression<Func<TEntity, TProperty>> property) + public virtual void Property<TProperty>(Expression<Func<TEntity, TProperty>> property) { Property(property, x => { }); } @@ -97,7 +97,7 @@ explicitDeclarationsHolder.AddAsAny(memberOf); } - public void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, + public virtual void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { @@ -110,7 +110,7 @@ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); } - public void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, + public virtual void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { @@ -123,7 +123,7 @@ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, memberOf), CustomizersHolder)); } - public void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, + public virtual void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { @@ -136,7 +136,7 @@ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder)); } - public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, + public virtual void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping) @@ -154,7 +154,7 @@ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder)); } - public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, + public virtual void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping) { Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -4,11 +4,12 @@ { public interface ICustomizersHolder { - void AddCustomizer(System.Type type, Action<IClassAttributesMapper> classCustomizer); + void AddCustomizer(System.Type type, Action<IClassMapper> classCustomizer); void AddCustomizer(System.Type type, Action<ISubclassAttributesMapper> classCustomizer); void AddCustomizer(System.Type type, Action<IJoinedSubclassAttributesMapper> classCustomizer); void AddCustomizer(System.Type type, Action<IUnionSubclassAttributesMapper> classCustomizer); void AddCustomizer(System.Type type, Action<IComponentAttributesMapper> classCustomizer); + void AddCustomizer(System.Type type, Action<IJoinAttributesMapper> classCustomizer); void AddCustomizer(PropertyPath member, Action<IPropertyMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IManyToOneMapper> propertyCustomizer); @@ -22,11 +23,12 @@ void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer); - void InvokeCustomizers(System.Type type, IClassAttributesMapper mapper); + void InvokeCustomizers(System.Type type, IClassMapper mapper); void InvokeCustomizers(System.Type type, ISubclassAttributesMapper mapper); void InvokeCustomizers(System.Type type, IJoinedSubclassAttributesMapper mapper); void InvokeCustomizers(System.Type type, IUnionSubclassAttributesMapper mapper); void InvokeCustomizers(System.Type type, IComponentAttributesMapper mapper); + void InvokeCustomizers(System.Type type, IJoinAttributesMapper mapper); void InvokeCustomizers(PropertyPath member, IPropertyMapper mapper); void InvokeCustomizers(PropertyPath member, IManyToOneMapper mapper); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -685,7 +685,6 @@ InvokeBeforeMapClass(type, classMapper); InvokeClassCustomizers(type, classMapper); - InvokeAfterMapClass(type, classMapper); MemberInfo[] naturalIdPropeties = persistentProperties.Where(mi => modelInspector.IsMemberOfNaturalId(mi)).ToArray(); if (naturalIdPropeties.Length > 0) @@ -698,18 +697,87 @@ } }); } + var splitGroups = modelInspector.GetPropertiesSplits(type); + var propertiesToMap = persistentProperties.Where(mi => !modelInspector.IsVersion(mi)).Except(naturalIdPropeties).ToList(); + var propertiesInSplits = new HashSet<MemberInfo>(); + foreach (var splitGroup in splitGroups) + { + var groupId= splitGroup; + var propertiesOfTheGroup = propertiesToMap.Where(p => modelInspector.IsTablePerClassSplit(type, groupId, p)).ToList(); + IJoinMapper joinMapper; + if (propertiesOfTheGroup.Count > 0 && classMapper.JoinMappers.TryGetValue(groupId, out joinMapper)) + { + MapProperties(type, propertiesOfTheGroup, joinMapper); + propertiesInSplits.UnionWith(propertiesOfTheGroup); + } + } - MapProperties(type, persistentProperties.Where(mi => !modelInspector.IsVersion(mi)).Except(naturalIdPropeties), classMapper); + MapProperties(type, propertiesToMap.Except(propertiesInSplits), classMapper); + InvokeAfterMapClass(type, classMapper); } - private void InvokeClassCustomizers(System.Type type, IClassAttributesMapper classMapper) + private void MapProperties(System.Type propertiesContainerType, IEnumerable<MemberInfo> propertiesToMap, IJoinMapper propertiesContainer) { + foreach (var property in propertiesToMap) + { + MemberInfo member = property; + System.Type propertyType = property.GetPropertyOrFieldType(); + var memberPath = new PropertyPath(null, member); + if (modelInspector.IsProperty(member)) + { + MapProperty(member, memberPath, propertiesContainer); + } + else if (modelInspector.IsAny(member)) + { + MapAny(member, memberPath, propertiesContainer); + } + else if (modelInspector.IsManyToOne(property)) + { + MapManyToOne(member, memberPath, propertiesContainer); + } + else if (modelInspector.IsSet(property)) + { + MapSet(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); + } + else if (modelInspector.IsDictionary(property)) + { + MapDictionary(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); + } + else if (modelInspector.IsArray(property)) + { + throw new NotSupportedException(); + } + else if (modelInspector.IsList(property)) + { + MapList(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); + } + else if (modelInspector.IsBag(property)) + { + MapBag(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); + } + else if (modelInspector.IsComponent(propertyType)) + { + MapComponent(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); + } + else + { + MapProperty(member, memberPath, propertiesContainer); + } + } + } + + private void InvokeClassCustomizers(System.Type type, ClassMapper classMapper) + { InvokeAncestorsCustomizers(type.GetInterfaces(), classMapper); InvokeAncestorsCustomizers(type.GetHierarchyFromBase(), classMapper); customizerHolder.InvokeCustomizers(type, classMapper); + foreach (var joinMapper in classMapper.JoinMappers.Values) + { + customizerHolder.InvokeCustomizers(type, joinMapper); + } } - private void InvokeAncestorsCustomizers(IEnumerable<System.Type> typeAncestors, IClassAttributesMapper classMapper) + private void InvokeAncestorsCustomizers(IEnumerable<System.Type> typeAncestors, IClassMapper classMapper) { // only apply the polymorphic mapping for no entities: // this is to avoid a possible caos in entity-subclassing: @@ -924,7 +992,7 @@ }); } - private void MapBag(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer, + private void MapBag(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer, System.Type propertiesContainerType) { System.Type collectionElementType = GetCollectionElementTypeOrThrow(propertiesContainerType, member, propertyType); @@ -938,7 +1006,7 @@ }, cert.Map); } - private void MapList(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer, + private void MapList(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer, System.Type propertiesContainerType) { System.Type collectionElementType = GetCollectionElementTypeOrThrow(propertiesContainerType, member, propertyType); @@ -952,7 +1020,7 @@ }, cert.Map); } - private void MapDictionary(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer, + private void MapDictionary(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer, System.Type propertiesContainerType) { System.Type dictionaryKeyType = propertyType.DetermineDictionaryKeyType(); @@ -975,7 +1043,7 @@ }, mkrm.Map, cert.Map); } - private void MapSet(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer, + private void MapSet(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer, System.Type propertiesContainerType) { System.Type collectionElementType = GetCollectionElementTypeOrThrow(propertiesContainerType, member, propertyType); @@ -989,7 +1057,7 @@ }, cert.Map); } - private void MapOneToOne(MemberInfo member, PropertyPath propertyPath, IPropertyContainerMapper propertiesContainer) + private void MapOneToOne(MemberInfo member, PropertyPath propertyPath, IPlainPropertyContainerMapper propertiesContainer) { propertiesContainer.OneToOne(member, oneToOneMapper => { @@ -1092,7 +1160,7 @@ x.Parent(parentReferenceProperty, componentParentMapper => { -/* TODO */ + /* TODO */ } ); } @@ -1147,7 +1215,7 @@ { x.Parent(parentReferenceProperty, componentParentMapper => { -/* TODO */ + /* TODO */ }); } customizersHolder.InvokeCustomizers(componentPropertyType, x); Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-05 17:26:13 UTC (rev 5611) @@ -345,8 +345,10 @@ <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\CollectionPropertiesCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentElementCustomizer.cs" /> + <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinedSubclassCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinedSubclassKeyCustomizer.cs" /> + <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinKeyCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ListPropertiesCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ManyToManyCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\MapKeyComponentCustomizer.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -0,0 +1,47 @@ +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExplicitlyDeclaredModelTests +{ + public class SplitPropertiesRegistrationTests + { + private class MyClass + { + public string Something { get; set; } + } + + private class Inherited : MyClass + { + public string SomethingElse { get; set; } + } + + [Test] + public void WhenRegisterPropertySplitsThenTypeHasSplitGroups() + { + var inspector = new ExplicitlyDeclaredModel(); + inspector.AddAsPropertySplit(typeof(MyClass), "group", For<MyClass>.Property(x => x.Something)); + inspector.AddAsPropertySplit(typeof(Inherited), "group1", For<Inherited>.Property(x => x.SomethingElse)); + + inspector.GetSplitGroupsFor(typeof(MyClass)).Should().Have.SameValuesAs("group"); + inspector.GetSplitGroupsFor(typeof(Inherited)).Should().Have.SameValuesAs("group1"); + } + + [Test] + public void WhenRegisterPropertySplitMoreThanOnceThenIgnore() + { + var inspector = new ExplicitlyDeclaredModel(); + var memberFromDeclaringType = For<MyClass>.Property(x=> x.Something); + var memberFromReferencedType = typeof(Inherited).GetProperty("Something"); + + inspector.AddAsPropertySplit(typeof(MyClass), "group", memberFromDeclaringType); + inspector.AddAsPropertySplit(typeof(Inherited), "group1", memberFromReferencedType); + + inspector.GetSplitGroupsFor(typeof(MyClass)).Should().Have.SameValuesAs("group"); + inspector.GetSplitGroupsFor(typeof(Inherited)).Should().Be.Empty(); + + inspector.GetSplitGroupFor(memberFromDeclaringType).Should().Be("group"); + inspector.GetSplitGroupFor(memberFromReferencedType).Should().Be("group"); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs 2011-04-05 17:26:13 UTC (rev 5611) @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using NHibernate.Mapping.ByCode; using NUnit.Framework; using SharpTestsEx; @@ -17,7 +18,7 @@ public string SomethingB2 { get; set; } } - [Test, Ignore("Not implemented yet")] + [Test] public void WhenSplittedPropertiesThenRegisterSplitGroupIds() { var inspector = new ExplicitlyDeclaredModel(); @@ -42,7 +43,7 @@ tablePerClassSplits.Should().Have.SameValuesAs("MyClassSplit1", "MyClassSplit2"); } - [Test, Ignore("Not implemented yet")] + [Test] public void WhenSplittedPropertiesThenRegister() { var inspector = new ExplicitlyDeclaredModel(); @@ -71,5 +72,36 @@ inspector.IsTablePerClassSplit(typeof(MyClass), "MyClassSplit2", For<MyClass>.Property(x => x.SomethingB1)).Should().Be.True(); inspector.IsTablePerClassSplit(typeof(MyClass), "MyClassSplit2", For<MyClass>.Property(x => x.SomethingB2)).Should().Be.True(); } + + [Test] + public void WhenMapSplittedPropertiesThenEachPropertyIsInItsSplitGroup() + { + var inspector = new ExplicitlyDeclaredModel(); + var mapper = new ModelMapper(inspector); + mapper.Class<MyClass>(map => + { + map.Id(x => x.Id, idmap => { }); + map.Join("MyClassSplit1", mj => + { + mj.Property(x => x.SomethingA1); + mj.Property(x => x.SomethingA2); + }); + map.Join("MyClassSplit2", mj => + { + mj.Property(x => x.SomethingB1); + mj.Property(x => x.SomethingB2); + }); + map.Property(x => x.Something0); + }); + var hbmDoc = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + + var hbmClass = hbmDoc.RootClasses[0]; + hbmClass.Joins.Select(j => j.table).Should().Have.SameValuesAs("MyClassSplit1", "MyClassSplit2"); + hbmClass.Properties.Single().Name.Should().Be("Something0"); + var hbmSplit1 = hbmClass.Joins.Single(j => "MyClassSplit1" == j.table); + hbmSplit1.Properties.Select(p => p.Name).Should().Have.SameValuesAs("SomethingA1", "SomethingA2"); + var hbmSplit2 = hbmClass.Joins.Single(j => "MyClassSplit2" == j.table); + hbmSplit2.Properties.Select(p => p.Name).Should().Have.SameValuesAs("SomethingB1", "SomethingB2"); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-05 01:28:51 UTC (rev 5610) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-05 17:26:13 UTC (rev 5611) @@ -508,6 +508,7 @@ <Compile Include="Linq\ByMethod\SumTests.cs" /> <Compile Include="Logging\Log4NetLoggerTest.cs" /> <Compile Include="Logging\LoggerProviderTest.cs" /> + <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SplitPropertiesRegistrationTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\BasicMappingOfSimpleClass.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ColumnsNamingConvetions.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\ComponentMappingRegistrationTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |