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
}
if ok, matches := d.delDb.ProbePolygon(elem.OSMElem); ok {
d.delDb.Delete(elem.Id, matches)
d.delDb.Delete(-elem.Id, matches)
} else {
// handle relations with tags from members by deleting
// from all tables
d.delDb.DeleteElem(elem.OSMElem)
e := element.OSMElem(elem.OSMElem)
e.Id = -e.Id
d.delDb.DeleteElem(e)
}
if deleteRefs {

View File

@ -157,7 +157,7 @@ def test_import():
def test_imported_landusage():
"""Multipolygon relation is inserted"""
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
assert landusage_1001['geometry'].intersects(merc_point(13.4, 47.5))
# hole in multipolygon relation
@ -178,28 +178,28 @@ def test_landusage_to_waterarea_1():
assert_cached_way(13001)
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', 13001)
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_gen0', 11001)
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', -12001)
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', 12001)
assert not query_row(db_conf, 'osm_waterareas_gen1', 13001)
assert not query_row(db_conf, 'osm_waterareas_gen1', -12001)
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', 12001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages', 13001)['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_gen0', 11001)['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', -12001)['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', 12001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen1', 13001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen1', -12001)['type'] == 'park'
assert query_row(db_conf, 'osm_landusages_gen1', -13001)['type'] == 'park'
def test_changed_hole_tags_1():
@ -208,18 +208,19 @@ def test_changed_hole_tags_1():
assert_cached_way(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():
"""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_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)
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'
@ -233,22 +234,22 @@ def test_node_way_ref_after_delete_1():
assert query_row(db_conf, 'osm_barrierpoints', 20001)['type'] == 'block'
def test_way_rel_ref_after_delete_1():
"""Ways refereces relation"""
"""Ways references 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'
assert query_row(db_conf, 'osm_landusages', -21001)['type'] == 'park'
def test_relation_way_not_inserted():
"""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['name'] == 'rel 9001'
assert query_row(db_conf, 'osm_landusages', 9009) == None
def test_relation_way_inserted():
"""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['name'] == 'rel 8001'
assert query_row(db_conf, 'osm_roads', 8009)["type"] == 'residential'
@ -279,17 +280,19 @@ def test_residential_to_secondary():
def test_relation_before_remove():
"""Relation and way is inserted."""
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():
"""Relation without tags is inserted."""
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():
"""Relation/way with same ID is inserted."""
assert len(query_row(db_conf, 'osm_buildings', 51001)) == 2
assert len(query_row(db_conf, 'osm_buildings', 51011)) == 2
assert query_row(db_conf, 'osm_buildings', 51001)['type'] == 'way'
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():
@ -300,7 +303,7 @@ def test_update():
def test_updated_landusage():
"""Multipolygon relation was modified"""
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
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_way(2001)
assert_cached_way(2002)
assert not query_row(db_conf, 'osm_landusages', -2001)
assert not query_row(db_conf, 'osm_landusages', 2001)
def test_updated_nodes():
@ -328,28 +332,28 @@ def test_landusage_to_waterarea_2():
assert_cached_way(13001)
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', 13001)
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_gen0', 11001)
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', -12001)
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', 12001)
assert not query_row(db_conf, 'osm_landusages_gen1', 13001)
assert not query_row(db_conf, 'osm_landusages_gen1', -12001)
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', 12001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas', 13001)['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_gen0', 11001)['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', -12001)['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', 12001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen1', 13001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen1', -12001)['type'] == 'water'
assert query_row(db_conf, 'osm_waterareas_gen1', -13001)['type'] == 'water'
def test_changed_hole_tags_2():
"""Newly tagged hole is inserted"""
@ -357,9 +361,9 @@ def test_changed_hole_tags_2():
assert_cached_way(14011)
assert query_row(db_conf, 'osm_waterareas', 14011)['type'] == 'water'
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 query_row(db_conf, 'osm_landusages', -14001)['type'] == 'park'
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():
"""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']['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_almost_equal(park_15001['geometry'].area, 9816216452, -1)
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)
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_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():
"""Node does not referece deleted way"""
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_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
assert query_row(db_conf, 'osm_landusages', -21001) == None
def test_residential_to_secondary2():
"""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_gen0', 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."""
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
def test_relation_without_tags2():
"""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', 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 -->
<delete>
<relation id="51001" />
<way id="51101" />
<way id="51011" />
</delete>

View File

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

View File

@ -115,11 +115,14 @@ NextRel:
}
for _, g := range parts {
rel := element.Relation(*r)
rel.Id = -r.Id
rel.Geom = &element.Geometry{g, geos.AsEwkbHex(g)}
rw.inserter.InsertPolygon(rel.OSMElem, matches)
}
} 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)
if err != nil {