From d5e427289fc13e832e37a7f9b15d7f1bdb368e79 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 4 Apr 2019 10:02:15 -0400 Subject: [PATCH] Avoid delete/reinsert on the coreTree when not needed (re: #6140) --- modules/core/tree.js | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/modules/core/tree.js b/modules/core/tree.js index 8ee81e6a1..179cc7d1b 100644 --- a/modules/core/tree.js +++ b/modules/core/tree.js @@ -66,26 +66,35 @@ export function coreTree(head) { tree.intersects = function(extent, graph) { if (graph !== head) { var diff = coreDifference(head, graph); - var insertions = {}; + var changed = diff.didChange; - head = graph; + if (changed.addition || changed.deletion || changed.geometry) { + var insertions = {}; + head = graph; - diff.deleted().forEach(function(entity) { - rtree.remove(bboxes[entity.id]); - delete bboxes[entity.id]; - }); + if (changed.deletion) { + diff.deleted().forEach(function(entity) { + rtree.remove(bboxes[entity.id]); + delete bboxes[entity.id]; + }); + } - diff.modified().forEach(function(entity) { - rtree.remove(bboxes[entity.id]); - insertions[entity.id] = entity; - updateParents(entity, insertions, {}); - }); + if (changed.geometry) { + diff.modified().forEach(function(entity) { + rtree.remove(bboxes[entity.id]); + insertions[entity.id] = entity; + updateParents(entity, insertions, {}); + }); + } - diff.created().forEach(function(entity) { - insertions[entity.id] = entity; - }); + if (changed.addition) { + diff.created().forEach(function(entity) { + insertions[entity.id] = entity; + }); + } - rtree.load(Object.values(insertions).map(entityBBox)); + rtree.load(Object.values(insertions).map(entityBBox)); + } } return rtree.search(extent.bbox())