Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }