private void GetAncestorOrDescendantNodeEdge(DatabaseObject databaseObject, bool descendants, out ISet <DependencyNode> resultNodes, out ISet <DependencyEdge> resultEdges)
        {
            resultNodes = new HashSet <DependencyNode>();
            resultEdges = new HashSet <DependencyEdge>();
            ISet <DependencyEdge>  initValues = descendants ? _tables[databaseObject.ID].ChildEdges : _tables[databaseObject.ID].ParentEdges;
            Queue <DependencyEdge> toProcess  = new Queue <DependencyEdge>(initValues);

            while (toProcess.Count > 0)
            {
                DependencyEdge actualEdge = toProcess.Dequeue();
                if (resultEdges.Contains(actualEdge))
                {
                    continue;
                }
                ISet <DependencyEdge> searchValues = descendants ? actualEdge.Child.ChildEdges : actualEdge.Parent.ParentEdges;
                foreach (DependencyEdge edge in searchValues)
                {
                    if (!resultEdges.Contains(edge))
                    {
                        toProcess.Enqueue(edge);
                    }
                }
                resultEdges.Add(actualEdge);
                resultNodes.Add(descendants ? actualEdge.Child : actualEdge.Parent);
            }
            resultNodes.Remove(_tables[databaseObject.ID]); // start node is not descendant or ancestor
        }
 public void AddDependencyEdge(DependencyEdge edge)
 {
     if (Equals(edge.Parent.DbObject, DbObject))
     {
         ChildEdges.Add(edge);
     }
     if (Equals(edge.Child.DbObject, DbObject))
     {
         ParentEdges.Add(edge);
     }
 }