Delete orphaned relation members

This commit is contained in:
John Firebaugh
2013-02-27 16:32:52 -08:00
parent b751c1ece9
commit 7a1800fd68
2 changed files with 74 additions and 0 deletions
+15
View File
@@ -1,5 +1,11 @@
// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
iD.actions.DeleteRelation = function(relationId) {
function deleteEntity(entity, graph) {
return !graph.parentWays(entity).length &&
!graph.parentRelations(entity).length &&
!entity.hasInterestingTags();
}
return function(graph) {
var relation = graph.entity(relationId);
@@ -8,6 +14,15 @@ iD.actions.DeleteRelation = function(relationId) {
graph = graph.replace(parent.removeMember(relationId));
});
_.uniq(_.pluck(relation.members, 'id')).forEach(function(memberId) {
graph = graph.replace(relation.removeMember(memberId));
var entity = graph.entity(memberId);
if (deleteEntity(entity, graph)) {
graph = iD.actions.DeleteMultiple([memberId])(graph);
}
});
return graph.remove(relation);
};
};
+59
View File
@@ -14,4 +14,63 @@ describe("iD.actions.DeleteRelation", function () {
graph = action(iD.Graph([a, b, parent]));
expect(graph.entity(parent.id).members).to.eql([{ id: b.id }]);
});
it("deletes member nodes not referenced by another parent", function() {
var node = iD.Node(),
relation = iD.Relation({members: [{id: node.id}]}),
action = iD.actions.DeleteRelation(relation.id),
graph = action(iD.Graph([node, relation]));
expect(graph.entity(node.id)).to.be.undefined;
});
it("does not delete member nodes referenced by another parent", function() {
var node = iD.Node(),
way = iD.Way({nodes: [node.id]}),
relation = iD.Relation({members: [{id: node.id}]}),
action = iD.actions.DeleteRelation(relation.id),
graph = action(iD.Graph([node, way, relation]));
expect(graph.entity(node.id)).not.to.be.undefined;
});
it("does not delete member nodes with interesting tags", function() {
var node = iD.Node({tags: {highway: 'traffic_signals'}}),
relation = iD.Relation({members: [{id: node.id}]}),
action = iD.actions.DeleteRelation(relation.id),
graph = action(iD.Graph([node, relation]));
expect(graph.entity(node.id)).not.to.be.undefined;
});
it("deletes member ways not referenced by another parent", function() {
var way = iD.Way(),
relation = iD.Relation({members: [{id: way.id}]}),
action = iD.actions.DeleteRelation(relation.id),
graph = action(iD.Graph([way, relation]));
expect(graph.entity(way.id)).to.be.undefined;
});
it("does not delete member ways referenced by another parent", function() {
var way = iD.Way(),
relation1 = iD.Relation({members: [{id: way.id}]}),
relation2 = iD.Relation({members: [{id: way.id}]}),
action = iD.actions.DeleteRelation(relation1.id),
graph = action(iD.Graph([way, relation1, relation2]));
expect(graph.entity(way.id)).not.to.be.undefined;
});
it("does not delete member ways with interesting tags", function() {
var way = iD.Node({tags: {highway: 'residential'}}),
relation = iD.Relation({members: [{id: way.id}]}),
action = iD.actions.DeleteRelation(relation.id),
graph = action(iD.Graph([way, relation]));
expect(graph.entity(way.id)).not.to.be.undefined;
});
it("deletes nodes of deleted member ways", function() {
var node = iD.Node(),
way = iD.Way({nodes: [node.id]}),
relation = iD.Relation({members: [{id: way.id}]}),
action = iD.actions.DeleteRelation(relation.id),
graph = action(iD.Graph([node, way, relation]));
expect(graph.entity(node.id)).to.be.undefined;
});
});