Skip to content

Commit

Permalink
Fix hierarchy.revalue.
Browse files Browse the repository at this point in the history
Post-order traversal alone causes all parent values to be reset to zero
*after* accumulating child values.

An additional pre-order traversal resets all parent values to zero
first, and the post-order traversal can then accumulate child values in
their parents.

This only affects sticky treemaps.
  • Loading branch information
jasondavies committed May 19, 2014
1 parent 61c568f commit 58af519
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 11 deletions.
17 changes: 12 additions & 5 deletions d3.js
Expand Up @@ -6377,11 +6377,18 @@
return hierarchy;
};
hierarchy.revalue = function(root) {
if (value) d3_layout_hierarchyVisitAfter(root, function(node) {
var parent;
node.value = node.children ? 0 : +value.call(hierarchy, node, node.depth) || 0;
if (parent = node.parent) parent.value += node.value;
});
if (value) {
d3_layout_hierarchyVisitBefore(root, function(node) {
if (node.children) node.value = 0;
});
d3_layout_hierarchyVisitAfter(root, function(node) {
var parent;
if (!node.children) {
node.value = +value.call(hierarchy, node, node.depth) || 0;
}
if (parent = node.parent) parent.value += node.value;
});
}
return root;
};
return hierarchy;
Expand Down
2 changes: 1 addition & 1 deletion d3.min.js

Large diffs are not rendered by default.

17 changes: 12 additions & 5 deletions src/layout/hierarchy.js
Expand Up @@ -60,11 +60,18 @@ d3.layout.hierarchy = function() {

// Re-evaluates the `value` property for the specified hierarchy.
hierarchy.revalue = function(root) {
if (value) d3_layout_hierarchyVisitAfter(root, function(node) {
var parent;
node.value = node.children ? 0 : +value.call(hierarchy, node, node.depth) || 0;
if (parent = node.parent) parent.value += node.value;
});
if (value) {
d3_layout_hierarchyVisitBefore(root, function(node) {
if (node.children) node.value = 0;
});
d3_layout_hierarchyVisitAfter(root, function(node) {
var parent;
if (!node.children) {
node.value = +value.call(hierarchy, node, node.depth) || 0;
}
if (parent = node.parent) parent.value += node.value;
});
}
return root;
};

Expand Down
7 changes: 7 additions & 0 deletions test/layout/hierarchy-test.js
Expand Up @@ -26,6 +26,13 @@ suite.addBatch({
nodes = h.children(function() { return null; }).nodes({children: [{}]});
assert.equal(nodes[0].value, 0);
assert.isUndefined(nodes[0].children);
},
"revalue": function(hierarchy) {
var h = hierarchy().sticky(true),
nodes = h.nodes({children: [{children: [{value: 1}, {value: 2}]}, {value: 3}]});
assert.equal(nodes[0].value, 6);
h(nodes[0]); // calls hierarchy.revalue
assert.equal(nodes[0].value, 6);
}
}
});
Expand Down

0 comments on commit 58af519

Please sign in to comment.