delete rel-way references; improved tests

master
Oliver Tonnhofer 2013-08-07 13:09:34 +02:00
parent d6fcfc6c23
commit c4a945750d
6 changed files with 231 additions and 17 deletions

View File

@ -40,7 +40,7 @@ func (d *Deleter) SetExpireTiles(expireTiles *expire.Tiles) {
d.expireTiles = expireTiles
}
func (d *Deleter) deleteRelation(id int64) {
func (d *Deleter) deleteRelation(id int64, deleteRefs bool) {
elem, err := d.osmCache.Relations.GetRelation(id)
if err != nil {
if err == cache.NotFound {
@ -58,6 +58,15 @@ func (d *Deleter) deleteRelation(id int64) {
d.delDb.Delete(m.Table.Name, elem.Id)
deleted = true
}
if deleted && deleteRefs {
for _, m := range elem.Members {
if m.Type == element.WAY {
d.diffCache.Ways.DeleteRef(m.Id, id)
}
}
}
d.osmCache.InsertedWays.DeleteMembers(elem.Members)
if deleted && d.expireTiles != nil {
for _, m := range elem.Members {
@ -74,7 +83,7 @@ func (d *Deleter) deleteRelation(id int64) {
}
}
func (d *Deleter) deleteWay(id int64, forMod bool) {
func (d *Deleter) deleteWay(id int64, deleteRefs bool) {
elem, err := d.osmCache.Ways.GetWay(id)
if err != nil {
if err == cache.NotFound {
@ -96,7 +105,7 @@ func (d *Deleter) deleteWay(id int64, forMod bool) {
d.delDb.Delete(m.Table.Name, elem.Id)
deleted = true
}
if deleted && !forMod {
if deleted && deleteRefs {
for _, n := range elem.Refs {
d.diffCache.Coords.DeleteRef(n, id)
}
@ -129,6 +138,7 @@ func (d *Deleter) deleteNode(id int64) {
d.delDb.Delete(m.Table.Name, elem.Id)
deleted = true
}
if deleted && d.expireTiles != nil {
d.expireTiles.ExpireFromNodes([]element.Node{*elem})
}
@ -141,14 +151,14 @@ func (d *Deleter) Delete(delElem parser.DiffElem) {
}
if delElem.Rel != nil {
d.deleteRelation(delElem.Rel.Id)
d.deleteRelation(delElem.Rel.Id, true)
} else if delElem.Way != nil {
d.deleteWay(delElem.Way.Id, false)
d.deleteWay(delElem.Way.Id, true)
if delElem.Mod {
dependers := d.diffCache.Ways.Get(delElem.Way.Id)
for _, rel := range dependers {
d.deleteRelation(rel)
d.deleteRelation(rel, false)
}
}
} else if delElem.Node != nil {
@ -156,12 +166,15 @@ func (d *Deleter) Delete(delElem parser.DiffElem) {
if delElem.Mod {
dependers := d.diffCache.Coords.Get(delElem.Node.Id)
for _, way := range dependers {
d.deleteWay(way, true)
d.deleteWay(way, false)
dependers := d.diffCache.Ways.Get(way)
for _, rel := range dependers {
d.deleteRelation(rel)
d.deleteRelation(rel, false)
}
}
}
if !delElem.Add {
d.diffCache.Coords.Delete(delElem.Node.Id)
}
}
}

View File

@ -164,7 +164,6 @@ For:
if err := osmCache.Coords.DeleteCoord(elem.Node.Id); err != nil {
log.Fatal(err)
}
diffCache.Coords.Delete(elem.Node.Id)
}
}
}

View File

@ -3,12 +3,12 @@
<modify>
<node id="1001" version="2" lat="47.5" lon="13.5"/>
</modify>
<add>
<create>
<node id="10001" version="2" lat="40.0" lon="10.0">
<tag k="name" v="Bar"/>
<tag k="place" v="village"/>
</node>
</add>
</create>
<modify>
<!-- modify but not present in initial import -->
<node id="10002" version="2" lat="40.0" lon="10.1">
@ -78,10 +78,65 @@
</relation>
</modify>
<!-- test split relation way -->
<create>
<way id="15002" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="15003"/>
<nd ref="15004"/>
<nd ref="15001"/>
<tag k="name" v="way 15002"/>
<tag k="highway" v="residential"/>
</way>
</create>
<modify>
<way id="15001" version="2" timestamp="2011-11-11T00:11:11Z">
<nd ref="15001"/>
<nd ref="15002"/>
<nd ref="15003"/>
<tag k="name" v="way 15001"/>
</way>
<relation id="15001" version="2" timestamp="2011-11-11T00:11:11Z">
<member type="way" ref="15001" role="outer"/>
<member type="way" ref="15002" role="outer"/>
<member type="way" ref="15011" role="inner"/>
<tag k="type" v="multipolygon"/>
<tag k="landuse" v="park"/>
</relation>
</modify>
<!-- test merge relation way -->
<delete>
<way id="16002" version="2" timestamp="2011-11-11T00:11:11Z"/>
</delete>
<modify>
<way id="16001" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="16001"/>
<nd ref="16002"/>
<nd ref="16003"/>
<nd ref="16004"/>
<nd ref="16001"/>
<tag k="name" v="way 16001"/>
</way>
<relation id="16001" version="2" timestamp="2011-11-11T00:11:11Z">
<member type="way" ref="16001" role="outer"/>
<member type="way" ref="16011" role="inner"/>
<tag k="type" v="multipolygon"/>
<tag k="landuse" v="park"/>
</relation>
</modify>
<!-- test that node (n:20001) does not reference way (w:20001) after it was deleted -->
<delete>
<node id="20002" />
<way id="20001" />
</delete>
<!-- test that way (w:21001) does not reference way (r:21001) after it was deleted -->
<delete>
<relation id="21001" />
</delete>
</osmChange>

View File

@ -388,6 +388,79 @@
<tag k="type" v="multipolygon"/>
</relation>
<!-- test split relation way -->
<node id="15001" version="1" timestamp="2011-11-11T00:11:11Z" lat="44" lon="89"/>
<node id="15002" version="1" timestamp="2011-11-11T00:11:11Z" lat="44" lon="90"/>
<node id="15003" version="1" timestamp="2011-11-11T00:11:11Z" lat="46" lon="90"/>
<node id="15004" version="1" timestamp="2011-11-11T00:11:11Z" lat="46" lon="89"/>
<node id="15011" version="1" timestamp="2011-11-11T00:11:11Z" lat="44.1" lon="89.1"/>
<node id="15012" version="1" timestamp="2011-11-11T00:11:11Z" lat="44.1" lon="89.9"/>
<node id="15013" version="1" timestamp="2011-11-11T00:11:11Z" lat="45.9" lon="89.9"/>
<node id="15014" version="1" timestamp="2011-11-11T00:11:11Z" lat="45.9" lon="89.1"/>
<way id="15001" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="15001"/>
<nd ref="15002"/>
<nd ref="15003"/>
<nd ref="15004"/>
<nd ref="15001"/>
<tag k="name" v="way 15001"/>
<tag k="landuse" v="park"/>
</way>
<way id="15011" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="15011"/>
<nd ref="15012"/>
<nd ref="15013"/>
<nd ref="15014"/>
<nd ref="15011"/>
<tag k="name" v="way 15011"/>
</way>
<relation id="15001" version="1" timestamp="2011-11-11T00:11:11Z">
<member type="way" ref="15001" role="outer"/>
<member type="way" ref="15011" role="inner"/>
<tag k="type" v="multipolygon"/>
</relation>
<!-- test merge relation way -->
<node id="16001" version="1" timestamp="2011-11-11T00:11:11Z" lat="41" lon="89"/>
<node id="16002" version="1" timestamp="2011-11-11T00:11:11Z" lat="41" lon="90"/>
<node id="16003" version="1" timestamp="2011-11-11T00:11:11Z" lat="44" lon="90"/>
<node id="16004" version="1" timestamp="2011-11-11T00:11:11Z" lat="44" lon="89"/>
<node id="16011" version="1" timestamp="2011-11-11T00:11:11Z" lat="41.1" lon="89.1"/>
<node id="16012" version="1" timestamp="2011-11-11T00:11:11Z" lat="41.1" lon="89.9"/>
<node id="16013" version="1" timestamp="2011-11-11T00:11:11Z" lat="43.9" lon="89.9"/>
<node id="16014" version="1" timestamp="2011-11-11T00:11:11Z" lat="43.9" lon="89.1"/>
<way id="16002" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="16003"/>
<nd ref="16004"/>
<nd ref="16001"/>
<tag k="name" v="way 16002"/>
<tag k="highway" v="residential"/>
</way>
<way id="16001" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="16001"/>
<nd ref="16002"/>
<nd ref="16003"/>
<tag k="name" v="way 16001"/>
</way>
<way id="16011" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="16011"/>
<nd ref="16012"/>
<nd ref="16013"/>
<nd ref="16014"/>
<nd ref="16011"/>
<tag k="name" v="way 16011"/>
</way>
<relation id="16001" version="1" timestamp="2011-11-11T00:11:11Z">
<member type="way" ref="16001" role="outer"/>
<member type="way" ref="16002" role="outer"/>
<member type="way" ref="16011" role="inner"/>
<tag k="type" v="multipolygon"/>
<tag k="landuse" v="park"/>
</relation>
<!-- test that node (n:20001) does not reference way (w:20001) after it was deleted -->
<node id="20001" version="1" timestamp="2011-11-11T00:11:11Z" lat="30" lon="10">
<tag k="name" v="way 14001"/>
@ -401,4 +474,23 @@
</way>
<!-- test that way (w:21001) does not reference way (r:21001) after it was deleted -->
<node id="21001" version="1" timestamp="2011-11-11T00:11:11Z" lat="32" lon="10"/>
<node id="21002" version="1" timestamp="2011-11-11T00:11:11Z" lat="32" lon="11"/>
<node id="21003" version="1" timestamp="2011-11-11T00:11:11Z" lat="34" lon="10"/>
<node id="21004" version="1" timestamp="2011-11-11T00:11:11Z" lat="34" lon="11"/>
<way id="21001" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="21001"/>
<nd ref="21002"/>
<nd ref="21003"/>
<nd ref="21004"/>
<nd ref="21001"/>
<tag k="highway" v="residential"/>
</way>
<relation id="21001" version="1" timestamp="2011-11-11T00:11:11Z">
<member type="way" ref="21001" role="outer"/>
<tag k="type" v="multipolygon"/>
<tag k="landuse" v="park"/>
</relation>
</osm>

View File

@ -95,7 +95,7 @@ def cache_query(nodes='', ways='', relations='', deps='', full=''):
if ways:
ways = '-way ' + ','.join(map(str, ways))
if relations:
relations = '-rel' + ','.join(map(str, relations))
relations = '-rel ' + ','.join(map(str, relations))
if deps:
deps = '-deps'
if full:
@ -189,14 +189,35 @@ def test_changed_hole_tags_1():
assert not query_row(db_conf, 'osm_waterareas', 14011)
assert query_row(db_conf, 'osm_landusages', 14001)['type'] == 'park'
def test_split_outer_multipolygon_way_1():
"""Single outer way of multipolygon was inserted."""
park_15001 = query_row(db_conf, 'osm_landusages', 15001)
assert park_15001['type'] == 'park'
assert_almost_equal(park_15001['geometry'].area, 9816216452, -1)
assert query_row(db_conf, 'osm_roads', 15002) == None
def test_merge_outer_multipolygon_way_1():
"""Splitted outer way of multipolygon was inserted."""
park_16001 = query_row(db_conf, 'osm_landusages', 16001)
assert park_16001['type'] == 'park'
assert_almost_equal(park_16001['geometry'].area, 12779350582, -1)
assert query_row(db_conf, 'osm_roads', 16002)['type'] == 'residential'
def test_node_way_ref_after_delete_1():
"""Nodes referece way"""
"""Nodes refereces way"""
data = cache_query(nodes=[20001, 20002], deps=True)
assert '20001' in data['nodes']['20001']['ways']
assert '20001' in data['nodes']['20002']['ways']
assert query_row(db_conf, 'osm_roads', 20001)['type'] == 'residential'
assert query_row(db_conf, 'osm_barrierpoints', 20001)['type'] == 'block'
def test_way_rel_ref_after_delete_1():
"""Ways refereces relation"""
data = cache_query(ways=[21001], deps=True)
assert data['ways']['21001']['relations'].keys() == ['21001']
assert query_row(db_conf, 'osm_roads', 21001)['type'] == 'residential'
assert query_row(db_conf, 'osm_landusages', 21001)['type'] == 'park'
#######################################################################
def test_update():
@ -225,8 +246,8 @@ def test_updated_nodes():
assert_cached_node(10002, (10.1, 40.0))
place_10001 = query_row(db_conf, 'osm_places', 10001)
assert place_10001['name'] == 'Bar', place_10001
place_10001 = query_row(db_conf, 'osm_places', 10002)
assert place_10001['name'] == 'Baz', place_10001
place_10002 = query_row(db_conf, 'osm_places', 10002)
assert place_10002['name'] == 'Baz', place_10002
def test_landusage_to_waterarea_2():
"""Parks converted to water moved from landusages to waterareas"""
@ -253,11 +274,45 @@ def test_changed_hole_tags_2():
assert_almost_equal(query_row(db_conf, 'osm_landusages', 14001)['geometry'].area, 10373600000, -6)
assert_almost_equal(query_row(db_conf, 'osm_waterareas', 14011)['geometry'].area, 26672000000, -6)
def test_split_outer_multipolygon_way_2():
"""Splitted outer way of multipolygon was inserted"""
data = cache_query(ways=[15001, 15002], deps=True)
assert data['ways']['15001']['relations'].keys() == ['15001']
assert data['ways']['15002']['relations'].keys() == ['15001']
park_15001 = query_row(db_conf, 'osm_landusages', 15001)
assert park_15001['type'] == 'park'
assert_almost_equal(park_15001['geometry'].area, 9816216452, -1)
assert query_row(db_conf, 'osm_roads', 15002)['type'] == 'residential'
def test_merge_outer_multipolygon_way_2():
"""Merged outer way of multipolygon was inserted"""
data = cache_query(ways=[16001, 16002], deps=True)
assert data['ways']['16001']['relations'].keys() == ['16001']
assert data['ways']['16002'] == None
data = cache_query(relations=[16001], full=True)
assert sorted(data['relations']['16001']['ways'].keys()) == ['16001', '16011']
park_16001 = query_row(db_conf, 'osm_landusages', 16001)
assert park_16001['type'] == 'park'
assert_almost_equal(park_16001['geometry'].area, 12779350582, -1)
assert query_row(db_conf, 'osm_roads', 16002) == None
def test_node_way_ref_after_delete_2():
"""Nodes does not referece deleted way"""
"""Node does not referece deleted way"""
data = cache_query(nodes=[20001, 20002], deps=True)
assert 'ways' not in data['nodes']['20001']
assert data['nodes']['20002'] == None
assert query_row(db_conf, 'osm_roads', 20001) == None
assert query_row(db_conf, 'osm_barrierpoints', 20001)['type'] == 'block'
def test_way_rel_ref_after_delete_2():
"""Way does not referece deleted relation"""
data = cache_query(ways=[21001], deps=True)
assert 'relations' not in data['ways']['21001']
assert query_row(db_conf, 'osm_roads', 21001)['type'] == 'residential'
assert query_row(db_conf, 'osm_landusages', 21001) == None

View File

@ -1,5 +1,5 @@
#!/bin/bash
set -x
set -x -e
pushd ..
go build
popd