Tree handles entities with missing children

This commit is contained in:
Ansis Brammanis
2013-02-13 10:23:30 -05:00
parent 6baf6a6dd4
commit 9c65e58cc1
5 changed files with 42 additions and 17 deletions

View File

@@ -225,21 +225,10 @@ iD.Graph.prototype = {
return this;
},
// get all objects that intersect an extent.
intersects: function(extent) {
var items = [];
for (var i in this.entities) {
var entity = this.entities[i];
if (entity && this.hasAllChildren(entity) && entity.intersects(extent, this)) {
items.push(entity);
}
}
return items;
},
hasAllChildren: function(entity) {
// we're only checking changed entities, since we assume fetched data
// must have all children present
var i;
if (this.entities.hasOwnProperty(entity.id)) {
if (entity.type === 'way') {
for (i = 0; i < entity.nodes.length; i++) {

View File

@@ -1,5 +1,5 @@
iD.History = function(context) {
var stack, index, tree;
var stack, index, tree,
imagery_used = 'Bing',
dispatch = d3.dispatch('change', 'undone', 'redone'),
lock = false;

View File

@@ -2,7 +2,10 @@ iD.Tree = function(graph) {
var rtree = new RTree(),
m = 1000 * 1000 * 100,
head = graph;
head = graph,
queuedCreated = [],
queuedModified = [],
x, y, dx, dy;
function extentRectangle(extent) {
x = m * extent[0][0],
@@ -29,7 +32,7 @@ iD.Tree = function(graph) {
rebase: function(entities) {
for (var i = 0; i < entities.length; i++) {
insert(graph.entities[entities[i]]);
insert(graph.entity(entities[i]), true);
}
return tree;
},
@@ -49,8 +52,21 @@ iD.Tree = function(graph) {
}
});
d3.values(diff.addParents(modified)).map(reinsert);
diff.created().forEach(insert);
var created = diff.created().concat(queuedCreated);
modified = d3.values(diff.addParents(modified)).concat(queuedModified);
queuedCreated = [];
queuedModified = [];
modified.forEach(function(d) {
if (head.hasAllChildren(d)) reinsert(d);
else queuedModified.push(d);
});
created.forEach(function(d) {
if (head.hasAllChildren(d)) insert(d);
else queuedCreated.push(d);
});
diff.deleted().forEach(remove);
graph = head;

View File

@@ -133,6 +133,7 @@
<script src='../js/id/core/node.js'></script>
<script src='../js/id/core/relation.js'></script>
<script src='../js/id/core/way.js'></script>
<script src='../js/id/core/tree.js'></script>
<script src='../js/id/connection.js'></script>
@@ -172,6 +173,7 @@
<script src="spec/core/relation.js"></script>
<script src="spec/core/history.js"></script>
<script src="spec/core/difference.js"></script>
<script src="spec/core/tree.js"></script>
<script src="spec/renderer/background.js"></script>
<script src="spec/renderer/map.js"></script>

18
test/spec/core/tree.js Normal file
View File

@@ -0,0 +1,18 @@
describe("iD.Tree", function() {
var tree;
beforeEach(function() {
tree = iD.Tree(iD.Graph());
});
describe("intersects", function() {
it("excludes entities with missing children, adds them when all are present", function() {
var way = iD.Way({id: 'w1', nodes: ['n']});
var g = tree.base().replace(way);
expect(tree.intersects(iD.geo.Extent([0, 0], [1, 1]), g)).to.eql([]);
var node = iD.Node({id: 'n', loc: [0.5, 0.5]});
g = tree.base().replace(node);
expect(tree.intersects(iD.geo.Extent([0, 0], [1, 1]), g)).to.eql([way, node]);
});
});
});