insert rels with negative IDs to be able to distinguish rels from ways during delete

master
Oliver Tonnhofer 2013-11-07 16:09:08 +01:00
parent 063c48b8c3
commit 6ad5a535a1
5 changed files with 68 additions and 50 deletions

View File

@ -66,11 +66,13 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
return return
} }
if ok, matches := d.delDb.ProbePolygon(elem.OSMElem); ok { if ok, matches := d.delDb.ProbePolygon(elem.OSMElem); ok {
d.delDb.Delete(elem.Id, matches) d.delDb.Delete(-elem.Id, matches)
} else { } else {
// handle relations with tags from members by deleting // handle relations with tags from members by deleting
// from all tables // from all tables
d.delDb.DeleteElem(elem.OSMElem) e := element.OSMElem(elem.OSMElem)
e.Id = -e.Id
d.delDb.DeleteElem(e)
} }
if deleteRefs { if deleteRefs {

View File

@ -157,7 +157,7 @@ def test_import():
def test_imported_landusage(): def test_imported_landusage():
"""Multipolygon relation is inserted""" """Multipolygon relation is inserted"""
assert_cached_node(1001, (13, 47.5)) assert_cached_node(1001, (13, 47.5))
landusage_1001 = query_row(db_conf, 'osm_landusages', 1001) landusage_1001 = query_row(db_conf, 'osm_landusages', -1001)
# point in polygon # point in polygon
assert landusage_1001['geometry'].intersects(merc_point(13.4, 47.5)) assert landusage_1001['geometry'].intersects(merc_point(13.4, 47.5))
# hole in multipolygon relation # hole in multipolygon relation
@ -178,28 +178,28 @@ def test_landusage_to_waterarea_1():
assert_cached_way(13001) assert_cached_way(13001)
assert not query_row(db_conf, 'osm_waterareas', 11001) assert not query_row(db_conf, 'osm_waterareas', 11001)
assert not query_row(db_conf, 'osm_waterareas', 12001) assert not query_row(db_conf, 'osm_waterareas', -12001)
assert not query_row(db_conf, 'osm_waterareas', 13001) assert not query_row(db_conf, 'osm_waterareas', -13001)
assert not query_row(db_conf, 'osm_waterareas_gen0', 11001) assert not query_row(db_conf, 'osm_waterareas_gen0', 11001)
assert not query_row(db_conf, 'osm_waterareas_gen0', 12001) assert not query_row(db_conf, 'osm_waterareas_gen0', -12001)
assert not query_row(db_conf, 'osm_waterareas_gen0', 13001) assert not query_row(db_conf, 'osm_waterareas_gen0', -13001)
assert not query_row(db_conf, 'osm_waterareas_gen1', 11001) assert not query_row(db_conf, 'osm_waterareas_gen1', 11001)
assert not query_row(db_conf, 'osm_waterareas_gen1', 12001) assert not query_row(db_conf, 'osm_waterareas_gen1', -12001)
assert not query_row(db_conf, 'osm_waterareas_gen1', 13001) assert not query_row(db_conf, 'osm_waterareas_gen1', -13001)
assert query_row(db_conf, 'osm_landusages', 11001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages', 11001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages', 12001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages', -12001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages', 13001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages', -13001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen0', 11001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages_gen0', 11001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen0', 12001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages_gen0', -12001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen0', 13001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages_gen0', -13001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen1', 11001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages_gen1', 11001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen1', 12001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages_gen1', -12001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen1', 13001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages_gen1', -13001)['type'] == 'park'
def test_changed_hole_tags_1(): def test_changed_hole_tags_1():
@ -208,18 +208,19 @@ def test_changed_hole_tags_1():
assert_cached_way(14011) assert_cached_way(14011)
assert not query_row(db_conf, 'osm_waterareas', 14011) assert not query_row(db_conf, 'osm_waterareas', 14011)
assert query_row(db_conf, 'osm_landusages', 14001)['type'] == 'park' 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(): def test_split_outer_multipolygon_way_1():
"""Single outer way of multipolygon was inserted.""" """Single outer way of multipolygon was inserted."""
park_15001 = query_row(db_conf, 'osm_landusages', 15001) park_15001 = query_row(db_conf, 'osm_landusages', -15001)
assert park_15001['type'] == 'park' assert park_15001['type'] == 'park'
assert_almost_equal(park_15001['geometry'].area, 9816216452, -1) assert_almost_equal(park_15001['geometry'].area, 9816216452, -1)
assert query_row(db_conf, 'osm_roads', 15002) == None assert query_row(db_conf, 'osm_roads', 15002) == None
def test_merge_outer_multipolygon_way_1(): def test_merge_outer_multipolygon_way_1():
"""Splitted outer way of multipolygon was inserted.""" """Splitted outer way of multipolygon was inserted."""
park_16001 = query_row(db_conf, 'osm_landusages', 16001) park_16001 = query_row(db_conf, 'osm_landusages', -16001)
assert park_16001['type'] == 'park' assert park_16001['type'] == 'park'
assert_almost_equal(park_16001['geometry'].area, 12779350582, -1) assert_almost_equal(park_16001['geometry'].area, 12779350582, -1)
assert query_row(db_conf, 'osm_roads', 16002)['type'] == 'residential' assert query_row(db_conf, 'osm_roads', 16002)['type'] == 'residential'
@ -233,22 +234,22 @@ def test_node_way_ref_after_delete_1():
assert query_row(db_conf, 'osm_barrierpoints', 20001)['type'] == 'block' assert query_row(db_conf, 'osm_barrierpoints', 20001)['type'] == 'block'
def test_way_rel_ref_after_delete_1(): def test_way_rel_ref_after_delete_1():
"""Ways refereces relation""" """Ways references relation"""
data = cache_query(ways=[21001], deps=True) data = cache_query(ways=[21001], deps=True)
assert data['ways']['21001']['relations'].keys() == ['21001'] assert data['ways']['21001']['relations'].keys() == ['21001']
assert query_row(db_conf, 'osm_roads', 21001)['type'] == 'residential' assert query_row(db_conf, 'osm_roads', 21001)['type'] == 'residential'
assert query_row(db_conf, 'osm_landusages', 21001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages', -21001)['type'] == 'park'
def test_relation_way_not_inserted(): def test_relation_way_not_inserted():
"""Part of relation was inserted only once.""" """Part of relation was inserted only once."""
park = query_row(db_conf, 'osm_landusages', 9001) park = query_row(db_conf, 'osm_landusages', -9001)
assert park['type'] == 'park' assert park['type'] == 'park'
assert park['name'] == 'rel 9001' assert park['name'] == 'rel 9001'
assert query_row(db_conf, 'osm_landusages', 9009) == None assert query_row(db_conf, 'osm_landusages', 9009) == None
def test_relation_way_inserted(): def test_relation_way_inserted():
"""Part of relation was inserted twice.""" """Part of relation was inserted twice."""
park = query_row(db_conf, 'osm_landusages', 8001) park = query_row(db_conf, 'osm_landusages', -8001)
assert park['type'] == 'park' assert park['type'] == 'park'
assert park['name'] == 'rel 8001' assert park['name'] == 'rel 8001'
assert query_row(db_conf, 'osm_roads', 8009)["type"] == 'residential' assert query_row(db_conf, 'osm_roads', 8009)["type"] == 'residential'
@ -279,17 +280,19 @@ def test_residential_to_secondary():
def test_relation_before_remove(): def test_relation_before_remove():
"""Relation and way is inserted.""" """Relation and way is inserted."""
assert query_row(db_conf, 'osm_buildings', 50011)['type'] == 'yes' assert query_row(db_conf, 'osm_buildings', 50011)['type'] == 'yes'
assert query_row(db_conf, 'osm_landusages', 50021)['type'] == 'park' assert query_row(db_conf, 'osm_landusages', -50021)['type'] == 'park'
def test_relation_without_tags(): def test_relation_without_tags():
"""Relation without tags is inserted.""" """Relation without tags is inserted."""
assert query_row(db_conf, 'osm_buildings', 50111) == None assert query_row(db_conf, 'osm_buildings', 50111) == None
assert query_row(db_conf, 'osm_buildings', 50121)['type'] == 'yes' assert query_row(db_conf, 'osm_buildings', -50121)['type'] == 'yes'
def test_duplicate_ids(): def test_duplicate_ids():
"""Relation/way with same ID is inserted.""" """Relation/way with same ID is inserted."""
assert len(query_row(db_conf, 'osm_buildings', 51001)) == 2 assert query_row(db_conf, 'osm_buildings', 51001)['type'] == 'way'
assert len(query_row(db_conf, 'osm_buildings', 51011)) == 2 assert query_row(db_conf, 'osm_buildings', -51001)['type'] == 'mp'
assert query_row(db_conf, 'osm_buildings', 51011)['type'] == 'way'
assert query_row(db_conf, 'osm_buildings', -51011)['type'] == 'mp'
####################################################################### #######################################################################
def test_update(): def test_update():
@ -300,7 +303,7 @@ def test_update():
def test_updated_landusage(): def test_updated_landusage():
"""Multipolygon relation was modified""" """Multipolygon relation was modified"""
assert_cached_node(1001, (13.5, 47.5)) assert_cached_node(1001, (13.5, 47.5))
landusage_1001 = query_row(db_conf, 'osm_landusages', 1001) landusage_1001 = query_row(db_conf, 'osm_landusages', -1001)
# point not in polygon after update # point not in polygon after update
assert not landusage_1001['geometry'].intersects(merc_point(13.4, 47.5)) assert not landusage_1001['geometry'].intersects(merc_point(13.4, 47.5))
@ -309,6 +312,7 @@ def test_partial_delete():
assert_cached_node(2001) assert_cached_node(2001)
assert_cached_way(2001) assert_cached_way(2001)
assert_cached_way(2002) assert_cached_way(2002)
assert not query_row(db_conf, 'osm_landusages', -2001)
assert not query_row(db_conf, 'osm_landusages', 2001) assert not query_row(db_conf, 'osm_landusages', 2001)
def test_updated_nodes(): def test_updated_nodes():
@ -328,28 +332,28 @@ def test_landusage_to_waterarea_2():
assert_cached_way(13001) assert_cached_way(13001)
assert not query_row(db_conf, 'osm_landusages', 11001) assert not query_row(db_conf, 'osm_landusages', 11001)
assert not query_row(db_conf, 'osm_landusages', 12001) assert not query_row(db_conf, 'osm_landusages', -12001)
assert not query_row(db_conf, 'osm_landusages', 13001) assert not query_row(db_conf, 'osm_landusages', -13001)
assert not query_row(db_conf, 'osm_landusages_gen0', 11001) assert not query_row(db_conf, 'osm_landusages_gen0', 11001)
assert not query_row(db_conf, 'osm_landusages_gen0', 12001) assert not query_row(db_conf, 'osm_landusages_gen0', -12001)
assert not query_row(db_conf, 'osm_landusages_gen0', 13001) assert not query_row(db_conf, 'osm_landusages_gen0', -13001)
assert not query_row(db_conf, 'osm_landusages_gen1', 11001) assert not query_row(db_conf, 'osm_landusages_gen1', 11001)
assert not query_row(db_conf, 'osm_landusages_gen1', 12001) assert not query_row(db_conf, 'osm_landusages_gen1', -12001)
assert not query_row(db_conf, 'osm_landusages_gen1', 13001) assert not query_row(db_conf, 'osm_landusages_gen1', -13001)
assert query_row(db_conf, 'osm_waterareas', 11001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas', 11001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas', 12001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas', -12001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas', 13001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas', -13001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen0', 11001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas_gen0', 11001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen0', 12001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas_gen0', -12001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen0', 13001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas_gen0', -13001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen1', 11001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas_gen1', 11001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen1', 12001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas_gen1', -12001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen1', 13001)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas_gen1', -13001)['type'] == 'water'
def test_changed_hole_tags_2(): def test_changed_hole_tags_2():
"""Newly tagged hole is inserted""" """Newly tagged hole is inserted"""
@ -357,9 +361,9 @@ def test_changed_hole_tags_2():
assert_cached_way(14011) assert_cached_way(14011)
assert query_row(db_conf, 'osm_waterareas', 14011)['type'] == 'water' assert query_row(db_conf, 'osm_waterareas', 14011)['type'] == 'water'
assert query_row(db_conf, 'osm_landusages', 14001)['type'] == 'park' assert query_row(db_conf, 'osm_landusages', -14001)['type'] == 'park'
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) assert_almost_equal(query_row(db_conf, 'osm_waterareas', 14011)['geometry'].area, 26672000000, -6)
assert_almost_equal(query_row(db_conf, 'osm_landusages', -14001)['geometry'].area, 10373600000, -6)
def test_split_outer_multipolygon_way_2(): def test_split_outer_multipolygon_way_2():
"""Splitted outer way of multipolygon was inserted""" """Splitted outer way of multipolygon was inserted"""
@ -367,7 +371,8 @@ def test_split_outer_multipolygon_way_2():
assert data['ways']['15001']['relations'].keys() == ['15001'] assert data['ways']['15001']['relations'].keys() == ['15001']
assert data['ways']['15002']['relations'].keys() == ['15001'] assert data['ways']['15002']['relations'].keys() == ['15001']
park_15001 = query_row(db_conf, 'osm_landusages', 15001) assert query_row(db_conf, 'osm_landusages', 15001) == None
park_15001 = query_row(db_conf, 'osm_landusages', -15001)
assert park_15001['type'] == 'park' assert park_15001['type'] == 'park'
assert_almost_equal(park_15001['geometry'].area, 9816216452, -1) assert_almost_equal(park_15001['geometry'].area, 9816216452, -1)
assert query_row(db_conf, 'osm_roads', 15002)['type'] == 'residential' assert query_row(db_conf, 'osm_roads', 15002)['type'] == 'residential'
@ -381,12 +386,12 @@ def test_merge_outer_multipolygon_way_2():
data = cache_query(relations=[16001], full=True) data = cache_query(relations=[16001], full=True)
assert sorted(data['relations']['16001']['ways'].keys()) == ['16001', '16011'] assert sorted(data['relations']['16001']['ways'].keys()) == ['16001', '16011']
park_16001 = query_row(db_conf, 'osm_landusages', 16001) assert query_row(db_conf, 'osm_landusages', 16001) == None
park_16001 = query_row(db_conf, 'osm_landusages', -16001)
assert park_16001['type'] == 'park' assert park_16001['type'] == 'park'
assert_almost_equal(park_16001['geometry'].area, 12779350582, -1) assert_almost_equal(park_16001['geometry'].area, 12779350582, -1)
assert query_row(db_conf, 'osm_roads', 16002) == None assert query_row(db_conf, 'osm_roads', 16002) == None
def test_node_way_ref_after_delete_2(): def test_node_way_ref_after_delete_2():
"""Node does not referece deleted way""" """Node does not referece deleted way"""
data = cache_query(nodes=[20001, 20002], deps=True) data = cache_query(nodes=[20001, 20002], deps=True)
@ -395,17 +400,16 @@ def test_node_way_ref_after_delete_2():
assert query_row(db_conf, 'osm_roads', 20001) == None assert query_row(db_conf, 'osm_roads', 20001) == None
assert query_row(db_conf, 'osm_barrierpoints', 20001)['type'] == 'block' assert query_row(db_conf, 'osm_barrierpoints', 20001)['type'] == 'block'
def test_way_rel_ref_after_delete_2(): def test_way_rel_ref_after_delete_2():
"""Way does not referece deleted relation""" """Way does not referece deleted relation"""
data = cache_query(ways=[21001], deps=True) data = cache_query(ways=[21001], deps=True)
assert 'relations' not in data['ways']['21001'] assert 'relations' not in data['ways']['21001']
assert query_row(db_conf, 'osm_roads', 21001)['type'] == 'residential' assert query_row(db_conf, 'osm_roads', 21001)['type'] == 'residential'
assert query_row(db_conf, 'osm_landusages', 21001) == None assert query_row(db_conf, 'osm_landusages', 21001) == None
assert query_row(db_conf, 'osm_landusages', -21001) == None
def test_residential_to_secondary2(): def test_residential_to_secondary2():
"""New secondary (from residential) is now in roads_gen0/1.""" """New secondary (from residential) is now in roads_gen0/1."""
assert query_row(db_conf, 'osm_roads', 40001)['type'] == 'secondary' assert query_row(db_conf, 'osm_roads', 40001)['type'] == 'secondary'
assert query_row(db_conf, 'osm_roads_gen0', 40001)['type'] == 'secondary' assert query_row(db_conf, 'osm_roads_gen0', 40001)['type'] == 'secondary'
assert query_row(db_conf, 'osm_roads_gen1', 40001)['type'] == 'secondary' assert query_row(db_conf, 'osm_roads_gen1', 40001)['type'] == 'secondary'
@ -414,6 +418,7 @@ def test_relation_after_remove():
"""Relation is deleted and way is still present.""" """Relation is deleted and way is still present."""
assert query_row(db_conf, 'osm_buildings', 50011)['type'] == 'yes' assert query_row(db_conf, 'osm_buildings', 50011)['type'] == 'yes'
assert query_row(db_conf, 'osm_landusages', 50021) == None assert query_row(db_conf, 'osm_landusages', 50021) == None
assert query_row(db_conf, 'osm_landusages', -50021) == None
def test_relation_without_tags2(): def test_relation_without_tags2():
"""Relation without tags is removed.""" """Relation without tags is removed."""
@ -422,3 +427,11 @@ def test_relation_without_tags2():
assert query_row(db_conf, 'osm_buildings', 50111)['type'] == 'yes' assert query_row(db_conf, 'osm_buildings', 50111)['type'] == 'yes'
assert query_row(db_conf, 'osm_buildings', 50121) == None assert query_row(db_conf, 'osm_buildings', 50121) == None
assert query_row(db_conf, 'osm_buildings', -50121) == None
def test_duplicate_ids2():
"""Only relation/way with same ID was deleted."""
assert query_row(db_conf, 'osm_buildings', 51001)['type'] == 'way'
assert query_row(db_conf, 'osm_buildings', -51001) == None
assert query_row(db_conf, 'osm_buildings', -51011)['type'] == 'mp'
assert query_row(db_conf, 'osm_buildings', 51011) == None

View File

@ -162,7 +162,7 @@
<!-- test removing of duplicate ids --> <!-- test removing of duplicate ids -->
<delete> <delete>
<relation id="51001" /> <relation id="51001" />
<way id="51101" /> <way id="51011" />
</delete> </delete>

View File

@ -649,7 +649,7 @@
<nd ref="51003"/> <nd ref="51003"/>
<nd ref="51004"/> <nd ref="51004"/>
<nd ref="51001"/> <nd ref="51001"/>
<tag k="building" v="yes"/> <tag k="building" v="way"/>
</way> </way>
<way id="51002" version="1" timestamp="2011-11-11T00:11:11Z"> <way id="51002" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="51011"/> <nd ref="51011"/>
@ -664,7 +664,7 @@
<nd ref="51003"/> <nd ref="51003"/>
<nd ref="51004"/> <nd ref="51004"/>
<nd ref="51001"/> <nd ref="51001"/>
<tag k="building" v="yes"/> <tag k="building" v="way"/>
</way> </way>
<way id="51012" version="1" timestamp="2011-11-11T00:11:11Z"> <way id="51012" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="51011"/> <nd ref="51011"/>

View File

@ -115,11 +115,14 @@ NextRel:
} }
for _, g := range parts { for _, g := range parts {
rel := element.Relation(*r) rel := element.Relation(*r)
rel.Id = -r.Id
rel.Geom = &element.Geometry{g, geos.AsEwkbHex(g)} rel.Geom = &element.Geometry{g, geos.AsEwkbHex(g)}
rw.inserter.InsertPolygon(rel.OSMElem, matches) rw.inserter.InsertPolygon(rel.OSMElem, matches)
} }
} else { } else {
rw.inserter.InsertPolygon(r.OSMElem, matches) rel := element.Relation(*r)
rel.Id = -r.Id
rw.inserter.InsertPolygon(rel.OSMElem, matches)
} }
err = rw.osmCache.InsertedWays.PutMembers(r.Members) err = rw.osmCache.InsertedWays.PutMembers(r.Members)
if err != nil { if err != nil {