only delete from matched tables
parent
688d62e023
commit
073dfeb8cf
|
@ -58,10 +58,7 @@ type Finisher interface {
|
||||||
|
|
||||||
type Deleter interface {
|
type Deleter interface {
|
||||||
Inserter
|
Inserter
|
||||||
// Delete deletes ID from tables that matched ProbeXxx
|
Delete(int64, []mapping.Match) error
|
||||||
Delete(int64, interface{}) error
|
|
||||||
// DeleteElem deletes element from all tables
|
|
||||||
DeleteElem(element.OSMElem) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Optimizer interface {
|
type Optimizer interface {
|
||||||
|
|
|
@ -510,36 +510,13 @@ func (pg *PostGIS) InsertRelationMember(rel element.Relation, m element.Member,
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pg *PostGIS) Delete(id int64, matches interface{}) error {
|
func (pg *PostGIS) Delete(id int64, matches []mapping.Match) error {
|
||||||
if matches, ok := matches.([]mapping.Match); ok {
|
for _, match := range matches {
|
||||||
for _, match := range matches {
|
pg.txRouter.Delete(match.Table.Name, id)
|
||||||
pg.txRouter.Delete(match.Table.Name, id)
|
|
||||||
}
|
|
||||||
if pg.updateGeneralizedTables {
|
|
||||||
for _, generalizedTable := range pg.generalizedFromMatches(matches) {
|
|
||||||
pg.txRouter.Delete(generalizedTable.Name, id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
if pg.updateGeneralizedTables {
|
||||||
}
|
for _, generalizedTable := range pg.generalizedFromMatches(matches) {
|
||||||
|
pg.txRouter.Delete(generalizedTable.Name, id)
|
||||||
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/relation table.
|
|
||||||
if _, ok := elem.Tags["type"]; ok {
|
|
||||||
for _, tableSpec := range pg.Tables {
|
|
||||||
if tableSpec.GeometryType != "polygon" && tableSpec.GeometryType != "geometry" && tableSpec.GeometryType != "relation" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pg.txRouter.Delete(tableSpec.Name, elem.Id)
|
|
||||||
if pg.updateGeneralizedTables {
|
|
||||||
for _, genTable := range tableSpec.Generalizations {
|
|
||||||
pg.txRouter.Delete(genTable.Name, elem.Id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -16,6 +16,8 @@ type Deleter struct {
|
||||||
tmPoints mapping.NodeMatcher
|
tmPoints mapping.NodeMatcher
|
||||||
tmLineStrings mapping.WayMatcher
|
tmLineStrings mapping.WayMatcher
|
||||||
tmPolygons mapping.RelWayMatcher
|
tmPolygons mapping.RelWayMatcher
|
||||||
|
tmRelation mapping.RelationMatcher
|
||||||
|
tmRelationMember mapping.RelationMatcher
|
||||||
expireor expire.Expireor
|
expireor expire.Expireor
|
||||||
singleIdSpace bool
|
singleIdSpace bool
|
||||||
deletedRelations map[int64]struct{}
|
deletedRelations map[int64]struct{}
|
||||||
|
@ -28,6 +30,8 @@ func NewDeleter(db database.Deleter, osmCache *cache.OSMCache, diffCache *cache.
|
||||||
tmPoints mapping.NodeMatcher,
|
tmPoints mapping.NodeMatcher,
|
||||||
tmLineStrings mapping.WayMatcher,
|
tmLineStrings mapping.WayMatcher,
|
||||||
tmPolygons mapping.RelWayMatcher,
|
tmPolygons mapping.RelWayMatcher,
|
||||||
|
tmRelation mapping.RelationMatcher,
|
||||||
|
tmRelationMember mapping.RelationMatcher,
|
||||||
) *Deleter {
|
) *Deleter {
|
||||||
return &Deleter{
|
return &Deleter{
|
||||||
delDb: db,
|
delDb: db,
|
||||||
|
@ -36,6 +40,8 @@ func NewDeleter(db database.Deleter, osmCache *cache.OSMCache, diffCache *cache.
|
||||||
tmPoints: tmPoints,
|
tmPoints: tmPoints,
|
||||||
tmLineStrings: tmLineStrings,
|
tmLineStrings: tmLineStrings,
|
||||||
tmPolygons: tmPolygons,
|
tmPolygons: tmPolygons,
|
||||||
|
tmRelation: tmRelation,
|
||||||
|
tmRelationMember: tmRelationMember,
|
||||||
singleIdSpace: singleIdSpace,
|
singleIdSpace: singleIdSpace,
|
||||||
deletedRelations: make(map[int64]struct{}),
|
deletedRelations: make(map[int64]struct{}),
|
||||||
deletedWays: make(map[int64]struct{}),
|
deletedWays: make(map[int64]struct{}),
|
||||||
|
@ -82,12 +88,27 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
|
||||||
if elem.Tags == nil {
|
if elem.Tags == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// delete from all tables to handle relations with tags from members
|
|
||||||
// and relation_members
|
deleted := false
|
||||||
e := element.OSMElem(elem.OSMElem)
|
deletedPolygon := false
|
||||||
e.Id = d.RelId(e.Id)
|
if matches := d.tmPolygons.MatchRelation(elem); len(matches) > 0 {
|
||||||
if err := d.delDb.DeleteElem(e); err != nil {
|
if err := d.delDb.Delete(d.RelId(elem.Id), matches); err != nil {
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
deleted = true
|
||||||
|
deletedPolygon = true
|
||||||
|
}
|
||||||
|
if matches := d.tmRelation.MatchRelation(elem); len(matches) > 0 {
|
||||||
|
if err := d.delDb.Delete(d.RelId(elem.Id), matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
deleted = true
|
||||||
|
}
|
||||||
|
if matches := d.tmRelationMember.MatchRelation(elem); len(matches) > 0 {
|
||||||
|
if err := d.delDb.Delete(d.RelId(elem.Id), matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
deleted = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if deleteRefs {
|
if deleteRefs {
|
||||||
|
@ -96,13 +117,19 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
|
||||||
if err := d.diffCache.Ways.DeleteRef(m.Id, id); err != nil {
|
if err := d.diffCache.Ways.DeleteRef(m.Id, id); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
} else if m.Type == element.NODE {
|
||||||
|
if err := d.diffCache.CoordsRel.DeleteRef(m.Id, id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if deleteMembers {
|
if deleteMembers && deletedPolygon {
|
||||||
// delete members from db and force reinsert of members
|
// delete members from db and force reinsert of members
|
||||||
// use case: relation is deleted and member now stands for its own
|
// use case: relation is deleted and member now stands for its own
|
||||||
|
|
||||||
|
// TODO: still needed after old-style mp removal, remove when #148 is closed
|
||||||
for _, member := range elem.Members {
|
for _, member := range elem.Members {
|
||||||
if member.Type == element.WAY {
|
if member.Type == element.WAY {
|
||||||
d.deletedMembers[member.Id] = struct{}{}
|
d.deletedMembers[member.Id] = struct{}{}
|
||||||
|
@ -124,7 +151,7 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
|
||||||
if err := d.osmCache.InsertedWays.DeleteMembers(elem.Members); err != nil {
|
if err := d.osmCache.InsertedWays.DeleteMembers(elem.Members); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if d.expireor != nil {
|
if deleted && d.expireor != nil {
|
||||||
if err := d.osmCache.Ways.FillMembers(elem.Members); err != nil {
|
if err := d.osmCache.Ways.FillMembers(elem.Members); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -136,7 +163,7 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
expire.ExpireProjectedNodes(d.expireor, m.Way.Nodes, 4326, true)
|
expire.ExpireProjectedNodes(d.expireor, m.Way.Nodes, 4326, deletedPolygon)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -148,6 +148,8 @@ func Update(oscFile string, geometryLimiter *limit.Limiter, expireor expire.Expi
|
||||||
tagmapping.PointMatcher,
|
tagmapping.PointMatcher,
|
||||||
tagmapping.LineStringMatcher,
|
tagmapping.LineStringMatcher,
|
||||||
tagmapping.PolygonMatcher,
|
tagmapping.PolygonMatcher,
|
||||||
|
tagmapping.RelationMatcher,
|
||||||
|
tagmapping.RelationMemberMatcher,
|
||||||
)
|
)
|
||||||
deleter.SetExpireor(expireor)
|
deleter.SetExpireor(expireor)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue