/// <summary>Adds a complex to 'complex'.</summary> /// <param name="elements"> The elements.</param> /// <param name="complex"> The complex.</param> /// <param name="complexType">Type of the complex.</param> private void AddComplex( Dictionary <string, CytoElement> elements, FhirComplex complex, FhirNodeInfo.FhirNodeType complexType) { if (elements.ContainsKey(complex.Name)) { elements[complex.Name].Data.Weight += _weightIncrement; if (elements[complex.Name].Data.Weight > _maxNodeWeight) { _maxNodeWeight = (decimal)elements[complex.Name].Data.Weight; } return; } CytoElement cy = new CytoElement() { Group = CytoElement.GroupNodes, Data = new CytoElementDataNode() { Id = complex.Name, Name = complex.Name, Weight = _weightIncrement, Group = _nodeGroupMap[complexType], }, }; elements.Add(complex.Name, cy); TryRecurse( elements, complex.Name, complexType, complex.BaseTypeName); AddElementEdges(elements, complex, complex); if (complex.Components != null) { foreach (FhirComplex component in complex.Components.Values) { AddElementEdges(elements, complex, component); } } }
/// <summary>Adds an edge.</summary> /// <param name="elements"> The elements.</param> /// <param name="source"> Source for the.</param> /// <param name="sourceType">Type of the source.</param> /// <param name="target"> Target for the.</param> /// <param name="targetType">Type of the target.</param> private static void AddEdge( Dictionary <string, CytoElement> elements, string source, FhirNodeInfo.FhirNodeType sourceType, string target, FhirNodeInfo.FhirNodeType targetType) { if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(target)) { return; } if (source == target) { return; } string id = $"{source}-{target}"; if (elements.ContainsKey(id)) { elements[id].Data.Weight += _weightIncrement; if (elements[id].Data.Weight > _maxEdgeWeight) { _maxEdgeWeight = (decimal)elements[id].Data.Weight; } return; } CytoElement cy = new CytoElement() { Group = CytoElement.GroupEdges, Data = new CytoElementDataEdge() { Id = id, SourceId = source, TargetId = target, Weight = _weightIncrement, Group = _nodeGroupMap[targetType], }, }; elements.Add(id, cy); }
/// <summary>Adds a node.</summary> /// <param name="elements"> The elements.</param> /// <param name="sourceId"> Identifier for the source.</param> /// <param name="baseTypeName">Name of the base type.</param> private void TryRecurse( Dictionary <string, CytoElement> elements, string sourceId, FhirNodeInfo.FhirNodeType sourceType, string baseTypeName) { if (string.IsNullOrEmpty(baseTypeName) || (baseTypeName == sourceId)) { return; } if (_info.TryGetNodeInfo(baseTypeName, out FhirNodeInfo node)) { switch (node.SourceType) { case FhirNodeInfo.FhirNodeType.Primitive: AddPrimitive(elements, node.GetSource <FhirPrimitive>()); AddEdge( elements, sourceId, sourceType, baseTypeName, node.SourceType); return; case FhirNodeInfo.FhirNodeType.DataType: case FhirNodeInfo.FhirNodeType.Resource: case FhirNodeInfo.FhirNodeType.Component: case FhirNodeInfo.FhirNodeType.Profile: AddComplex(elements, node.GetSource <FhirComplex>(), sourceType); AddEdge( elements, sourceId, sourceType, baseTypeName, node.SourceType); return; case FhirNodeInfo.FhirNodeType.Unknown: case FhirNodeInfo.FhirNodeType.Self: default: break; } } }