From: <mcu...@us...> - 2007-09-20 20:57:37
|
Revision: 1144 http://orm.svn.sourceforge.net/orm/?rev=1144&view=rev Author: mcurland Date: 2007-09-20 13:57:41 -0700 (Thu, 20 Sep 2007) Log Message: ----------- FindTarget needs to handle alternate absorption paths when building foreign keys in absorbed relationships in complex subtyping graphs. refs #328 Modified Paths: -------------- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2007-09-20 20:56:41 UTC (rev 1143) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2007-09-20 20:57:41 UTC (rev 1144) @@ -1349,21 +1349,41 @@ // Remove everything at and after index, and add everything before it int index; - for (index = 0; index < targetAssimilationPath.Count; index++) + int officialAssimilationPathCount = targetAssimilationPath.Count; + for (index = 0; index < officialAssimilationPathCount; index++) { if (targetAssimilationPath[index].Parent == informationTypeParent) { break; } } -#if DEBUG - for (int i = targetAssimilationPath.Count - 1, j = 0; i >= index; i--, j++) + + int removeCount = officialAssimilationPathCount - index; + for (int i = officialAssimilationPathCount - 1, j = 0; i >= index; i--, j++) { - Debug.Assert(targetCtcPath[j] == targetAssimilationPath[i]); + if (targetCtcPath[j] != targetAssimilationPath[i]) + { + // Handle alternate assimilation paths + ConceptType testAssimilator = targetAssimilationPath[index].AssimilatorConceptType; + int targetPathCount = targetCtcPath.Count; + for (int k = j + 1; k < targetPathCount; ++k) + { + ConceptTypeAssimilatesConceptType targetAssimilation = targetCtcPath[k] as ConceptTypeAssimilatesConceptType; + Debug.Assert(targetAssimilation != null, "Alternate assimilation paths should rejoin before we run out of assimilations."); + if (targetAssimilation != null) + { + if (targetAssimilation.AssimilatorConceptType == testAssimilator) + { + removeCount = k + 1; + break; + } + } + } + break; + } } -#endif //DEBUG - targetCtcPath.RemoveRange(0, targetAssimilationPath.Count - index); + targetCtcPath.RemoveRange(0, removeCount); for (int i = index - 1; i >= 0; i--) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |