delete rel-way references; improved tests
parent
d6fcfc6c23
commit
c4a945750d
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -164,7 +164,6 @@ For:
|
|||
if err := osmCache.Coords.DeleteCoord(elem.Node.Id); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
diffCache.Coords.Delete(elem.Node.Id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
65
test/test.py
65
test/test.py
|
@ -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
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#!/bin/bash
|
||||
set -x
|
||||
set -x -e
|
||||
pushd ..
|
||||
go build
|
||||
popd
|
||||
|
|
Loading…
Reference in New Issue