diff --git a/diff/deleter.go b/diff/deleter.go index fbbb0f9..4bc36e0 100644 --- a/diff/deleter.go +++ b/diff/deleter.go @@ -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 { diff --git a/test/imposm_system_test.py b/test/imposm_system_test.py index a096f83..42f33cc 100644 --- a/test/imposm_system_test.py +++ b/test/imposm_system_test.py @@ -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 diff --git a/test/test.osc b/test/test.osc index 6dbc359..117c623 100644 --- a/test/test.osc +++ b/test/test.osc @@ -162,7 +162,7 @@ - + diff --git a/test/test.osm b/test/test.osm index deab47d..eb81829 100644 --- a/test/test.osm +++ b/test/test.osm @@ -649,7 +649,7 @@ - + @@ -664,7 +664,7 @@ - + diff --git a/writer/relations.go b/writer/relations.go index a370365..c8216eb 100644 --- a/writer/relations.go +++ b/writer/relations.go @@ -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 {