mirror of
https://github.com/FoggedLens/iD.git
synced 2026-05-14 21:28:11 +02:00
Delete orphaned relation members
This commit is contained in:
@@ -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);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user