imposm3/diff/deleter.go

163 lines
3.2 KiB
Go
Raw Normal View History

2013-06-11 12:33:10 +04:00
package diff
import (
"goposm/cache"
"goposm/database"
"goposm/diff/parser"
2013-07-12 18:41:52 +04:00
"goposm/element"
"goposm/expire"
2013-06-11 12:33:10 +04:00
"goposm/mapping"
2013-07-12 18:41:52 +04:00
"goposm/proj"
2013-06-11 12:33:10 +04:00
)
type Deleter struct {
delDb database.Deleter
osmCache *cache.OSMCache
diffCache *cache.DiffCache
tmPoints *mapping.TagMatcher
tmLineStrings *mapping.TagMatcher
tmPolygons *mapping.TagMatcher
2013-07-12 18:41:52 +04:00
expireTiles *expire.Tiles
2013-06-11 12:33:10 +04:00
}
func NewDeleter(db database.Deleter, osmCache *cache.OSMCache, diffCache *cache.DiffCache,
tmPoints *mapping.TagMatcher,
tmLineStrings *mapping.TagMatcher,
tmPolygons *mapping.TagMatcher,
) *Deleter {
return &Deleter{
db,
osmCache,
diffCache,
tmPoints,
tmLineStrings,
tmPolygons,
2013-07-12 18:41:52 +04:00
nil,
2013-06-11 12:33:10 +04:00
}
}
2013-07-12 18:41:52 +04:00
func (d *Deleter) SetExpireTiles(expireTiles *expire.Tiles) {
d.expireTiles = expireTiles
}
2013-06-11 12:33:10 +04:00
func (d *Deleter) deleteRelation(id int64) {
elem, err := d.osmCache.Relations.GetRelation(id)
if err != nil {
2013-06-21 17:09:57 +04:00
if err == cache.NotFound {
return
}
// TODO
2013-07-16 16:03:42 +04:00
log.Print("rel", id, err)
2013-06-21 17:09:57 +04:00
return
}
if elem.Tags == nil {
2013-06-11 12:33:10 +04:00
return
}
2013-07-12 18:41:52 +04:00
deleted := false
2013-06-11 12:33:10 +04:00
for _, m := range d.tmPolygons.Match(&elem.Tags) {
d.delDb.Delete(m.Table.Name, elem.Id)
2013-07-12 18:41:52 +04:00
deleted = true
}
d.osmCache.InsertedWays.DeleteMembers(elem.Members)
2013-07-12 18:41:52 +04:00
if deleted && d.expireTiles != nil {
for _, m := range elem.Members {
if m.Way == nil {
continue
}
err := d.osmCache.Coords.FillWay(m.Way)
if err != nil {
continue
}
proj.NodesToMerc(m.Way.Nodes)
d.expireTiles.ExpireFromNodes(m.Way.Nodes)
}
2013-06-11 12:33:10 +04:00
}
}
func (d *Deleter) deleteWay(id int64) {
elem, err := d.osmCache.Ways.GetWay(id)
if err != nil {
2013-06-21 17:09:57 +04:00
if err == cache.NotFound {
return
}
// TODO
2013-07-16 16:03:42 +04:00
log.Print("way", id, err)
2013-06-21 17:09:57 +04:00
return
}
if elem.Tags == nil {
2013-06-11 12:33:10 +04:00
return
}
2013-07-12 18:41:52 +04:00
deleted := false
2013-06-11 12:33:10 +04:00
for _, m := range d.tmPolygons.Match(&elem.Tags) {
d.delDb.Delete(m.Table.Name, elem.Id)
2013-07-12 18:41:52 +04:00
deleted = true
2013-06-11 12:33:10 +04:00
}
for _, m := range d.tmLineStrings.Match(&elem.Tags) {
d.delDb.Delete(m.Table.Name, elem.Id)
2013-07-12 18:41:52 +04:00
deleted = true
}
if deleted && d.expireTiles != nil {
err := d.osmCache.Coords.FillWay(elem)
if err != nil {
return
}
d.expireTiles.ExpireFromNodes(elem.Nodes)
2013-06-11 12:33:10 +04:00
}
}
func (d *Deleter) deleteNode(id int64) {
elem, err := d.osmCache.Nodes.GetNode(id)
if err != nil {
2013-06-21 17:09:57 +04:00
if err == cache.NotFound {
return
2013-06-11 12:33:10 +04:00
}
2013-06-21 17:09:57 +04:00
// TODO
2013-07-16 16:03:42 +04:00
log.Print("node", id, err)
2013-06-21 17:09:57 +04:00
return
}
if elem.Tags == nil {
2013-06-11 12:33:10 +04:00
return
}
2013-07-12 18:41:52 +04:00
deleted := false
2013-06-11 12:33:10 +04:00
for _, m := range d.tmPoints.Match(&elem.Tags) {
d.delDb.Delete(m.Table.Name, elem.Id)
2013-07-12 18:41:52 +04:00
deleted = true
}
if deleted && d.expireTiles != nil {
d.expireTiles.ExpireFromNodes([]element.Node{*elem})
2013-06-11 12:33:10 +04:00
}
2013-07-12 18:41:52 +04:00
2013-06-11 12:33:10 +04:00
}
func (d *Deleter) Delete(delElem parser.DiffElem) {
if !delElem.Del {
panic("del=false")
}
if delElem.Rel != nil {
d.deleteRelation(delElem.Rel.Id)
} else if delElem.Way != nil {
d.deleteWay(delElem.Way.Id)
if delElem.Mod {
dependers := d.diffCache.Ways.Get(delElem.Way.Id)
for _, rel := range dependers {
d.deleteRelation(rel)
}
}
} else if delElem.Node != nil {
d.deleteNode(delElem.Node.Id)
if delElem.Mod {
dependers := d.diffCache.Coords.Get(delElem.Node.Id)
for _, way := range dependers {
d.deleteWay(way)
dependers := d.diffCache.Ways.Get(way)
for _, rel := range dependers {
d.deleteRelation(rel)
}
}
}
}
}