diff --git a/cache/osm.go b/cache/osm.go index 5eb818d..aa28980 100644 --- a/cache/osm.go +++ b/cache/osm.go @@ -3,9 +3,11 @@ package cache import ( bin "encoding/binary" "errors" - "github.com/jmhodges/levigo" "os" "path/filepath" + + "github.com/jmhodges/levigo" + "github.com/omniscale/imposm3/element" ) var ( @@ -129,6 +131,33 @@ func (c *OSMCache) Remove() error { return nil } +// FirstMemberIsCached checks whether the first way or node member is cached. +// Also returns true if there are no members of type WAY or NODE. +func (c *OSMCache) FirstMemberIsCached(members []element.Member) (bool, error) { + for _, m := range members { + if m.Type == element.WAY { + _, err := c.Ways.GetWay(m.Id) + if err == NotFound { + return false, nil + } + if err != nil { + return false, err + } + return true, nil + } else if m.Type == element.NODE { + _, err := c.Coords.GetCoord(m.Id) + if err == NotFound { + return false, nil + } + if err != nil { + return false, err + } + return true, nil + } + } + return true, nil +} + type cache struct { db *levigo.DB options *cacheOptions diff --git a/cache/ways.go b/cache/ways.go index b6cc385..f1df80e 100644 --- a/cache/ways.go +++ b/cache/ways.go @@ -113,22 +113,6 @@ func (self *WaysCache) FillMembers(members []element.Member) error { return nil } -func (self *WaysCache) FirstMemberIsCached(members []element.Member) (bool, error) { - for _, m := range members { - if m.Type == element.WAY { - _, err := self.GetWay(m.Id) - if err == NotFound { - return false, nil - } - if err != nil { - return false, err - } - return true, nil - } - } - return false, nil -} - type InsertedWaysCache struct { cache } diff --git a/diff/process.go b/diff/process.go index 6302756..25ca00f 100644 --- a/diff/process.go +++ b/diff/process.go @@ -242,7 +242,7 @@ func Update(oscFile string, geometryLimiter *limit.Limiter, expireor expire.Expi if elem.Rel != nil { // check if first member is cached to avoid caching // unneeded relations (typical outside of our coverage) - cached, err := osmCache.Ways.FirstMemberIsCached(elem.Rel.Members) + cached, err := osmCache.FirstMemberIsCached(elem.Rel.Members) if err != nil { return diffError(err, "query first member %v", elem.Rel) } diff --git a/reader/reader.go b/reader/reader.go index 6d8546c..c348072 100644 --- a/reader/reader.go +++ b/reader/reader.go @@ -152,7 +152,7 @@ func ReadPbf(cache *osmcache.OSMCache, progress *stats.Statistics, numWithTags += 1 } if withLimiter { - cached, err := cache.Ways.FirstMemberIsCached(rels[i].Members) + cached, err := cache.FirstMemberIsCached(rels[i].Members) if err != nil { log.Errorf("error while checking for cached members of relation %d: %v", rels[i].Id, err) cached = true // don't skip in case of error