@@ -20,8 +20,15 @@ type Deleter struct {
2020 tmRelationMember mapping.RelationMatcher
2121 expireor expire.Expireor
2222 singleIDSpace bool
23+
24+ // Cache deleted nodes with lat/long and ways with refs, to be able to
25+ // calculate expire tiles when nodes/ways are removed before the depending
26+ // ways/relations.
27+ deletedNodes map [int64 ]osm.Node
28+ deletedWays map [int64 ][]int64
29+
30+ // Cache deleted elements to avoid processing them multiple times.
2331 deletedRelations map [int64 ]struct {}
24- deletedWays map [int64 ]struct {}
2532 deletedMembers map [int64 ]struct {}
2633}
2734
@@ -43,8 +50,9 @@ func NewDeleter(db database.Deleter, osmCache *cache.OSMCache, diffCache *cache.
4350 tmRelation : tmRelation ,
4451 tmRelationMember : tmRelationMember ,
4552 singleIDSpace : singleIDSpace ,
53+ deletedNodes : make (map [int64 ]osm.Node ),
4654 deletedRelations : make (map [int64 ]struct {}),
47- deletedWays : make (map [int64 ]struct {} ),
55+ deletedWays : make (map [int64 ][] int64 ),
4856 deletedMembers : make (map [int64 ]struct {}),
4957 }
5058}
@@ -126,15 +134,20 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
126134 }
127135
128136 if deleted && d .expireor != nil {
129- if err := d .osmCache .Ways .FillMembers (elem .Members ); err != nil {
137+ err := d .osmCache .Ways .FillMembers (elem .Members )
138+ if err == cache .NotFound {
139+ d .fillMembersFromDeleted (elem .Members )
140+ } else if err != nil {
130141 return err
131142 }
132143 for _ , m := range elem .Members {
133144 if m .Way == nil {
134145 continue
135146 }
136147 err := d .osmCache .Coords .FillWay (m .Way )
137- if err != nil {
148+ if err == cache .NotFound {
149+ d .fillWayFromDeleted (m .Way )
150+ } else if err != nil {
138151 continue
139152 }
140153 expire .ExpireProjectedNodes (d .expireor , m .Way .Nodes , 4326 , deletedPolygon )
@@ -144,7 +157,7 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
144157}
145158
146159func (d * Deleter ) deleteWay (id int64 , deleteRefs bool ) error {
147- d .deletedWays [id ] = struct {}{}
160+ d .deletedWays [id ] = nil
148161
149162 elem , err := d .osmCache .Ways .GetWay (id )
150163 if err != nil {
@@ -153,6 +166,8 @@ func (d *Deleter) deleteWay(id int64, deleteRefs bool) error {
153166 }
154167 return err
155168 }
169+
170+ d .deletedWays [id ] = elem .Refs
156171 if elem .Tags == nil {
157172 return nil
158173 }
@@ -180,9 +195,12 @@ func (d *Deleter) deleteWay(id int64, deleteRefs bool) error {
180195 }
181196 if deleted && d .expireor != nil {
182197 err := d .osmCache .Coords .FillWay (elem )
183- if err != nil {
198+ if err == cache .NotFound {
199+ d .fillWayFromDeleted (elem )
200+ } else if err != nil {
184201 return err
185202 }
203+
186204 expire .ExpireProjectedNodes (d .expireor , elem .Nodes , 4326 , deletedPolygon )
187205 }
188206 return nil
@@ -192,10 +210,18 @@ func (d *Deleter) deleteNode(id int64) error {
192210 elem , err := d .osmCache .Nodes .GetNode (id )
193211 if err != nil {
194212 if err == cache .NotFound {
213+ if elem , err := d .osmCache .Coords .GetCoord (id ); err == nil {
214+ // Cache from Coords for fillWayFromDeleted.
215+ d .deletedNodes [id ] = * elem
216+ }
195217 return nil
196218 }
197219 return err
198220 }
221+
222+ // Cache for fillWayFromDeleted.
223+ d .deletedNodes [id ] = * elem
224+
199225 if elem .Tags == nil {
200226 return nil
201227 }
@@ -289,3 +315,23 @@ func (d *Deleter) Delete(delElem osm.Diff) error {
289315 }
290316 return nil
291317}
318+
319+ func (d * Deleter ) fillWayFromDeleted (w * osm.Way ) {
320+ for i := range w .Nodes {
321+ if w .Nodes [i ].ID == 0 {
322+ if nd , ok := d.deletedNodes [w.Refs [i ]]; ok {
323+ w .Nodes [i ] = nd
324+ }
325+ }
326+ }
327+ }
328+
329+ func (d * Deleter ) fillMembersFromDeleted (members []osm.Member ) {
330+ for i , m := range members {
331+ if m .Type == osm .WayMember && m .Way == nil {
332+ if refs , ok := d .deletedWays [m .ID ]; ok {
333+ members [i ].Way = & osm.Way {Element : osm.Element {ID : m .ID }, Refs : refs }
334+ }
335+ }
336+ }
337+ }
0 commit comments