private FunctionImportReturnTypeStructuralTypeColumn GetRename( StructuralType typeForRename) { FunctionImportReturnTypeStructuralTypeColumn structuralTypeColumn1 = this._columnListForType.FirstOrDefault <FunctionImportReturnTypeStructuralTypeColumn>((Func <FunctionImportReturnTypeStructuralTypeColumn, bool>)(t => t.Type == typeForRename)); if (structuralTypeColumn1 != null) { return(structuralTypeColumn1); } FunctionImportReturnTypeStructuralTypeColumn structuralTypeColumn2 = this._columnListForIsTypeOfType.Where <FunctionImportReturnTypeStructuralTypeColumn>((Func <FunctionImportReturnTypeStructuralTypeColumn, bool>)(t => t.Type == typeForRename)).LastOrDefault <FunctionImportReturnTypeStructuralTypeColumn>(); if (structuralTypeColumn2 != null) { return(structuralTypeColumn2); } IEnumerable <FunctionImportReturnTypeStructuralTypeColumn> structuralTypeColumns = this._columnListForIsTypeOfType.Where <FunctionImportReturnTypeStructuralTypeColumn>((Func <FunctionImportReturnTypeStructuralTypeColumn, bool>)(t => t.Type.IsAssignableFrom((EdmType)typeForRename))); if (structuralTypeColumns.Count <FunctionImportReturnTypeStructuralTypeColumn>() == 0) { return(new FunctionImportReturnTypeStructuralTypeColumn(this._defaultMemberName, typeForRename, false, (LineInfo)null)); } return(FunctionImportReturnTypeStructuralTypeColumnRenameMapping.GetLowestParentInHierarchy(structuralTypeColumns)); }
internal FunctionImportStructuralTypeMappingKB( IEnumerable<FunctionImportStructuralTypeMapping> structuralTypeMappings, ItemCollection itemCollection) { DebugCheck.NotNull(structuralTypeMappings); DebugCheck.NotNull(itemCollection); 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> { }); } }
internal FunctionImportStructuralTypeMappingKB( IEnumerable <FunctionImportStructuralTypeMapping> structuralTypeMappings, ItemCollection itemCollection) { DebugCheck.NotNull(structuralTypeMappings); DebugCheck.NotNull(itemCollection); 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> { }); } }
internal FunctionImportStructuralTypeMappingKB( IEnumerable <FunctionImportStructuralTypeMapping> structuralTypeMappings, ItemCollection itemCollection) { this.m_itemCollection = itemCollection; if (structuralTypeMappings.Count <FunctionImportStructuralTypeMapping>() == 0) { this.ReturnTypeColumnsRenameMapping = new Dictionary <string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping>(); this.NormalizedEntityTypeMappings = new ReadOnlyCollection <FunctionImportNormalizedEntityTypeMapping>((IList <FunctionImportNormalizedEntityTypeMapping>) new List <FunctionImportNormalizedEntityTypeMapping>()); this.DiscriminatorColumns = new ReadOnlyCollection <string>((IList <string>) new List <string>()); this.MappedEntityTypes = new ReadOnlyCollection <EntityType>((IList <EntityType>) new List <EntityType>()); } else { IEnumerable <FunctionImportEntityTypeMapping> source1 = structuralTypeMappings.OfType <FunctionImportEntityTypeMapping>(); if (source1 != null && source1.FirstOrDefault <FunctionImportEntityTypeMapping>() != null) { Dictionary <EntityType, Collection <FunctionImportReturnTypePropertyMapping> > isOfTypeEntityTypeColumnsRenameMapping = new Dictionary <EntityType, Collection <FunctionImportReturnTypePropertyMapping> >(); Dictionary <EntityType, Collection <FunctionImportReturnTypePropertyMapping> > entityTypeColumnsRenameMapping = new Dictionary <EntityType, Collection <FunctionImportReturnTypePropertyMapping> >(); List <FunctionImportNormalizedEntityTypeMapping> entityTypeMappingList = new List <FunctionImportNormalizedEntityTypeMapping>(); this.MappedEntityTypes = new ReadOnlyCollection <EntityType>((IList <EntityType>)source1.SelectMany <FunctionImportEntityTypeMapping, EntityType>((Func <FunctionImportEntityTypeMapping, IEnumerable <EntityType> >)(mapping => mapping.GetMappedEntityTypes(this.m_itemCollection))).Distinct <EntityType>().ToList <EntityType>()); this.DiscriminatorColumns = new ReadOnlyCollection <string>((IList <string>)source1.SelectMany <FunctionImportEntityTypeMapping, string>((Func <FunctionImportEntityTypeMapping, IEnumerable <string> >)(mapping => mapping.GetDiscriminatorColumns())).Distinct <string>().ToList <string>()); this.m_entityTypeLineInfos = new KeyToListMap <EntityType, LineInfo>((IEqualityComparer <EntityType>)EqualityComparer <EntityType> .Default); this.m_isTypeOfLineInfos = new KeyToListMap <EntityType, LineInfo>((IEqualityComparer <EntityType>)EqualityComparer <EntityType> .Default); foreach (FunctionImportEntityTypeMapping entityTypeMapping in source1) { foreach (EntityType entityType in entityTypeMapping.EntityTypes) { this.m_entityTypeLineInfos.Add(entityType, entityTypeMapping.LineInfo); } foreach (EntityType ofTypeEntityType in entityTypeMapping.IsOfTypeEntityTypes) { this.m_isTypeOfLineInfos.Add(ofTypeEntityType, entityTypeMapping.LineInfo); } Dictionary <string, FunctionImportEntityTypeMappingCondition> dictionary = entityTypeMapping.Conditions.ToDictionary <FunctionImportEntityTypeMappingCondition, string, FunctionImportEntityTypeMappingCondition>((Func <FunctionImportEntityTypeMappingCondition, string>)(condition => condition.ColumnName), (Func <FunctionImportEntityTypeMappingCondition, FunctionImportEntityTypeMappingCondition>)(condition => condition)); List <FunctionImportEntityTypeMappingCondition> columnConditions = new List <FunctionImportEntityTypeMappingCondition>(this.DiscriminatorColumns.Count); for (int index = 0; index < this.DiscriminatorColumns.Count; ++index) { string discriminatorColumn = this.DiscriminatorColumns[index]; FunctionImportEntityTypeMappingCondition mappingCondition; if (dictionary.TryGetValue(discriminatorColumn, out mappingCondition)) { columnConditions.Add(mappingCondition); } else { columnConditions.Add((FunctionImportEntityTypeMappingCondition)null); } } bool[] values = new bool[this.MappedEntityTypes.Count]; Set <EntityType> set = new Set <EntityType>(entityTypeMapping.GetMappedEntityTypes(this.m_itemCollection)); for (int index = 0; index < this.MappedEntityTypes.Count; ++index) { values[index] = set.Contains(this.MappedEntityTypes[index]); } entityTypeMappingList.Add(new FunctionImportNormalizedEntityTypeMapping(this, columnConditions, new BitArray(values))); foreach (EntityType ofTypeEntityType in entityTypeMapping.IsOfTypeEntityTypes) { if (!isOfTypeEntityTypeColumnsRenameMapping.Keys.Contains <EntityType>(ofTypeEntityType)) { isOfTypeEntityTypeColumnsRenameMapping.Add(ofTypeEntityType, new Collection <FunctionImportReturnTypePropertyMapping>()); } foreach (FunctionImportReturnTypePropertyMapping columnsRename in entityTypeMapping.ColumnsRenameList) { isOfTypeEntityTypeColumnsRenameMapping[ofTypeEntityType].Add(columnsRename); } } foreach (EntityType entityType in entityTypeMapping.EntityTypes) { if (!entityTypeColumnsRenameMapping.Keys.Contains <EntityType>(entityType)) { entityTypeColumnsRenameMapping.Add(entityType, new Collection <FunctionImportReturnTypePropertyMapping>()); } foreach (FunctionImportReturnTypePropertyMapping columnsRename in entityTypeMapping.ColumnsRenameList) { entityTypeColumnsRenameMapping[entityType].Add(columnsRename); } } } this.ReturnTypeColumnsRenameMapping = new FunctionImportReturnTypeEntityTypeColumnsRenameBuilder(isOfTypeEntityTypeColumnsRenameMapping, entityTypeColumnsRenameMapping).ColumnRenameMapping; this.NormalizedEntityTypeMappings = new ReadOnlyCollection <FunctionImportNormalizedEntityTypeMapping>((IList <FunctionImportNormalizedEntityTypeMapping>)entityTypeMappingList); } else { IEnumerable <FunctionImportComplexTypeMapping> source2 = structuralTypeMappings.Cast <FunctionImportComplexTypeMapping>(); this.ReturnTypeColumnsRenameMapping = new Dictionary <string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping>(); foreach (FunctionImportReturnTypePropertyMapping columnsRename in source2.First <FunctionImportComplexTypeMapping>().ColumnsRenameList) { FunctionImportReturnTypeStructuralTypeColumnRenameMapping columnRenameMapping = new FunctionImportReturnTypeStructuralTypeColumnRenameMapping(columnsRename.CMember); columnRenameMapping.AddRename(new FunctionImportReturnTypeStructuralTypeColumn(columnsRename.SColumn, (StructuralType)source2.First <FunctionImportComplexTypeMapping>().ReturnType, false, columnsRename.LineInfo)); this.ReturnTypeColumnsRenameMapping.Add(columnsRename.CMember, columnRenameMapping); } this.NormalizedEntityTypeMappings = new ReadOnlyCollection <FunctionImportNormalizedEntityTypeMapping>((IList <FunctionImportNormalizedEntityTypeMapping>) new List <FunctionImportNormalizedEntityTypeMapping>()); this.DiscriminatorColumns = new ReadOnlyCollection <string>((IList <string>) new List <string>()); this.MappedEntityTypes = new ReadOnlyCollection <EntityType>((IList <EntityType>) new List <EntityType>()); } } }