internal FunctionImportStructuralTypeMappingKB( IEnumerable <FunctionImportStructuralTypeMapping> structuralTypeMappings, ItemCollection itemCollection) { EntityUtil.CheckArgumentNull(structuralTypeMappings, "structuralTypeMappings"); m_itemCollection = EntityUtil.CheckArgumentNull(itemCollection, "itemCollection"); // If no specific type mapping. if (structuralTypeMappings.Count() == 0) { // Initialize with defaults. this.ReturnTypeColumnsRenameMapping = new Dictionary <string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping>(); this.NormalizedEntityTypeMappings = new OM.ReadOnlyCollection <FunctionImportNormalizedEntityTypeMapping>(new List <FunctionImportNormalizedEntityTypeMapping>()); this.DiscriminatorColumns = new OM.ReadOnlyCollection <string>(new List <string>()); this.MappedEntityTypes = new OM.ReadOnlyCollection <EntityType>(new List <EntityType>()); return; } IEnumerable <FunctionImportEntityTypeMapping> entityTypeMappings = structuralTypeMappings.OfType <FunctionImportEntityTypeMapping>(); // FunctionImportEntityTypeMapping if (null != entityTypeMappings && null != entityTypeMappings.FirstOrDefault <FunctionImportEntityTypeMapping>()) { var isOfTypeEntityTypeColumnsRenameMapping = new Dictionary <EntityType, OM.Collection <FunctionImportReturnTypePropertyMapping> >(); var entityTypeColumnsRenameMapping = new Dictionary <EntityType, OM.Collection <FunctionImportReturnTypePropertyMapping> >(); var normalizedEntityTypeMappings = new List <FunctionImportNormalizedEntityTypeMapping>(); // Collect all mapped entity types. this.MappedEntityTypes = entityTypeMappings .SelectMany(mapping => mapping.GetMappedEntityTypes(m_itemCollection)) .Distinct() .ToList() .AsReadOnly(); // Collect all discriminator columns. this.DiscriminatorColumns = entityTypeMappings .SelectMany(mapping => mapping.GetDiscriminatorColumns()) .Distinct() .ToList() .AsReadOnly(); m_entityTypeLineInfos = new KeyToListMap <EntityType, LineInfo>(EqualityComparer <EntityType> .Default); m_isTypeOfLineInfos = new KeyToListMap <EntityType, LineInfo>(EqualityComparer <EntityType> .Default); foreach (var entityTypeMapping in entityTypeMappings) { // Remember LineInfos for error reporting. foreach (var entityType in entityTypeMapping.EntityTypes) { m_entityTypeLineInfos.Add(entityType, entityTypeMapping.LineInfo); } foreach (var isTypeOf in entityTypeMapping.IsOfTypeEntityTypes) { m_isTypeOfLineInfos.Add(isTypeOf, entityTypeMapping.LineInfo); } // Create map from column name to condition. var columnMap = entityTypeMapping.Conditions.ToDictionary( condition => condition.ColumnName, condition => condition); // Align conditions with discriminator columns. var columnMappings = new List <FunctionImportEntityTypeMappingCondition>(this.DiscriminatorColumns.Count); for (int i = 0; i < this.DiscriminatorColumns.Count; i++) { string discriminatorColumn = this.DiscriminatorColumns[i]; FunctionImportEntityTypeMappingCondition mappingCondition; if (columnMap.TryGetValue(discriminatorColumn, out mappingCondition)) { columnMappings.Add(mappingCondition); } else { // Null indicates the value for this discriminator doesn't matter. columnMappings.Add(null); } } // Create bit map for implied entity types. bool[] impliedEntityTypesBitMap = new bool[this.MappedEntityTypes.Count]; var impliedEntityTypesSet = new Set <EntityType>(entityTypeMapping.GetMappedEntityTypes(m_itemCollection)); for (int i = 0; i < this.MappedEntityTypes.Count; i++) { impliedEntityTypesBitMap[i] = impliedEntityTypesSet.Contains(this.MappedEntityTypes[i]); } // Construct normalized mapping. normalizedEntityTypeMappings.Add(new FunctionImportNormalizedEntityTypeMapping(this, columnMappings, new BitArray(impliedEntityTypesBitMap))); // Construct the rename mappings by adding isTypeOf types and specific entity types to the corresponding lists. foreach (var isOfType in entityTypeMapping.IsOfTypeEntityTypes) { if (!isOfTypeEntityTypeColumnsRenameMapping.Keys.Contains(isOfType)) { isOfTypeEntityTypeColumnsRenameMapping.Add(isOfType, new OM.Collection <FunctionImportReturnTypePropertyMapping>()); } foreach (var rename in entityTypeMapping.ColumnsRenameList) { isOfTypeEntityTypeColumnsRenameMapping[isOfType].Add(rename); } } foreach (var entityType in entityTypeMapping.EntityTypes) { if (!entityTypeColumnsRenameMapping.Keys.Contains(entityType)) { entityTypeColumnsRenameMapping.Add(entityType, new OM.Collection <FunctionImportReturnTypePropertyMapping>()); } foreach (var rename in entityTypeMapping.ColumnsRenameList) { entityTypeColumnsRenameMapping[entityType].Add(rename); } } } this.ReturnTypeColumnsRenameMapping = new FunctionImportReturnTypeEntityTypeColumnsRenameBuilder(isOfTypeEntityTypeColumnsRenameMapping, entityTypeColumnsRenameMapping) .ColumnRenameMapping; this.NormalizedEntityTypeMappings = new OM.ReadOnlyCollection <FunctionImportNormalizedEntityTypeMapping>( normalizedEntityTypeMappings); } else { // FunctionImportComplexTypeMapping Debug.Assert(structuralTypeMappings.First() is FunctionImportComplexTypeMapping, "only two types can have renames, complexType and entityType"); IEnumerable <FunctionImportComplexTypeMapping> complexTypeMappings = structuralTypeMappings.Cast <FunctionImportComplexTypeMapping>(); Debug.Assert(complexTypeMappings.Count() == 1, "how come there are more than 1, complex type cannot derive from other complex type"); this.ReturnTypeColumnsRenameMapping = new Dictionary <string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping>(); foreach (var rename in complexTypeMappings.First().ColumnsRenameList) { FunctionImportReturnTypeStructuralTypeColumnRenameMapping columnRenameMapping = new FunctionImportReturnTypeStructuralTypeColumnRenameMapping(rename.CMember); columnRenameMapping.AddRename(new FunctionImportReturnTypeStructuralTypeColumn( rename.SColumn, complexTypeMappings.First().ReturnType, false, rename.LineInfo)); this.ReturnTypeColumnsRenameMapping.Add(rename.CMember, columnRenameMapping); } // Initialize the entity mapping data as empty. this.NormalizedEntityTypeMappings = new OM.ReadOnlyCollection <FunctionImportNormalizedEntityTypeMapping>(new List <FunctionImportNormalizedEntityTypeMapping>()); this.DiscriminatorColumns = new OM.ReadOnlyCollection <string>(new List <string>() { }); this.MappedEntityTypes = new OM.ReadOnlyCollection <EntityType>(new List <EntityType>() { }); } }
internal FunctionImportStructuralTypeMappingKB( IEnumerable<FunctionImportStructuralTypeMapping> structuralTypeMappings, ItemCollection itemCollection) { //Contract.Requires(structuralTypeMappings != null); //Contract.Requires(itemCollection != null); m_itemCollection = itemCollection; // If no specific type mapping. if (structuralTypeMappings.Count() == 0) { // Initialize with defaults. ReturnTypeColumnsRenameMapping = new Dictionary<string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping>(); NormalizedEntityTypeMappings = new ReadOnlyCollection<FunctionImportNormalizedEntityTypeMapping>( new List<FunctionImportNormalizedEntityTypeMapping>()); DiscriminatorColumns = new ReadOnlyCollection<string>(new List<string>()); MappedEntityTypes = new ReadOnlyCollection<EntityType>(new List<EntityType>()); return; } var entityTypeMappings = structuralTypeMappings.OfType<FunctionImportEntityTypeMapping>(); // FunctionImportEntityTypeMapping if (null != entityTypeMappings && null != entityTypeMappings.FirstOrDefault()) { var isOfTypeEntityTypeColumnsRenameMapping = new Dictionary<EntityType, Collection<FunctionImportReturnTypePropertyMapping>>(); var entityTypeColumnsRenameMapping = new Dictionary<EntityType, Collection<FunctionImportReturnTypePropertyMapping>>(); var normalizedEntityTypeMappings = new List<FunctionImportNormalizedEntityTypeMapping>(); // Collect all mapped entity types. MappedEntityTypes = entityTypeMappings .SelectMany(mapping => mapping.GetMappedEntityTypes(m_itemCollection)) .Distinct() .ToList() .AsReadOnly(); // Collect all discriminator columns. DiscriminatorColumns = entityTypeMappings .SelectMany(mapping => mapping.GetDiscriminatorColumns()) .Distinct() .ToList() .AsReadOnly(); m_entityTypeLineInfos = new KeyToListMap<EntityType, LineInfo>(EqualityComparer<EntityType>.Default); m_isTypeOfLineInfos = new KeyToListMap<EntityType, LineInfo>(EqualityComparer<EntityType>.Default); foreach (var entityTypeMapping in entityTypeMappings) { // Remember LineInfos for error reporting. foreach (var entityType in entityTypeMapping.EntityTypes) { m_entityTypeLineInfos.Add(entityType, entityTypeMapping.LineInfo); } foreach (var isTypeOf in entityTypeMapping.IsOfTypeEntityTypes) { m_isTypeOfLineInfos.Add(isTypeOf, entityTypeMapping.LineInfo); } // Create map from column name to condition. var columnMap = entityTypeMapping.Conditions.ToDictionary( condition => condition.ColumnName, condition => condition); // Align conditions with discriminator columns. var columnMappings = new List<FunctionImportEntityTypeMappingCondition>(DiscriminatorColumns.Count); for (var i = 0; i < DiscriminatorColumns.Count; i++) { var discriminatorColumn = DiscriminatorColumns[i]; FunctionImportEntityTypeMappingCondition mappingCondition; if (columnMap.TryGetValue(discriminatorColumn, out mappingCondition)) { columnMappings.Add(mappingCondition); } else { // Null indicates the value for this discriminator doesn't matter. columnMappings.Add(null); } } // Create bit map for implied entity types. var impliedEntityTypesBitMap = new bool[MappedEntityTypes.Count]; var impliedEntityTypesSet = new Set<EntityType>(entityTypeMapping.GetMappedEntityTypes(m_itemCollection)); for (var i = 0; i < MappedEntityTypes.Count; i++) { impliedEntityTypesBitMap[i] = impliedEntityTypesSet.Contains(MappedEntityTypes[i]); } // Construct normalized mapping. normalizedEntityTypeMappings.Add( new FunctionImportNormalizedEntityTypeMapping(this, columnMappings, new BitArray(impliedEntityTypesBitMap))); // Construct the rename mappings by adding isTypeOf types and specific entity types to the corresponding lists. foreach (var isOfType in entityTypeMapping.IsOfTypeEntityTypes) { if (!isOfTypeEntityTypeColumnsRenameMapping.Keys.Contains(isOfType)) { isOfTypeEntityTypeColumnsRenameMapping.Add( isOfType, new Collection<FunctionImportReturnTypePropertyMapping>()); } foreach (var rename in entityTypeMapping.ColumnsRenameList) { isOfTypeEntityTypeColumnsRenameMapping[isOfType].Add(rename); } } foreach (var entityType in entityTypeMapping.EntityTypes) { if (!entityTypeColumnsRenameMapping.Keys.Contains(entityType)) { entityTypeColumnsRenameMapping.Add(entityType, new Collection<FunctionImportReturnTypePropertyMapping>()); } foreach (var rename in entityTypeMapping.ColumnsRenameList) { entityTypeColumnsRenameMapping[entityType].Add(rename); } } } ReturnTypeColumnsRenameMapping = new FunctionImportReturnTypeEntityTypeColumnsRenameBuilder( isOfTypeEntityTypeColumnsRenameMapping, entityTypeColumnsRenameMapping) .ColumnRenameMapping; NormalizedEntityTypeMappings = new ReadOnlyCollection<FunctionImportNormalizedEntityTypeMapping>( normalizedEntityTypeMappings); } else { // FunctionImportComplexTypeMapping Debug.Assert( structuralTypeMappings.First() is FunctionImportComplexTypeMapping, "only two types can have renames, complexType and entityType"); var complexTypeMappings = structuralTypeMappings.Cast<FunctionImportComplexTypeMapping>(); Debug.Assert( complexTypeMappings.Count() == 1, "how come there are more than 1, complex type cannot derive from other complex type"); ReturnTypeColumnsRenameMapping = new Dictionary<string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping>(); foreach (var rename in complexTypeMappings.First().ColumnsRenameList) { var columnRenameMapping = new FunctionImportReturnTypeStructuralTypeColumnRenameMapping(rename.CMember); columnRenameMapping.AddRename( new FunctionImportReturnTypeStructuralTypeColumn( rename.SColumn, complexTypeMappings.First().ReturnType, false, rename.LineInfo)); ReturnTypeColumnsRenameMapping.Add(rename.CMember, columnRenameMapping); } // Initialize the entity mapping data as empty. NormalizedEntityTypeMappings = new ReadOnlyCollection<FunctionImportNormalizedEntityTypeMapping>( new List<FunctionImportNormalizedEntityTypeMapping>()); DiscriminatorColumns = new ReadOnlyCollection<string>( new List<string> { }); MappedEntityTypes = new ReadOnlyCollection<EntityType>( new List<EntityType> { }); } }