private ReteNode BuildOrShareNegativeNode(ReteNode parent, Alpha_Memory am, List <Test_At_Join_Node> tests) { // look for an existing node to share foreach (ReteNode child in parent.Children) { if (child.Type == ReteNodeType.Negative_Node) { Negative_Node n_node = (Negative_Node)child; if (n_node.Amem.Equals(am) && Test_At_Join_Node.IsListEquals(n_node.Tests, tests)) { return(child); } } } Negative_Node new_n_node = new Negative_Node(); new_n_node.Type = ReteNodeType.Negative_Node; new_n_node.Parent = parent; // insert new at the head of the list parent.children parent.Children.Insert(0, new_n_node); //new_n_node.Children.Clear(); //new_n_node.Items.Clear(); new_n_node.Tests = tests; new_n_node.Amem = am; am.Successors.Insert(0, new_n_node); return(new_n_node); }
private ReteNode BuildOrShareJoinNode(ReteNode parent, Alpha_Memory am, List <Test_At_Join_Node> tests) { // look for an existing node to share foreach (ReteNode child in parent.Children) { Join_Node j_node = child as Join_Node; if (null != j_node) { if (j_node.Amem.Equals(am) && Test_At_Join_Node.IsListEquals(j_node.Tests, tests)) { return(child); } } } Join_Node new_j_node = new Join_Node(); new_j_node.Parent = parent; // insert new at the head of the list parent.children parent.Children.Insert(0, new_j_node); // foamliu, 2008/11/29, new object, no need. //new_j_node.Children.Clear(); new_j_node.Tests = tests; new_j_node.Amem = am; am.Successors.Insert(0, new_j_node); return(new_j_node); }