Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsParser.cs =================================================================== diff -u -rc4f75aa39431df092fc41bd13c1bd66c52b9e36e -r6d67c42595915b7385a6cf2f13885abc9ed1fad0 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsParser.cs (.../IllustrationPointsParser.cs) (revision c4f75aa39431df092fc41bd13c1bd66c52b9e36e) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsParser.cs (.../IllustrationPointsParser.cs) (revision 6d67c42595915b7385a6cf2f13885abc9ed1fad0) @@ -29,6 +29,9 @@ namespace Ringtoets.HydraRing.Calculation.Parsers.IllustrationPoints { + /// + /// Parser for transforming values for illustration points from the database into a data structure. + /// public class IllustrationPointsParser : IHydraRingFileParser { private readonly Dictionary> faultTreeStochasts = new Dictionary>(); @@ -37,11 +40,15 @@ private readonly Dictionary> subMechanismStochasts = new Dictionary>(); private readonly Dictionary subMechanismBetaValues = new Dictionary(); private readonly Dictionary> subMechanismResults = new Dictionary>(); - public GeneralResult Output = new GeneralResult(); private IDictionary windDirections; private IDictionary closingSituations; + /// + /// The result of parsing the illustration points in the Hydra-Ring database. + /// + public readonly GeneralResult Output = new GeneralResult(); + public void Parse(string workingDirectory, int sectionId) { string query = string.Concat( @@ -102,18 +109,18 @@ private void SetSubMechanismAsRootIllustrationPoint() { - var rootIllustrationPoints = new List(); + var rootIllustrationPoints = new Dictionary(); foreach (Tuple windDirectionClosingSituation in GetAllWindDirectionClosingSituationCombinations()) { - var illustrationPoint = new SubmechanismIllustrationPoint + var illustrationPoint = new SubMechanismIllustrationPoint { - Beta = subMechanismBetaValues.First().Value, - ClosingSituation = windDirectionClosingSituation.Item4, - WindDirection = windDirectionClosingSituation.Item2 + Beta = subMechanismBetaValues.First().Value }; AddRange(illustrationPoint.Results, subMechanismResults.First().Value); AddRange(illustrationPoint.Stochasts, subMechanismStochasts.First().Value); - rootIllustrationPoints.Add(new IllustrationPointTreeNode(illustrationPoint)); + + rootIllustrationPoints[CreateFaultTreeKey(windDirectionClosingSituation)] = + new IllustrationPointTreeNode(illustrationPoint); } Output.IllustrationPoints = rootIllustrationPoints; } @@ -227,42 +234,53 @@ private void ParseFaultTree(HydraRingDatabaseReader reader) { - IEnumerable> windDirectionClosingSituations = GetAllWindDirectionClosingSituationCombinations(); Dictionary[] readFaultTrees = GetIterator(reader).TakeWhile(r => r != null).ToArray(); if (readFaultTrees.Length > 0) { - var rootIllustrationPoints = new List(); + List> results = CreateResultTuples(readFaultTrees); - var results = new List>(); - - foreach (Dictionary readFaultTree in readFaultTrees) - { - object parentIdObject = readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeParentId]; - int? parentId = parentIdObject != DBNull.Value ? Convert.ToInt32(parentIdObject) : (int?) null; - int id = Convert.ToInt32(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeId]); - string type = Convert.ToString(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeType]); - string combine = Convert.ToString(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeCombine]); - - results.Add(Tuple.Create( - parentId, - id, - type == "faulttree" ? typeof(FaultTreeIllustrationPoint) : typeof(SubmechanismIllustrationPoint), - combine == "and" ? CombinationType.And : CombinationType.Or)); - } - + var rootIllustrationPoints = new Dictionary(); foreach (Tuple windDirectionClosingSituation in windDirectionClosingSituations) { Tuple root = results.Single(r => !r.Item1.HasValue); - rootIllustrationPoints.Add(BuildFaultTree(windDirectionClosingSituation, root.Item2, root.Item4, results)); + + rootIllustrationPoints[CreateFaultTreeKey(windDirectionClosingSituation)] = + BuildFaultTree(windDirectionClosingSituation, root.Item2, root.Item4, results); } Output.IllustrationPoints = rootIllustrationPoints; } } + private static List> CreateResultTuples(Dictionary[] readFaultTrees) + { + var results = new List>(); + + foreach (Dictionary readFaultTree in readFaultTrees) + { + object parentIdObject = readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeParentId]; + int? parentId = parentIdObject != DBNull.Value ? Convert.ToInt32(parentIdObject) : (int?) null; + int id = Convert.ToInt32(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeId]); + string type = Convert.ToString(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeType]); + string combine = Convert.ToString(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeCombine]); + + results.Add(Tuple.Create( + parentId, + id, + type == "faulttree" ? typeof(FaultTreeIllustrationPoint) : typeof(SubMechanismIllustrationPoint), + combine == "and" ? CombinationType.And : CombinationType.Or)); + } + return results; + } + + private static WindDirectionClosingSituation CreateFaultTreeKey(Tuple windDirectionClosingSituation) + { + return new WindDirectionClosingSituation(windDirectionClosingSituation.Item2, windDirectionClosingSituation.Item4); + } + private IEnumerable> GetAllWindDirectionClosingSituationCombinations() { return windDirections.SelectMany(windDirection => @@ -279,8 +297,6 @@ var dataKey = new ThreeKeyIndex(windDirectionClosingSituation.Item1, windDirectionClosingSituation.Item3, faultTreeId); var illustrationPoint = new FaultTreeIllustrationPoint { - WindDirection = windDirectionClosingSituation.Item2, - ClosingSituation = windDirectionClosingSituation.Item4, Beta = faultTreeBetaValues[dataKey], Combine = combinationType }; @@ -302,10 +318,8 @@ private IllustrationPointTreeNode BuildSubMechanism(Tuple windDirectionClosingSituation, int subMechanismId) { var dataKey = new ThreeKeyIndex(windDirectionClosingSituation.Item1, windDirectionClosingSituation.Item3, subMechanismId); - var illustrationPoint = new SubmechanismIllustrationPoint + var illustrationPoint = new SubMechanismIllustrationPoint { - WindDirection = windDirectionClosingSituation.Item2, - ClosingSituation = windDirectionClosingSituation.Item4, Beta = subMechanismBetaValues[dataKey] }; if (subMechanismStochasts.ContainsKey(dataKey)) @@ -433,41 +447,5 @@ && illustrationPointId == other.illustrationPointId; } } - - private struct WindDirectionClosingSituation - { - private readonly WindDirection windDirection; - private readonly string closingSituation; - - public WindDirectionClosingSituation(WindDirection windDirection, string closingSituation) - { - this.windDirection = windDirection; - this.closingSituation = closingSituation; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - return obj is WindDirectionClosingSituation - && Equals((WindDirectionClosingSituation) obj); - } - - public override int GetHashCode() - { - unchecked - { - return ((windDirection?.GetHashCode() ?? 0) * 397) ^ (closingSituation?.GetHashCode() ?? 0); - } - } - - private bool Equals(WindDirectionClosingSituation other) - { - return Equals(windDirection, other.windDirection) - && string.Equals(closingSituation, other.closingSituation); - } - } } } \ No newline at end of file