diff update relation_members
parent
3baf2b482f
commit
8eae74a6da
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 => 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"/>
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue