in modules/core/graph.js [203:259]
_updateCalculated: function(oldentity, entity, parentWays, parentRels) {
parentWays = parentWays || this._parentWays;
parentRels = parentRels || this._parentRels;
var type = entity && entity.type || oldentity && oldentity.type;
var removed, added, i;
if (type === 'way') { // Update parentWays
if (oldentity && entity) {
removed = utilArrayDifference(oldentity.nodes, entity.nodes);
added = utilArrayDifference(entity.nodes, oldentity.nodes);
} else if (oldentity) {
removed = oldentity.nodes;
added = [];
} else if (entity) {
removed = [];
added = entity.nodes;
}
for (i = 0; i < removed.length; i++) {
// make a copy of prototype property, store as own property, and update..
parentWays[removed[i]] = new Set(parentWays[removed[i]]);
parentWays[removed[i]].delete(oldentity.id);
}
for (i = 0; i < added.length; i++) {
// make a copy of prototype property, store as own property, and update..
parentWays[added[i]] = new Set(parentWays[added[i]]);
parentWays[added[i]].add(entity.id);
}
} else if (type === 'relation') { // Update parentRels
// diff only on the IDs since the same entity can be a member multiple times with different roles
var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) { return m.id; }) : [];
var entityMemberIDs = entity ? entity.members.map(function(m) { return m.id; }) : [];
if (oldentity && entity) {
removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
} else if (oldentity) {
removed = oldentityMemberIDs;
added = [];
} else if (entity) {
removed = [];
added = entityMemberIDs;
}
for (i = 0; i < removed.length; i++) {
// make a copy of prototype property, store as own property, and update..
parentRels[removed[i]] = new Set(parentRels[removed[i]]);
parentRels[removed[i]].delete(oldentity.id);
}
for (i = 0; i < added.length; i++) {
// make a copy of prototype property, store as own property, and update..
parentRels[added[i]] = new Set(parentRels[added[i]]);
parentRels[added[i]].add(entity.id);
}
}
},