2013-06-11 12:33:10 +04:00
|
|
|
package diff
|
|
|
|
|
|
|
|
import (
|
|
|
|
"goposm/cache"
|
|
|
|
"goposm/database"
|
|
|
|
"goposm/diff/parser"
|
|
|
|
"goposm/mapping"
|
|
|
|
"log"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Deleter struct {
|
|
|
|
delDb database.Deleter
|
|
|
|
osmCache *cache.OSMCache
|
|
|
|
diffCache *cache.DiffCache
|
|
|
|
tmPoints *mapping.TagMatcher
|
|
|
|
tmLineStrings *mapping.TagMatcher
|
|
|
|
tmPolygons *mapping.TagMatcher
|
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
log.Println("rel", id, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if elem.Tags == nil {
|
2013-06-11 12:33:10 +04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
for _, m := range d.tmPolygons.Match(&elem.Tags) {
|
|
|
|
d.delDb.Delete(m.Table.Name, elem.Id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
log.Println("way", id, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if elem.Tags == nil {
|
2013-06-11 12:33:10 +04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
for _, m := range d.tmPolygons.Match(&elem.Tags) {
|
|
|
|
d.delDb.Delete(m.Table.Name, elem.Id)
|
|
|
|
}
|
|
|
|
for _, m := range d.tmLineStrings.Match(&elem.Tags) {
|
|
|
|
d.delDb.Delete(m.Table.Name, elem.Id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
log.Println("node", id, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if elem.Tags == nil {
|
2013-06-11 12:33:10 +04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
for _, m := range d.tmPoints.Match(&elem.Tags) {
|
|
|
|
d.delDb.Delete(m.Table.Name, elem.Id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|