private ConceptMember TraversePresentationNetwork(LocatorNode node, Uri preferredLabelRole, ISet <XName> hypercubeDimensionNames) { var concept = node.Item; var aspect = new ConceptAspect(concept.Name); var member = new ConceptMember(aspect) { Item = concept, PreferredLabelRole = preferredLabelRole, Label = concept.FindLabel(preferredLabelRole), HypercubeDimensionNames = hypercubeDimensionNames }; var outgoingArcs = node.GetOrderedOutgoingHierarchicalArcs <PresentationArc>(); var attachedHypercube = GetAttachedHypercube(node); if (attachedHypercube != null) { if (outgoingArcs.Count != 1) { throw new InvalidOperationException($"The hypercube {attachedHypercube.HypercubeItem.Name} has {outgoingArcs.Count} line items children, but exactly one is expected."); } var outgoingArc = outgoingArcs.Single(); // We are replicating and adding the line items tree for each axis, including the respective dimension name to each concept member. foreach (var hypercubeAxis in attachedHypercube.Axes) { var childHypercubeDimensionNames = new HashSet <XName>(hypercubeDimensionNames) { hypercubeAxis.Dimension.Name }; var child = TraversePresentationNetwork(outgoingArc.ToLocator, outgoingArc.PreferredLabelRole, childHypercubeDimensionNames); child.HypercubeAxis = hypercubeAxis; member.AddChild(child); } } else { foreach (var outgoingArc in outgoingArcs) { var child = TraversePresentationNetwork(outgoingArc.ToLocator, outgoingArc.PreferredLabelRole, hypercubeDimensionNames); member.AddChild(child); } } return(member); }
private ExplicitMember TraverseHypercubeDimension(LocatorNode node, Dimension dimension) { var memberItem = node.Item; var aspect = new ExplicitMemberAspect(dimension, memberItem.Name); var member = new ExplicitMember(aspect) { Item = memberItem, Label = memberItem.FindLabel(LabelRoles.Standard) }; var outgoingArcs = node.GetOrderedOutgoingHierarchicalArcs <DefinitionArc>(); foreach (var outgoingArc in outgoingArcs) { var child = TraverseHypercubeDimension(outgoingArc.ToLocator, dimension); member.AddChild(child); } return(member); }
private LocatorNode FindParentNode(LocatorNode locatorNode, XName parentName) { if (locatorNode.Item.Name == parentName) { return(locatorNode); } var outgoingArcs = locatorNode.GetOrderedOutgoingHierarchicalArcs <DefinitionArc>(); foreach (var outgoingArc in outgoingArcs) { var childResult = FindParentNode(outgoingArc.ToLocator, parentName); if (childResult != null) { return(childResult); } } return(null); }