diff update relation_members

master
Oliver Tonnhofer 2016-01-06 09:07:14 +01:00
parent 3baf2b482f
commit 8eae74a6da
6 changed files with 122 additions and 17 deletions

View File

@ -512,10 +512,10 @@ func (pg *PostGIS) DeleteElem(elem element.OSMElem) error {
// handle deletes of geometries that did not match in ProbeXxx.
// we have to handle multipolygon relations that took the tags of the
// main-member. those tags are not avail. during delete. just try to
// delete from each polygon table.
if v, ok := elem.Tags["type"]; ok && (v == "multipolygon" || v == "boundary") {
// delete from each polygon/relation table.
if _, ok := elem.Tags["type"]; ok {
for _, tableSpec := range pg.Tables {
if tableSpec.GeometryType != "polygon" {
if tableSpec.GeometryType != "polygon" && tableSpec.GeometryType != "geometry" && tableSpec.GeometryType != "relation" {
continue
}
pg.txRouter.Delete(tableSpec.Name, elem.Id)

View File

@ -83,18 +83,12 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
if elem.Tags == nil {
return nil
}
if matches := d.tmPolygons.MatchRelation(elem); len(matches) > 0 {
if err := d.delDb.Delete(d.RelId(elem.Id), matches); err != nil {
return err
}
} else {
// handle relations with tags from members by deleting
// from all tables
e := element.OSMElem(elem.OSMElem)
e.Id = -e.Id
if err := d.delDb.DeleteElem(e); err != nil {
return err
}
// delete from all tables to handle relations with tags from members
// and relation_members
e := element.OSMElem(elem.OSMElem)
e.Id = -e.Id
if err := d.delDb.DeleteElem(e); err != nil {
return err
}
if deleteRefs {

View File

@ -237,11 +237,11 @@ func (s *importTestSuite) query(t *testing.T, table string, id int64, keys []str
}
func (s *importTestSuite) queryTags(t *testing.T, table string, id int64) record {
stmt := fmt.Sprintf(`SELECT osm_id, ST_AsText(geometry), tags FROM "%s"."%s" WHERE osm_id=$1`, dbschemaProduction, table)
stmt := fmt.Sprintf(`SELECT osm_id, tags FROM "%s"."%s" WHERE osm_id=$1`, dbschemaProduction, table)
row := s.db.QueryRow(stmt, id)
r := record{}
h := hstore.Hstore{}
if err := row.Scan(&r.id, &r.wkt, &h); err != nil {
if err := row.Scan(&r.id, &h); err != nil {
if err == sql.ErrNoRows {
r.missing = true
} else {
@ -320,6 +320,29 @@ func (s *importTestSuite) queryGeom(t *testing.T, table string, id int64) *geos.
return geom
}
func (s *importTestSuite) queryDynamic(t *testing.T, table, where string) []map[string]string {
stmt := fmt.Sprintf(`SELECT hstore(r) FROM (SELECT ST_AsText(geometry) AS wkt, * FROM "%s"."%s" WHERE %s) AS r`, dbschemaProduction, table, where)
rows, err := s.db.Query(stmt)
if err != nil {
t.Fatal(err)
}
results := []map[string]string{}
for rows.Next() {
h := hstore.Hstore{}
if err := rows.Scan(&h); err != nil {
t.Fatal(err)
}
r := make(map[string]string)
for k, v := range h.Map {
if v.Valid {
r[k] = v.String
}
}
results = append(results, r)
}
return results
}
type checkElem struct {
table string
id int64

View File

@ -1,3 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<osmChange version="0.6" generator="Osmosis 0.41">
<modify>
<node id="100103" version="2" timestamp="2015-12-31T23:59:99Z" lat="53.001" lon="8.201"/>
<way id="100503" version="1" timestamp="2015-12-31T23:59:99Z">
<nd ref="100103"/>
<nd ref="100104"/>
<tag k="name" v="new name"/>
</way>
</modify>
</osmChange>

View File

@ -99,7 +99,25 @@
<tag k="type" v="route"/>
</relation>
<relation id="100903" version="23" timestamp="2015-06-02T04:13:19Z">
<member type="node" ref="100101" role="stop_entry_only"/>
<member type="way" ref="100511" role="platform_entry_only"/>
<member type="node" ref="100102" role="stop_exit_only"/>
<member type="way" ref="100512" role="platform_exit_only"/>
<member type="way" ref="100501" role=""/>
<tag k="colour" v="#F5A9E1"/>
<tag k="from" v="A"/>
<tag k="name" v="Bus 302: A =&gt; C"/>
<tag k="network" v="ABC"/>
<tag k="ref" v="301"/>
<tag k="route" v="bus"/>
<tag k="to" v="C"/>
<tag k="type" v="route"/>
</relation>
<relation id="100911" version="23" timestamp="2015-06-02T04:13:19Z">
<member type="relation" ref="100901" role=""/>
<member type="relation" ref="100902" role=""/>
<tag k="colour" v="#F5A9E1"/>

View File

@ -2,6 +2,7 @@ package test
import (
"database/sql"
"strconv"
"testing"
@ -46,8 +47,68 @@ func TestRouteRelation_Deploy(t *testing.T) {
}
}
func TestRouteRelation_RelationData(t *testing.T) {
// check tags of relation
r := ts.queryTags(t, "osm_routes", -100901)
if r.tags["name"] != "Bus 301: A => B" {
t.Error(r)
}
}
func TestRouteRelation_MemberGeomUpdated1(t *testing.T) {
rows := ts.queryDynamic(t, "osm_route_members", "osm_id = -100902 AND member = 100502")
if len(rows) != 1 {
t.Fatal(rows)
}
g := ts.g.FromWkt(rows[0]["wkt"])
if g.Length() != 111.32448543701321 {
t.Fatal(g.Length())
}
rows = ts.queryDynamic(t, "osm_route_members", "osm_id = -100902 AND member = 100503")
if len(rows) != 1 {
t.Fatal(rows)
}
if rows[0]["name"] != "" {
t.Error(rows[0])
}
}
// #######################################################################
func TestRouteRelation_Update(t *testing.T) {
ts.updateOsm(t, "./build/route_relation.osc.gz")
}
// #######################################################################
func TestRouteRelation_MemberGeomUpdated2(t *testing.T) {
rows := ts.queryDynamic(t, "osm_route_members", "osm_id = -100902 AND member = 100502")
if len(rows) != 1 {
t.Fatal(rows)
}
g := ts.g.FromWkt(rows[0]["wkt"])
if g.Length() != 184.97560221624542 {
t.Fatal(g.Length())
}
rows = ts.queryDynamic(t, "osm_route_members", "osm_id = -100902 AND member = 100503")
if len(rows) != 1 {
t.Fatal(rows)
}
if rows[0]["name"] != "new name" {
t.Error(rows[0])
}
}
func TestRouteRelation_MemberNotUpdated(t *testing.T) {
// check that member is not updated if no node/way changed
rows := ts.queryDynamic(t, "osm_route_members", "osm_id = -100903 AND member = 100501")
if len(rows) != 1 {
t.Fatal(rows)
}
if id, err := strconv.ParseInt(rows[0]["id"], 10, 32); err != nil || id > 27 {
t.Error("member was re-inserted", rows)
}
}