From: <mcu...@us...> - 2007-08-20 22:18:28
|
Revision: 1093 http://orm.svn.sourceforge.net/orm/?rev=1093&view=rev Author: mcurland Date: 2007-08-20 15:18:31 -0700 (Mon, 20 Aug 2007) Log Message: ----------- Added incremental rules for updating Column.IsNullable. refs #328 Modified Paths: -------------- trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.cs trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.xml trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs Modified: trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs 2007-08-20 22:13:30 UTC (rev 1092) +++ trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs 2007-08-20 22:18:31 UTC (rev 1093) @@ -26,6 +26,16 @@ // for cases where we start from an empty ORM model /// <summary> + /// ChangeRule: typeof(Neumont.Tools.ORMAbstraction.ConceptTypeChild) + /// </summary> + private static void ConceptTypeChildChangedRule(ElementPropertyChangedEventArgs e) + { + if (e.DomainProperty.Id == ConceptTypeChild.IsMandatoryDomainPropertyId) + { + ValidateAssociatedColumnsIsNullable((ConceptTypeChild)e.ModelElement); + } + } + /// <summary> /// AddRule: typeof(Neumont.Tools.ORMAbstraction.AbstractionModelHasConceptType) /// </summary> private static void ConceptTypeAddedRule(ElementAddedEventArgs e) @@ -73,6 +83,43 @@ constraint.Delete(); } } + [DelayValidatePriority(DomainModelType = typeof(AbstractionDomainModel), Order = DelayValidatePriorityOrder.AfterDomainModel)] + private static void RebuildForAbstractionModelDelayed(ModelElement element) + { + if (!element.IsDeleted) + { + AbstractionModel model = (AbstractionModel)element; + Schema schema = SchemaIsForAbstractionModel.GetSchema(model); + if (schema != null) + { + schema.TableCollection.Clear(); + schema.DomainCollection.Clear(); + FullyGenerateConceptualDatabaseModel(schema, model); + } + } + } + private static void ValidateAssociatedColumnsIsNullable(ConceptTypeChild child) + { + bool canBeNullable = !child.IsMandatory; + foreach (Column column in ColumnHasConceptTypeChild.GetColumn(child)) + { + if (canBeNullable ? !column.IsNullable : column.IsNullable) + { + FrameworkDomainModel.DelayValidateElement(column, ValidateColumnIsNullableDelayed); + } + } + } + [DelayValidatePriority(10, DomainModelType = typeof(AbstractionDomainModel), Order = DelayValidatePriorityOrder.AfterDomainModel)] + private static void ValidateColumnIsNullableDelayed(ModelElement element) + { + // Check if the element survived regeneration. Note priority is after RebuildForAbstractionModelDelayed + if (!element.IsDeleted) + { + CheckColumnConstraint((Column)element); + } + } + #endregion // Abstraction model modification rules + #region Bridge element modification rules /// <summary> /// ChangeRule: typeof(Neumont.Tools.ORMAbstraction.AbstractionModel) /// Update the schema name when the abstraction model name changes @@ -89,22 +136,7 @@ } } } - [DelayValidatePriority(DomainModelType = typeof(AbstractionDomainModel), Order = DelayValidatePriorityOrder.AfterDomainModel)] - private static void RebuildForAbstractionModelDelayed(ModelElement element) - { - if (!element.IsDeleted) - { - AbstractionModel model = (AbstractionModel)element; - Schema schema = SchemaIsForAbstractionModel.GetSchema(model); - if (schema != null) - { - schema.TableCollection.Clear(); - schema.DomainCollection.Clear(); - FullyGenerateConceptualDatabaseModel(schema, model); - } - } - } - #endregion // Abstraction model modification rules + #endregion // Bridge element modification rules } #endregion // Regeneration rule delay validation methods } Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.cs 2007-08-20 22:13:30 UTC (rev 1092) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.cs 2007-08-20 22:18:31 UTC (rev 1093) @@ -36,6 +36,7 @@ retVal = new Type[]{ typeof(ModificationTracker).GetNestedType("AbstractionModelChangedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(ModificationTracker).GetNestedType("ConceptTypeAddedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), + typeof(ModificationTracker).GetNestedType("ConceptTypeChildChangedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(ModificationTracker).GetNestedType("ConceptTypeDeletedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(ModificationTracker).GetNestedType("InformationTypeFormatAddedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(ModificationTracker).GetNestedType("InformationTypeFormatDeletedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), @@ -73,7 +74,7 @@ { Microsoft.VisualStudio.Modeling.RuleManager ruleManager = store.RuleManager; Type[] disabledRuleTypes = ORMAbstractionToConceptualDatabaseBridgeDomainModel.CustomDomainModelTypes; - for (int i = 0; i < 6; ++i) + for (int i = 0; i < 7; ++i) { ruleManager.EnableRule(disabledRuleTypes[i]); } @@ -142,6 +143,32 @@ Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleEnd(e.ModelElement.Store, "Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ORMAbstractionToConceptualDatabaseBridgeDomainModel.ModificationTracker.ConceptTypeAddedRule"); } } + [Microsoft.VisualStudio.Modeling.RuleOn(typeof(Neumont.Tools.ORMAbstraction.ConceptTypeChild))] + private sealed class ConceptTypeChildChangedRuleClass : Microsoft.VisualStudio.Modeling.ChangeRule + { + [System.Diagnostics.DebuggerStepThrough()] + public ConceptTypeChildChangedRuleClass() + { + base.IsEnabled = false; + } + /// <summary> + /// Provide the following method in class: + /// Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ORMAbstractionToConceptualDatabaseBridgeDomainModel.ModificationTracker + /// /// <summary> + /// /// ChangeRule: typeof(Neumont.Tools.ORMAbstraction.ConceptTypeChild) + /// /// </summary> + /// private static void ConceptTypeChildChangedRule(ElementPropertyChangedEventArgs e) + /// { + /// } + /// </summary> + [System.Diagnostics.DebuggerStepThrough()] + public override void ElementPropertyChanged(Microsoft.VisualStudio.Modeling.ElementPropertyChangedEventArgs e) + { + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleStart(e.ModelElement.Store, "Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ORMAbstractionToConceptualDatabaseBridgeDomainModel.ModificationTracker.ConceptTypeChildChangedRule"); + ModificationTracker.ConceptTypeChildChangedRule(e); + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleEnd(e.ModelElement.Store, "Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ORMAbstractionToConceptualDatabaseBridgeDomainModel.ModificationTracker.ConceptTypeChildChangedRule"); + } + } [Microsoft.VisualStudio.Modeling.RuleOn(typeof(Neumont.Tools.ORMAbstraction.AbstractionModelHasConceptType))] private sealed class ConceptTypeDeletedRuleClass : Microsoft.VisualStudio.Modeling.DeleteRule { Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.xml =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.xml 2007-08-20 22:13:30 UTC (rev 1092) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.AttachRules.xml 2007-08-20 22:18:31 UTC (rev 1093) @@ -23,6 +23,9 @@ <arg:AddRule methodName="ConceptTypeAddedRule"> <arg:RuleOn targetType="AbstractionModelHasConceptType" targetTypeQualifier="Neumont.Tools.ORMAbstraction"/> </arg:AddRule> + <arg:ChangeRule methodName="ConceptTypeChildChangedRule"> + <arg:RuleOn targetType="ConceptTypeChild" targetTypeQualifier="Neumont.Tools.ORMAbstraction"/> + </arg:ChangeRule> <arg:DeleteRule methodName="ConceptTypeDeletedRule"> <arg:RuleOn targetType="AbstractionModelHasConceptType" targetTypeQualifier="Neumont.Tools.ORMAbstraction"/> </arg:DeleteRule> Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2007-08-20 22:13:30 UTC (rev 1092) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2007-08-20 22:18:31 UTC (rev 1093) @@ -180,10 +180,9 @@ foreach (Table table in schema.TableCollection) { - CreateForeignKeys(table, store); + CreateForeignKeys(table); + GenerateMandatoryConstraints(table); } - - GenerateAllMandatoryConstraints(schema); } /// <summary> @@ -714,8 +713,7 @@ /// CreateForeignKeys looks at a table and creates the foreign keys between it. /// </summary> /// <param name="table">The table to check for foreign keys on.</param> - /// <param name="store">The <see cref="Store" />.</param> - private static void CreateForeignKeys(Table table, Store store) + private static void CreateForeignKeys(Table table) { Dictionary<ConceptTypeRelatesToConceptType, List<Column>> foreignKeyList = new Dictionary<ConceptTypeRelatesToConceptType, List<Column>>(); @@ -737,9 +735,11 @@ } } } + Store store = table.Store; foreach (KeyValuePair<ConceptTypeRelatesToConceptType, List<Column>> keyValuePair in foreignKeyList) { - ReferenceConstraint referenceConstraint = new ReferenceConstraint(store, new PropertyAssignment[] { new PropertyAssignment(ReferenceConstraint.NameDomainPropertyId, keyValuePair.Key.Name) }); + ReferenceConstraint referenceConstraint = null; + LinkedElementCollection<ColumnReference> referenceColumns = null; foreach (Column column in keyValuePair.Value) { Column targetColumn = FindTarget(column, keyValuePair.Key.ReferencedConceptType); @@ -747,13 +747,15 @@ { break; } - ColumnReference columnReference = new ColumnReference(column, targetColumn); - referenceConstraint.ColumnReferenceCollection.Add(columnReference); - if (table != null && !table.ReferenceConstraintCollection.Contains(referenceConstraint)) + if (referenceConstraint == null) { - TableContainsReferenceConstraint tableContainsReferenceConstraint = new TableContainsReferenceConstraint(table, referenceConstraint); - ReferenceConstraintTargetsTable referenceConstraintTargetsTable = new ReferenceConstraintTargetsTable(referenceConstraint, targetColumn.Table); + referenceConstraint = new ReferenceConstraint(store, new PropertyAssignment[] { new PropertyAssignment(ReferenceConstraint.NameDomainPropertyId, keyValuePair.Key.Name) }); + // Add it to the table + new TableContainsReferenceConstraint(table, referenceConstraint); + referenceColumns = referenceConstraint.ColumnReferenceCollection; + new ReferenceConstraintTargetsTable(referenceConstraint, targetColumn.Table); } + referenceColumns.Add(new ColumnReference(column, targetColumn)); } } } @@ -1181,29 +1183,29 @@ } /// <summary> - /// + /// Set the IsNullable property for all columns on the table /// </summary> - /// <param name="schema"></param> - private static void GenerateAllMandatoryConstraints(Schema schema) + /// <param name="table">The <see cref="Table"/> to set initial constraints for</param> + private static void GenerateMandatoryConstraints(Table table) { - foreach (Table table in schema.TableCollection) + foreach (Column column in table.ColumnCollection) { - foreach (Column column in table.ColumnCollection) - { - CheckColumnConstraint(column); - } + CheckColumnConstraint(column); } } private static void CheckColumnConstraint(Column column) { + bool allStepsMandatory = true; foreach (ConceptTypeChild concept in ColumnHasConceptTypeChild.GetConceptTypeChildPath(column)) { if (!concept.IsMandatory) { - column.IsNullable = true; + allStepsMandatory = false; + break; } } + column.IsNullable = !allStepsMandatory; } #endregion // Fully populate from OIAL This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2007-09-10 22:52:53
|
Revision: 1113 http://orm.svn.sourceforge.net/orm/?rev=1113&view=rev Author: mcurland Date: 2007-09-10 15:52:52 -0700 (Mon, 10 Sep 2007) Log Message: ----------- Fixes some bugs with name generation. refs #334 Modified Paths: -------------- trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs trunk/RelationalModel/OialDcilBridge/NameGeneration.cs Modified: trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs 2007-09-10 22:50:51 UTC (rev 1112) +++ trunk/RelationalModel/OialDcilBridge/ModificationTracker.cs 2007-09-10 22:52:52 UTC (rev 1113) @@ -214,10 +214,27 @@ ORMCore.FactType factType = ((ORMCore.Role)e.ModelElement).FactType; if (factType != null) { - foreach (ConceptTypeChild child in ConceptTypeChildHasPathFactType.GetConceptTypeChild(factType)) + ORMCore.Objectification objectification = factType.Objectification; + if (objectification != null) { - ValidateConceptTypeChildNameChanged(child); + foreach (ORMCore.FactType impliedFactType in objectification.ImpliedFactTypeCollection) + { + foreach (ConceptTypeChild child in ConceptTypeChildHasPathFactType.GetConceptTypeChild(impliedFactType)) + { + ValidateConceptTypeChildNameChanged(child); + goto doubleBreak; + } + } + doubleBreak: ; } + else + { + foreach (ConceptTypeChild child in ConceptTypeChildHasPathFactType.GetConceptTypeChild(factType)) + { + ValidateConceptTypeChildNameChanged(child); + break; + } + } } } } Modified: trunk/RelationalModel/OialDcilBridge/NameGeneration.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2007-09-10 22:50:51 UTC (rev 1112) +++ trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2007-09-10 22:52:52 UTC (rev 1113) @@ -166,11 +166,11 @@ { foreach (ConceptType conceptType in secondaryConceptTypes) { - name.Append(conceptType.Name); if (longerThan == null || FinalizeName(name.ToString(), tableCase, tableStringReplace) != longerThan) { break; } + name.Append(conceptType.Name); } } @@ -180,9 +180,12 @@ } string finalName = FinalizeName(name.ToString(), tableCase, tableStringReplace); - while (finalName == longerThan) + if (longerThan != null && finalName == longerThan.TrimEnd('_')) { - finalName += "_"; + while (finalName.Length <= longerThan.Length) + { + finalName += "_"; + } } return finalName; } @@ -212,6 +215,8 @@ //get a role name for each fact type, or generate one from the reading foreach (FactType factType in factTypes) { + //factType.ImpliedByObjectification + //factType.Objectification.ImpliedFactTypeCollection string roleName; LinkedElementCollection<RoleBase> factTypeRoles = factType.RoleCollection; int? unaryRoleIndex = FactType.GetUnaryRoleIndex(factTypeRoles); @@ -292,6 +297,7 @@ if (!hasUnary || (longerThan != null && longerThan == FinalizeName(name.ToString(), columnCasing, columnStringReplace))) { + string curName; if (!(hasRoleOrHyphenBound || alwaysKeepText) && (predicateTextCount == 1 && (longerThan == null || longerThan != FinalizeName(valueTypeName, columnCasing, columnStringReplace)))) { @@ -299,7 +305,8 @@ name.Remove(0, name.Length); name.Append(valueTypeName); } - else if (!hasRoleOrHyphenBound || FinalizeName(name.ToString(), columnCasing, columnStringReplace) == longerThan) + else if (!hasRoleOrHyphenBound || (longerThan != null && (FinalizeName(curName = name.ToString(), columnCasing, columnStringReplace) == longerThan + || FinalizeName(curName + valueTypeName, columnCasing, columnStringReplace) == longerThan))) { name.Append(valueTypeName); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2007-09-10 22:54:06
|
Revision: 1114 http://orm.svn.sourceforge.net/orm/?rev=1114&view=rev Author: mcurland Date: 2007-09-10 15:54:09 -0700 (Mon, 10 Sep 2007) Log Message: ----------- Stop offering absorb choice on ObjectType in some cases where choosing the absorb will throw. Also changed Absorbed to display as 'Absorbed (All Paths)' to emphasize that we are not absorbing over the primary path only. refs #334 Modified Paths: -------------- trunk/RelationalModel/OialDcilBridge/AssimilationMapping.cs trunk/RelationalModel/OialDcilBridge/MappingCustomizationModel.resx Modified: trunk/RelationalModel/OialDcilBridge/AssimilationMapping.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/AssimilationMapping.cs 2007-09-10 22:52:52 UTC (rev 1113) +++ trunk/RelationalModel/OialDcilBridge/AssimilationMapping.cs 2007-09-10 22:54:09 UTC (rev 1114) @@ -505,9 +505,9 @@ { return canPartition ? PartitionablePartitionedChildValues : PartitionedChildValues; } - if (customAbsorb || (!seenAbsorb && null != AssimilatorTracker.GetNearestAbsorbingAssimilatorConceptType(assimilations, true, null))) + if (customAbsorb || !seenAbsorb) { - fullAbsorbAvailable = true; + fullAbsorbAvailable = null != AssimilatorTracker.GetNearestAbsorbingAssimilatorConceptType(assimilations, true, null); } else if (seenAbsorb) { Modified: trunk/RelationalModel/OialDcilBridge/MappingCustomizationModel.resx =================================================================== --- trunk/RelationalModel/OialDcilBridge/MappingCustomizationModel.resx 2007-09-10 22:52:52 UTC (rev 1113) +++ trunk/RelationalModel/OialDcilBridge/MappingCustomizationModel.resx 2007-09-10 22:54:09 UTC (rev 1114) @@ -166,7 +166,7 @@ <comment>The display name for the AbsorptionChoice property on an ObjectType. Displays as the name of a property in the Properties Window.</comment> </data> <data name="ObjectTypeAbsorptionChoice.Absorbed" xml:space="preserve"> - <value>Absorbed</value> + <value>Absorbed (All Paths)</value> <comment>The ObjectType is absorbed through all paths.</comment> </data> <data name="ObjectTypeAbsorptionChoice.CustomAbsorbed" xml:space="preserve"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2007-09-10 23:04:38
|
Revision: 1119 http://orm.svn.sourceforge.net/orm/?rev=1119&view=rev Author: mcurland Date: 2007-09-10 16:04:41 -0700 (Mon, 10 Sep 2007) Log Message: ----------- Modified the ColumnHasConceptTypeChild Path to allow duplicate ConceptTypeChildren, allowing us to record the full path, from the column to the ConceptType to the identifier for that ConceptType. Using the new Path restructured FindTarget to properly return the correct column. refs #328. Modified Paths: -------------- trunk/RelationalModel/OialDcilBridge/GeneratedCode/DomainRelationships.cs trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs trunk/RelationalModel/OialDcilBridge/OialDcilBridge.dsl Modified: trunk/RelationalModel/OialDcilBridge/GeneratedCode/DomainRelationships.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/GeneratedCode/DomainRelationships.cs 2007-09-10 23:03:11 UTC (rev 1118) +++ trunk/RelationalModel/OialDcilBridge/GeneratedCode/DomainRelationships.cs 2007-09-10 23:04:41 UTC (rev 1119) @@ -2463,7 +2463,7 @@ [DslDesign::DisplayNameResource("Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ColumnHasConceptTypeChild.DisplayName", typeof(global::Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ORMAbstractionToConceptualDatabaseBridgeDomainModel), "Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.GeneratedCode.DomainModelResx")] [DslDesign::DescriptionResource("Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ColumnHasConceptTypeChild.Description", typeof(global::Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ORMAbstractionToConceptualDatabaseBridgeDomainModel), "Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.GeneratedCode.DomainModelResx")] [global::System.CLSCompliant(true)] - [DslModeling::DomainRelationship()] + [DslModeling::DomainRelationship(AllowsDuplicates = true)] [DslModeling::DomainObjectId("ccbcab63-ade4-43fa-8e29-8a598b0969f5")] public partial class ColumnHasConceptTypeChild : DslModeling::ElementLink { @@ -2650,24 +2650,6 @@ } return outLinks.AsReadOnly(); } - /// <summary> - /// Get the one ColumnHasConceptTypeChild link between a given Columnand a ConceptTypeChild. - /// </summary> - [global::System.Diagnostics.DebuggerStepThrough] - [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011")] - public static global::Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ColumnHasConceptTypeChild GetLink( global::Neumont.Tools.RelationalModels.ConceptualDatabase.Column source, global::Neumont.Tools.ORMAbstraction.ConceptTypeChild target ) - { - global::System.Collections.Generic.IList<global::Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ColumnHasConceptTypeChild> links = DslModeling::DomainRoleInfo.GetElementLinks<global::Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ColumnHasConceptTypeChild>(source, global::Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ColumnHasConceptTypeChild.ColumnDomainRoleId); - foreach ( global::Neumont.Tools.ORMAbstractionToConceptualDatabaseBridge.ColumnHasConceptTypeChild link in links ) - { - if ( target.Equals(link.ConceptTypeChild) ) - { - return link; - } - } - return null; - } - #endregion } } Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2007-09-10 23:03:11 UTC (rev 1118) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2007-09-10 23:04:41 UTC (rev 1119) @@ -316,7 +316,9 @@ if (TableIsPrimarilyForConceptType.GetTable(conceptType) == null && TableIsAlsoForConceptType.GetLink(table, conceptType) == null) { TableIsAlsoForConceptType tableIsAlsoForConceptType = new TableIsAlsoForConceptType(table, conceptType); - tableIsAlsoForConceptType.AssimilationPath.AddRange(assimilationPath); + ConceptTypeAssimilatesConceptType[] assimilationPathReversed = assimilationPath.ToArray(); + Array.Reverse(assimilationPathReversed); + tableIsAlsoForConceptType.AssimilationPath.AddRange(assimilationPathReversed); } // For all Assimilations that the ConceptType is the Parent of, if the assimilation is set to absorb, // then recursively add the ConceptTypes it assimilates to the table as a TableIsAlsoForConceptType as well. @@ -505,89 +507,62 @@ /// <summary> /// Creates columns for a ConceptType for every Table that the ConceptType plays a role in, as a TableIsPrimarilyForConceptType or TableIsAlsoForConceptType relationship. /// </summary> - private static void CreateColumns(ConceptType conceptType) { - List<ConceptTypeChild> preferredConceptTypeChildList = GetPreferredConceptTypeChildrenForConceptType(conceptType); List<Column> columnsForConceptType = new List<Column>(); - - foreach (ConceptTypeChild conceptTypeChild in ConceptTypeChild.GetLinksToTargetCollection(conceptType)) + foreach (InformationType informationType in InformationType.GetLinksToInformationTypeFormatCollection(conceptType)) { - if (!(conceptTypeChild is ConceptTypeAssimilatesConceptType)) + columnsForConceptType.Add(GetColumnForInformationType(informationType, new Stack<ConceptTypeChild>())); + } + foreach (ConceptTypeRelatesToConceptType conceptTypeRelation in ConceptTypeRelatesToConceptType.GetLinksToRelatedConceptTypeCollection(conceptType)) + { + columnsForConceptType.AddRange(GetColumnsForConceptTypeRelation(conceptTypeRelation, new Stack<ConceptTypeChild>())); + } + foreach (ConceptTypeAssimilatesConceptType assimilation in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatedConceptTypeCollection(conceptType)) + { + switch (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(assimilation)) { - columnsForConceptType.AddRange(GetColumnsForConceptTypeChild(conceptTypeChild, new List<ConceptTypeChild>())); + case AssimilationAbsorptionChoice.Absorb: + // Ignore this, it will be handled by this method when it is run for the absorbed concept type. + break; + case AssimilationAbsorptionChoice.Partition: + // Ignore this too. + break; + case AssimilationAbsorptionChoice.Separate: + // UNDONE: Handle separate here? If so, pull in the preferred identifier columns for the assimilated concept type if IsPreferredForParent is true. + break; } } - foreach (ConceptTypeChild assimilatedConceptType in preferredConceptTypeChildList) + foreach (ConceptTypeAssimilatesConceptType assimilation in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatorConceptTypeCollection(conceptType)) { - if (assimilatedConceptType is ConceptTypeAssimilatesConceptType) + switch (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(assimilation)) { - columnsForConceptType.AddRange(GetColumnsForConceptTypeChild(assimilatedConceptType, new List<ConceptTypeChild>())); + case AssimilationAbsorptionChoice.Absorb: + // Ignore this too. + break; + case AssimilationAbsorptionChoice.Partition: + // Ignore this too. + break; + case AssimilationAbsorptionChoice.Separate: + // UNDONE: Handle separate here? If so, pull in the preferred identifier columns for the assimilator concept type if IsPreferredForTarget is true. + break; } } - // TESTING - UNDONE#1 -- Not needed, should be contained within the first Foreach - //foreach(ConceptTypeChild relatedConceptType in preferredConceptTypeChildList) + + + //foreach (ConceptTypeChild conceptTypeChild in ConceptTypeChild.GetLinksToTargetCollection(conceptType)) //{ - // if (relatedConceptTypeChild.GetType() == typeof(ConceptTypeRelatesToConceptType)) - // { - // columnsForConceptType.AddRange(GetColumnsForConceptTypeChild(relatedConceptType, new List<ConceptTypeChild>())); - // } + // columnsForConceptType.AddRange(GetColumnsForConceptTypeChild(conceptTypeChild, new List<ConceptTypeChild>())); //} - // END TESTING + Table conceptTypeTable = TableIsPrimarilyForConceptType.GetTable(conceptType); if (conceptTypeTable != null) { - foreach (Column column in columnsForConceptType) - { - Column possibleDuplicateColumn = CheckForDuplicateColumn(conceptTypeTable, column); - if (possibleDuplicateColumn != null) - { - if (preferredConceptTypeChildList.Contains(ColumnHasConceptTypeChild.GetConceptTypeChildPath(possibleDuplicateColumn)[0])) - { - // Record CTHasPrimaryIdentifierColumn(CT, "PossibleDuplicateColumn"); - } - } - else - { - if (preferredConceptTypeChildList.Contains(ColumnHasConceptTypeChild.GetConceptTypeChildPath(column)[0])) - { - // Record CTHasPrimaryIdentifierColumn(CT, Column); - } - conceptTypeTable.ColumnCollection.Add(column); - } - } + conceptTypeTable.ColumnCollection.AddRange(columnsForConceptType); } else { - //ReadOnlyCollection<Table> tablesInvolvedWithConceptType = TableIsAlsoForConceptType.GetTable(conceptType); - //foreach (Table table in tablesInvolvedWithConceptType) - //{ - // foreach (Column column in columnsForConceptType) - // { - // // UNDONE: Why do we need to clone these here, where do we use it? - // Column clonedColumn = new Column(column.Store, new PropertyAssignment[] { new PropertyAssignment(Column.NameDomainPropertyId, column.Name) }); - // List<ConceptTypeChild> clonedConceptTypeChildPath = new List<ConceptTypeChild>(ColumnHasConceptTypeChild.GetConceptTypeChildPath(column)); - - // AssimilationPath assimPath = new AssimilationPath(assimilationPath[table].Path); - - // int inumerator = 0; - - // foreach (ConceptTypeAssimilatesConceptType currentConceptTypeAssimilatesConceptType in assimPath.Path) - // { - // clonedConceptTypeChildPath.Insert(inumerator, (ConceptTypeChild)currentConceptTypeAssimilatesConceptType); - // inumerator++; - // } - - // Column possibleDuplicateColumn = CheckForDuplicateColumn(table.Table, clonedColumn); - // if (possibleDuplicateColumn == null) - // { - // // if CTC is in PreferredList - // // Record CTCHasPrimaryIdentifierColumn(CT, ClonedColumn); - // table.Table.ColumnCollection.Add(clonedColumn); - // } - // } - //} ReadOnlyCollection<TableIsAlsoForConceptType> tableIsAlsoForConceptTypeInvolvedWithConceptType = TableIsAlsoForConceptType.GetLinksToTable(conceptType); foreach (TableIsAlsoForConceptType tableIsAlsoForConceptType in tableIsAlsoForConceptTypeInvolvedWithConceptType) { @@ -600,21 +575,11 @@ { clonedConceptTypeChildPath.Add(assimilation); } - foreach (ConceptTypeChild child in ColumnHasConceptTypeChild.GetConceptTypeChildPath(column)) - { - if (!clonedConceptTypeChildPath.Contains(child)) - { - clonedConceptTypeChildPath.Add(child); - } - } - //clonedConceptTypeChildPath.AddRange(ColumnHasConceptTypeChild.GetConceptTypeChildPath(column)); + clonedConceptTypeChildPath.AddRange(ColumnHasConceptTypeChild.GetConceptTypeChildPath(column)); Column possibleDuplicateColumn = CheckForDuplicateColumn(tableIsAlsoForConceptType.Table, clonedColumn); if (possibleDuplicateColumn == null) { - // if CTC is in PreferredList - // Record CTCHasPrimaryIdentifierColumn(CT, ClonedColumn); - tableIsAlsoForConceptType.Table.ColumnCollection.Add(clonedColumn); } else @@ -632,6 +597,88 @@ } } + private static Column GetColumnForInformationType(InformationType informationType, Stack<ConceptTypeChild> conceptTypeChildPath) + { + conceptTypeChildPath.Push(informationType); + Column column = new Column(informationType.Store, + new PropertyAssignment[]{ + new PropertyAssignment(Column.NameDomainPropertyId, informationType.Name)}); + ConceptTypeChild[] concpetTypeChildPathReverse = conceptTypeChildPath.ToArray(); + Array.Reverse(concpetTypeChildPathReverse); + ColumnHasConceptTypeChild.GetConceptTypeChildPath(column).AddRange(concpetTypeChildPathReverse); + conceptTypeChildPath.Pop(); + return column; + } + private static List<Column> GetColumnsForConceptTypeRelation(ConceptTypeRelatesToConceptType conceptTypeRelation, Stack<ConceptTypeChild> conceptTypeChildPath) + { + conceptTypeChildPath.Push(conceptTypeRelation); + List<Column> columns = GetPreferredIdentifierColumnsForConceptType(conceptTypeRelation.RelatedConceptType, conceptTypeChildPath); + conceptTypeChildPath.Pop(); + return columns; + } + + private static List<Column> GetPreferredIdentifierColumnsForConceptType(ConceptType conceptType, Stack<ConceptTypeChild> conceptTypeChildPath) + { + foreach (Uniqueness uniqueness in conceptType.UniquenessCollection) + { + if (uniqueness.IsPreferred) + { + LinkedElementCollection<ConceptTypeChild> uniquenessConceptTypeChildren = uniqueness.ConceptTypeChildCollection; + List<Column> columns = new List<Column>(uniquenessConceptTypeChildren.Count); + + foreach (ConceptTypeChild conceptTypeChild in uniquenessConceptTypeChildren) + { + InformationType informationType = conceptTypeChild as InformationType; + if (informationType != null) + { + columns.Add(GetColumnForInformationType(informationType, conceptTypeChildPath)); + } + else + { + Debug.Assert(conceptTypeChild is ConceptTypeRelatesToConceptType, "Uniquenesses can't contain ConceptTypeAssimilations."); + columns.AddRange(GetColumnsForConceptTypeRelation((ConceptTypeRelatesToConceptType)conceptTypeChild, conceptTypeChildPath)); + } + } + + return columns; + } + } + foreach (ConceptTypeAssimilatesConceptType assimilation in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatorConceptTypeCollection(conceptType)) + { + if (assimilation.IsPreferredForTarget) + { + bool isAbsorb = (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(assimilation) == AssimilationAbsorptionChoice.Absorb); + + conceptTypeChildPath.Push(assimilation); + + List<Column> columns = GetPreferredIdentifierColumnsForConceptType(assimilation.AssimilatorConceptType, conceptTypeChildPath); + + conceptTypeChildPath.Pop(); + + return columns; + } + } + foreach (ConceptTypeAssimilatesConceptType assimilation in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatedConceptTypeCollection(conceptType)) + { + if (assimilation.IsPreferredForParent) + { + bool isPartition = (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(assimilation) == AssimilationAbsorptionChoice.Partition); + + conceptTypeChildPath.Push(assimilation); + + List<Column> columns = GetPreferredIdentifierColumnsForConceptType(assimilation.AssimilatedConceptType, conceptTypeChildPath); + + conceptTypeChildPath.Pop(); + + return columns; + } + } + Debug.Fail("Couldn't find preferred identifier for concept type."); + throw new InvalidOperationException(); + } + + + /// <summary> /// GetColumnsForConceptTypeChild gets the <see cref="Column"/> coresponding to a <see cref="ConceptTypeChild"/>. /// </summary> @@ -649,16 +696,15 @@ List<Column> columnList = new List<Column>(); conceptTypeChildPath.Add(conceptTypeChild); - if (conceptTypeChild.GetType() == typeof(InformationType)) + if (conceptTypeChild is InformationType) { Column informationTypeColumn = new Column(conceptTypeChild.Store, new PropertyAssignment[]{ new PropertyAssignment(Column.NameDomainPropertyId, conceptTypeChild.Name)}); - ColumnHasConceptTypeChild.GetConceptTypeChildPath(informationTypeColumn).Clear(); ColumnHasConceptTypeChild.GetConceptTypeChildPath(informationTypeColumn).AddRange(conceptTypeChildPath); columnList.Add(informationTypeColumn); } - else if (conceptTypeChild.GetType() == typeof(ConceptTypeRelatesToConceptType)) + else if (conceptTypeChild is ConceptTypeRelatesToConceptType) { ConceptType relatedConceptType = (ConceptType)conceptTypeChild.Target; @@ -667,7 +713,11 @@ { if (child == preferredList[preferredList.Count - 1]) { + columnList.AddRange(GetColumnsForConceptTypeChild(child, conceptTypeChildPath)); + + //conceptTypeChildPath.Clear(); + //columnList.AddRange(GetColumnsForConceptTypeChild(child, conceptTypeChildPath)); } else { @@ -677,7 +727,7 @@ } return columnList; } - else if (conceptTypeChild.GetType() == typeof(ConceptTypeAssimilatesConceptType)) + else if (conceptTypeChild is ConceptTypeAssimilatesConceptType) { ConceptType targetConceptType = (ConceptType)conceptTypeChild.Parent; List<ConceptTypeChild> preferredList = GetPreferredConceptTypeChildrenForConceptType(targetConceptType); @@ -744,64 +794,36 @@ /// </summary> private static List<ConceptTypeChild> GetPreferredConceptTypeChildrenForConceptType(ConceptType conceptType) { - List<ConceptTypeChild> prefferedConceptTypeChildrenList = new List<ConceptTypeChild>(); foreach (Uniqueness uniqueness in conceptType.UniquenessCollection) { if (uniqueness.IsPreferred) { - foreach (ConceptTypeChild childConceptType in uniqueness.ConceptTypeChildCollection) - { - prefferedConceptTypeChildrenList.Add(childConceptType); - } - break; + return new List<ConceptTypeChild>(uniqueness.ConceptTypeChildCollection); } } - if (prefferedConceptTypeChildrenList.Count == 0) + foreach (ConceptTypeAssimilatesConceptType conceptTypeAssimilatesConceptType + in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatorConceptTypeCollection(conceptType)) { - foreach (ConceptTypeAssimilatesConceptType conceptTypeAssimilatesConceptType - in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatorConceptTypeCollection(conceptType)) + if (conceptTypeAssimilatesConceptType.IsPreferredForTarget) { - if (conceptTypeAssimilatesConceptType.IsPreferredForTarget) - { - prefferedConceptTypeChildrenList.AddRange(GetPreferredConceptTypeChildrenForConceptType(conceptTypeAssimilatesConceptType.AssimilatorConceptType)); - break; - } + List<ConceptTypeChild> prefferedConceptTypeChildrenList = new List<ConceptTypeChild>(1); + prefferedConceptTypeChildrenList.Add(conceptTypeAssimilatesConceptType); + return prefferedConceptTypeChildrenList; } } - if (prefferedConceptTypeChildrenList.Count == 0) + foreach (ConceptTypeAssimilatesConceptType conceptTypeAssimilatesConceptType + in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatedConceptTypeCollection(conceptType)) { - foreach (ConceptTypeAssimilatesConceptType conceptTypeAssimilatesConceptType - in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatedConceptTypeCollection(conceptType)) + if (conceptTypeAssimilatesConceptType.IsPreferredForParent) { - if (conceptTypeAssimilatesConceptType.IsPreferredForParent) - { - prefferedConceptTypeChildrenList.Add(conceptTypeAssimilatesConceptType); - break; - } + List<ConceptTypeChild> prefferedConceptTypeChildrenList = new List<ConceptTypeChild>(1); + prefferedConceptTypeChildrenList.Add(conceptTypeAssimilatesConceptType); + return prefferedConceptTypeChildrenList; } } - // TESTING - if (prefferedConceptTypeChildrenList.Count == 0) - { - foreach (ConceptTypeAssimilatesConceptType conceptTypeAssimilatesConceptType - in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatorConceptTypeCollection(conceptType)) - { - prefferedConceptTypeChildrenList.AddRange(GetPreferredConceptTypeChildrenForConceptType(conceptTypeAssimilatesConceptType.AssimilatorConceptType)); - break; - } - } - if (prefferedConceptTypeChildrenList.Count == 0) - { - foreach (ConceptTypeAssimilatesConceptType conceptTypeAssimilatesConceptType - in ConceptTypeAssimilatesConceptType.GetLinksToAssimilatedConceptTypeCollection(conceptType)) - { - prefferedConceptTypeChildrenList.AddRange(GetPreferredConceptTypeChildrenForConceptType(conceptTypeAssimilatesConceptType.AssimilatedConceptType)); - break; - } - } - - return prefferedConceptTypeChildrenList; + Debug.Fail("Couldn't find preferred identifier."); + return null; } /// <summary> @@ -1080,7 +1102,7 @@ bool isPartitioned = false; foreach (ConceptTypeAssimilatesConceptType possiblePartition in childAssimilations) { - if (AssimilationMapping.GetAssimilationMappingFromAssimilation(possiblePartition).AbsorptionChoice == AssimilationAbsorptionChoice.Partition) + if (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(possiblePartition) == AssimilationAbsorptionChoice.Partition) { isPartitioned = true; break; @@ -1222,7 +1244,6 @@ // UNDONE: Problem occuring with A is partitioned to B, C; C is partitioned to D, E. Setting A-C to Partition ReadOnlyCollection<ConceptTypeAssimilatesConceptType> childCollection = ConceptTypeAssimilatesConceptType.GetLinksToAssimilatedConceptTypeCollection(conceptTypeAssimilatesConceptType.AssimilatedConceptType); - /**/ bool containsPartitions = false; foreach (ConceptTypeAssimilatesConceptType act in childCollection) { @@ -1233,11 +1254,8 @@ break; } } - /**/ - /**/ if (!containsPartitions) { - /**/ Table targetTable = TableIsPrimarilyForConceptType.GetTable(conceptTypeAssimilatesConceptType.AssimilatedConceptType); foreach (Column target in targetTable.ColumnCollection) @@ -1250,7 +1268,6 @@ } } } - /**/ } else { @@ -1259,7 +1276,6 @@ columns.AddRange(ConceptTypeHasPrimaryIdentifierColumns(column, act.AssimilatedConceptType)); } } - /**/ } } @@ -1374,110 +1390,121 @@ /// <summary> /// FindTarget finds the target column for an input <see cref="ConceptType" />. /// </summary> - /// <param name="column">The <see cref="Column"/>.</param> - /// <param name="conceptType">The <see cref="ConceptType"/>.</param> + /// <param name="sourceColumn">The <see cref="Column"/>.</param> + /// <param name="targetConceptType">The <see cref="ConceptType"/>.</param> /// <returns>The target <see cref="Column"/>.</returns> - private static Column FindTarget(Column column, ConceptType conceptType) + private static Column FindTarget(Column sourceColumn, ConceptType targetConceptType) { - bool targetFound = true; - - if (TableIsPrimarilyForConceptType.GetTable(conceptType) == null) + Table targetTable = TableIsPrimarilyForConceptType.GetTable(targetConceptType); + TableIsAlsoForConceptType tableIsAlsoForConceptType; + if (targetTable == null) { - LinkedElementCollection<Table> tables = TableIsAlsoForConceptType.GetTable(conceptType); - if (tables.Count != 1) + ReadOnlyCollection<TableIsAlsoForConceptType> tableIsAlsoForConceptTypeLinks = TableIsAlsoForConceptType.GetLinksToTable(targetConceptType); + if (tableIsAlsoForConceptTypeLinks.Count != 1) { return null; } + else + { + tableIsAlsoForConceptType = tableIsAlsoForConceptTypeLinks[0]; + targetTable = tableIsAlsoForConceptType.Table; + } } + else + { + tableIsAlsoForConceptType = null; + } - //LinkedElementCollection<ConceptType> relating = ConceptTypeRelatesToConceptType.GetRelatingConceptTypeCollection(conceptType); - //int relatingCount = relating.Count; - //ConceptType[] real = new ConceptType[] { relatingCount }; - //relating.CopyTo(real, 0); - List<Column> possibleColumns = ConceptTypeHasPrimaryIdentifierColumns(column, conceptType); - - foreach (Column targetColumn in possibleColumns) + LinkedElementCollection<ConceptTypeChild> sourceCtcPath = ColumnHasConceptTypeChild.GetConceptTypeChildPath(sourceColumn); + List<ConceptTypeChild> targetCtcPath = new List<ConceptTypeChild>(sourceCtcPath.Count); + + // This handles removing the source concept type's assimilation path, + // and the relationship itself. + // UNDONE: Can the relationship portion of this ever have more than one CTC in it? If so, this will break badly. + bool finishedWithAssimilationPath = false; + bool copyPath = false; + for (int i = 0; i < sourceCtcPath.Count; i++) { - targetFound = true; - - if (targetColumn.Equals(column)) + ConceptTypeChild currentSourcePathChild = sourceCtcPath[i]; + if (copyPath) { - targetFound = false; + targetCtcPath.Add(currentSourcePathChild); } else { - //for (int i = 0; i < ColumnHasConceptTypeChild.GetConceptTypeChildPath(targetColumn).Count; ++i) - //{ - LinkedElementCollection<ConceptTypeChild> leftPath = ColumnHasConceptTypeChild.GetConceptTypeChildPath(column); - LinkedElementCollection<ConceptTypeChild> rightPath = ColumnHasConceptTypeChild.GetConceptTypeChildPath(targetColumn); - - int leftBuffer = 0; - int rightBuffer = 0; - - if (rightPath[0].GetType() == typeof(ConceptTypeAssimilatesConceptType)) + if (!finishedWithAssimilationPath) { - if (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(rightPath[0] as ConceptTypeAssimilatesConceptType) == AssimilationAbsorptionChoice.Separate) + ConceptTypeAssimilatesConceptType currentAssimilation = currentSourcePathChild as ConceptTypeAssimilatesConceptType; + if (currentAssimilation != null) { - rightBuffer += 1; + if (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(currentAssimilation) != AssimilationAbsorptionChoice.Separate) + { + continue; + } } + finishedWithAssimilationPath = true; } - if (leftPath[0].GetType() == typeof(ConceptTypeAssimilatesConceptType)) + if (currentSourcePathChild.Target == targetConceptType) { - if (AssimilationMapping.GetAbsorptionChoiceFromAssimilation(leftPath[0] as ConceptTypeAssimilatesConceptType) == AssimilationAbsorptionChoice.Separate) - { - leftBuffer += 1; - } + // This is the end of the assimilations and we're now at the start of the path to the preferred identifier. + copyPath = true; } + } + } - if (leftPath.Count - leftBuffer >= rightPath.Count - rightBuffer) - { - for (int reverseIndex = 0; reverseIndex < rightPath.Count - rightBuffer; reverseIndex++) - { - if (rightPath[rightPath.Count - 1 - reverseIndex] != leftPath[leftPath.Count - 1 - reverseIndex]) - { - targetFound = false; - break; - } + if (tableIsAlsoForConceptType != null) + { + LinkedElementCollection<ConceptTypeAssimilatesConceptType> targetAssimilationPath = TableIsAlsoForConceptTypeHasAssimilationPath.GetAssimilationPath(tableIsAlsoForConceptType); + InformationType informationType = (InformationType)sourceCtcPath[sourceCtcPath.Count - 1]; + ConceptType informationTypeParent = informationType.Parent; - } - } - else + // Remove everything at and after index, and add everything before it + int index; + for (index = 0; index < targetAssimilationPath.Count; index++) + { + if (targetAssimilationPath[index].Parent == informationTypeParent) { - for (int reverseIndex = 0; reverseIndex < leftPath.Count - leftBuffer; reverseIndex++) - { - if (leftPath[leftPath.Count - 1 - reverseIndex] != rightPath[rightPath.Count - 1 - reverseIndex]) - { - targetFound = false; - break; - } - } + break; } - //} - // END TEST + } +#if DEBUG + for (int i = targetAssimilationPath.Count - 1, j = 0; i >= index; i--, j++) + { + Debug.Assert(targetCtcPath[j] == targetAssimilationPath[i]); + } +#endif //DEBUG - //if ((i + 1 < leftPath.Count && i + offset < rightPath.Count && - // leftPath[i + 1] != rightPath[i + offset])) - //{ - // for (int j = 0; j < leftPath.Count; ++j) - // { - // if (leftPath[j].GetType() == typeof(InformationType)) - // { - // offset = j; - // } - // } + targetCtcPath.RemoveRange(0, targetAssimilationPath.Count - index); - // if ((i + 1 < leftPath.Count && i + offset < rightPath.Count && - // rightPath[rightPath.Count - 1] != rightPath[offset])) - // { + for (int i = index - 1; i >= 0; i--) + { + targetCtcPath.Insert(0, targetAssimilationPath[i]); + } + } - // targetFound = false; - // break; - // } - //} + foreach (Column possibleColumn in targetTable.ColumnCollection) + { + if (possibleColumn == sourceColumn) + { + continue; } - if (targetFound && targetColumn.Table != null) + bool isMatch = true; + LinkedElementCollection<ConceptTypeChild> possibleCtcPath = ColumnHasConceptTypeChild.GetConceptTypeChildPath(possibleColumn); + + if (possibleCtcPath.Count == targetCtcPath.Count) { - return targetColumn; + for (int i = targetCtcPath.Count - 1; i >= 0; i--) + { + if (possibleCtcPath[i] != targetCtcPath[i]) + { + isMatch = false; + break; + } + } + if (isMatch) + { + return possibleColumn; + } } } @@ -1526,7 +1553,7 @@ foreach (TableIsAlsoForConceptType tableIsAlsoForConceptType in TableIsAlsoForConceptType.GetLinksToTable(conceptType)) { Table table = tableIsAlsoForConceptType.Table; - LinkedElementCollection<Column> columns = table.ColumnCollection; + LinkedElementCollection<Column> tableColumns = table.ColumnCollection; LinkedElementCollection<ConceptTypeAssimilatesConceptType> assimilationPath = tableIsAlsoForConceptType.AssimilationPath; int assimilationPathCount = assimilationPath.Count; @@ -1535,6 +1... [truncated message content] |