Skip to content

Commit

Permalink
Merge pull request #512 from weaveworks/483-filter-unconnected-pseudo…
Browse files Browse the repository at this point in the history
…-nodes

Remove pseudo nodes that are made unconnected by filtering.
  • Loading branch information
tomwilkie committed Sep 23, 2015
2 parents 233b29d + 9e72ef1 commit d8a3372
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
15 changes: 15 additions & 0 deletions render/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,10 +178,12 @@ type Filter struct {
// Render implements Renderer
func (f Filter) Render(rpt report.Report) RenderableNodes {
output := RenderableNodes{}
inDegrees := map[string]int{}
for id, node := range f.Renderer.Render(rpt) {
if f.FilterFunc(node) {
output[id] = node
}
inDegrees[id] = 0
}

// Deleted nodes also need to be cut as destinations in adjacency lists.
Expand All @@ -190,11 +192,24 @@ func (f Filter) Render(rpt report.Report) RenderableNodes {
for _, dstID := range node.Adjacency {
if _, ok := output[dstID]; ok {
newAdjacency = newAdjacency.Add(dstID)
inDegrees[dstID]++
}
}
node.Adjacency = newAdjacency
output[id] = node
}

// Remove unconnected pseudo nodes, see #483.
for id, inDegree := range inDegrees {
if inDegree > 0 {
continue
}
node := output[id]
if !node.Pseudo || len(node.Adjacency) > 0 {
continue
}
delete(output, id)
}
return output
}

Expand Down
61 changes: 61 additions & 0 deletions render/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,4 +212,65 @@ func TestFilterRender2(t *testing.T) {
}
}

func TestFilterUnconnectedPesudoNodes(t *testing.T) {
// Test pseudo nodes that are made unconnected by filtering
// are also removed.
{
nodes := render.RenderableNodes{
"foo": {ID: "foo", Node: report.MakeNode().WithAdjacent("bar")},
"bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("baz")},
"baz": {ID: "baz", Node: report.MakeNode(), Pseudo: true},
}
renderer := render.Filter{
FilterFunc: func(node render.RenderableNode) bool {
return true
},
Renderer: mockRenderer{RenderableNodes: nodes},
}
want := nodes.Prune()
have := renderer.Render(report.MakeReport()).Prune()
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
}
}
{
renderer := render.Filter{
FilterFunc: func(node render.RenderableNode) bool {
return node.ID != "bar"
},
Renderer: mockRenderer{RenderableNodes: render.RenderableNodes{
"foo": {ID: "foo", Node: report.MakeNode().WithAdjacent("bar")},
"bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("baz")},
"baz": {ID: "baz", Node: report.MakeNode(), Pseudo: true},
}},
}
want := render.RenderableNodes{
"foo": {ID: "foo", Origins: report.IDList{}, Node: report.MakeNode()},
}
have := renderer.Render(report.MakeReport()).Prune()
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
}
}
{
renderer := render.Filter{
FilterFunc: func(node render.RenderableNode) bool {
return node.ID != "bar"
},
Renderer: mockRenderer{RenderableNodes: render.RenderableNodes{
"foo": {ID: "foo", Node: report.MakeNode()},
"bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("foo")},
"baz": {ID: "baz", Node: report.MakeNode().WithAdjacent("bar"), Pseudo: true},
}},
}
want := render.RenderableNodes{
"foo": {ID: "foo", Origins: report.IDList{}, Node: report.MakeNode()},
}
have := renderer.Render(report.MakeReport()).Prune()
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
}
}
}

func newu64(value uint64) *uint64 { return &value }

0 comments on commit d8a3372

Please sign in to comment.