/// <summary> /// Получает группу дочерних нод заданного шагом типа (producedChildElement) для родителя заданного типа. /// </summary> /// <param name="node">The node.</param> /// <returns></returns> public Lazy<FrameNodeGroup> GetNextLevelNodes(FrameNodeGroup node) { var childNodes = node.Nodes.Select(k => new {parent = k, children = _packGetter.GetValue(k)}).ToArray(); Func<FrameNodeGroup> processChildren = () => { var groupChildren = new List<FrameNode>(); foreach (var pair in childNodes) { var children = pair.children(); var localChildren = children.Select(k => CreateNewNode(pair.parent, k)).ToArray();; if (pair.parent.ChildNodes == null) pair.parent.ChildNodes = localChildren; else { pair.parent.ChildNodes = localChildren.Concat(pair.parent.ChildNodes).ToArray(); } groupChildren.AddRange(localChildren); } var newParameters = new ParameterNames(node.BoundingParameters.Concat(new[] { ProducedChildElement.Name })); var group = new FrameNodeGroup(ProducedChildElement, groupChildren.ToArray(), newParameters); return group; }; return new Lazy<FrameNodeGroup>(processChildren); }
/// <summary> /// Получает группу дочерних нод заданного шагом типа (producedChildElement) для родителя заданного типа. /// </summary> /// <param name="node">The node.</param> /// <returns></returns> public Lazy <FrameNodeGroup> GetNextLevelNodes(FrameNodeGroup node) { var childNodes = node.Nodes.Select(k => new { parent = k, children = _packGetter.GetValue(k) }).ToArray(); Func <FrameNodeGroup> processChildren = () => { var groupChildren = new List <FrameNode>(); foreach (var pair in childNodes) { var children = pair.children(); var localChildren = children.Select(k => CreateNewNode(pair.parent, k)).ToArray();; if (pair.parent.ChildNodes == null) { pair.parent.ChildNodes = localChildren; } else { pair.parent.ChildNodes = localChildren.Concat(pair.parent.ChildNodes).ToArray(); } groupChildren.AddRange(localChildren); } var newParameters = new ParameterNames(node.BoundingParameters.Concat(new[] { ProducedChildElement.Name })); var group = new FrameNodeGroup(ProducedChildElement, groupChildren.ToArray(), newParameters); return(group); }; return(new Lazy <FrameNodeGroup>(processChildren)); }
public void RecursiveCommendationTest() { var sElement = new ResourceProjectionElement { Name = "Attribute", FillingInfo = new FillingInfo { { "Name", FillingInfo.FillType.Native } }, ResourceType = "Attribute", Namespace = "Test" }; var sGroup = new ResourceProjectionElement { Name = "Element", FillingInfo = new FillingInfo { { "Name", FillingInfo.FillType.Native } }, ResourceType = "Element", Namespace = "Test", }; var gToGRelation = new Relation { ChildElement = sGroup, ParentElement = sGroup }; var eFromEQuery = Query.CreateTestStubQuery(null, null, "element"); gToGRelation.Queries = new[] { eFromEQuery }; sGroup.UpRelations.Add(gToGRelation); sGroup.DownRelations.Add(gToGRelation); var eToGRelation = new Relation { ChildElement = sElement, ParentElement = sGroup }; var aFromEQuery = Query.CreateTestStubQuery(null, null, "element"); eToGRelation.Queries = new[] { aFromEQuery }; sElement.UpRelations.Add(eToGRelation); sGroup.DownRelations.Add(eToGRelation); var cc = new CommendationCollection(); var acc = GetAccumulator(gToGRelation, eFromEQuery); cc.AddNewStep(new PlanStep(sGroup, sGroup, new ParameterNames(), acc, new ParameterNames(), 0)); acc = GetAccumulator(eToGRelation, aFromEQuery); cc.AddNewStep(new PlanStep(sGroup, sElement, new ParameterNames(), acc, new ParameterNames(), 0)); var root = new FrameNodeGroup(sGroup, new[] { new FrameNode(Guid.Empty, sGroup, 0, new Dictionary <string, object>()) }, new ParameterNames()); var nodes = cc.GetNewGroups(new[] { root }); Assert.AreEqual(2, nodes.Count()); nodes = cc.GetNewGroups(nodes); Assert.AreEqual(2, nodes.Count()); nodes = cc.GetNewGroups(nodes); Assert.AreEqual(2, nodes.Count()); }