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. |