_updateCalculated: function()

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);
            }
        }
    },