From c79c65fb395a6aae022b46743863853af882e20a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 29 Feb 2016 23:09:24 -0500 Subject: [PATCH] Reinsert parentRelations of modified parentWays (closes #3008) --- js/id/core/tree.js | 19 ++++++++++--------- test/spec/core/tree.js | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/js/id/core/tree.js b/js/id/core/tree.js index 05bbc2230..db53c9599 100644 --- a/js/id/core/tree.js +++ b/js/id/core/tree.js @@ -10,21 +10,22 @@ iD.Tree = function(head) { } function updateParents(entity, insertions, memo) { - head.parentWays(entity).forEach(function(parent) { - if (rectangles[parent.id]) { - rtree.remove(rectangles[parent.id]); - insertions[parent.id] = parent; + head.parentWays(entity).forEach(function(way) { + if (rectangles[way.id]) { + rtree.remove(rectangles[way.id]); + insertions[way.id] = way; } + updateParents(way, insertions, memo); }); - head.parentRelations(entity).forEach(function(parent) { + head.parentRelations(entity).forEach(function(relation) { if (memo[entity.id]) return; memo[entity.id] = true; - if (rectangles[parent.id]) { - rtree.remove(rectangles[parent.id]); - insertions[parent.id] = parent; + if (rectangles[relation.id]) { + rtree.remove(rectangles[relation.id]); + insertions[relation.id] = relation; } - updateParents(parent, insertions, memo); + updateParents(relation, insertions, memo); }); } diff --git a/test/spec/core/tree.js b/test/spec/core/tree.js index 0fc227acc..debc96eb8 100644 --- a/test/spec/core/tree.js +++ b/test/spec/core/tree.js @@ -146,6 +146,21 @@ describe("iD.Tree", function() { expect(tree.intersects(extent, graph)).to.eql([]); }); + it("adjusts parent relations of parent ways when a member node is moved", function() { + var graph = iD.Graph(), + tree = iD.Tree(graph), + node = iD.Node({id: 'n', loc: [1, 1]}), + way = iD.Way({id: 'w', nodes: ['n']}), + relation = iD.Relation({members: [{type: 'multipolygon', id: 'w'}]}), + extent = iD.geo.Extent([0, 0], [2, 2]); + + graph = graph.replace(node).replace(way).replace(relation); + expect(tree.intersects(extent, graph)).to.eql([node, way, relation]); + + graph = graph.replace(node.move([3, 3])); + expect(tree.intersects(extent, graph)).to.eql([]); + }); + it("adjusts parent ways when a member node is removed", function() { var graph = iD.Graph(), tree = iD.Tree(graph),