From e8f3e50dcfa1dd23b1a0e466a05c32d0ce58f0ae Mon Sep 17 00:00:00 2001 From: Oliver Tonnhofer Date: Thu, 7 Nov 2013 17:28:42 +0100 Subject: [PATCH] do not cache skipped nodes --- cache/delta.go | 17 ++++++++++++++--- cache/delta_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/cache/delta.go b/cache/delta.go index 2cda314..fa478dc 100644 --- a/cache/delta.go +++ b/cache/delta.go @@ -203,6 +203,19 @@ func (self *DeltaCoordsCache) FillWay(way *element.Way) error { return nil } +func removeSkippedNodes(nodes []element.Node) []element.Node { + insertPoint := 0 + for i := 0; i < len(nodes); i++ { + if i != insertPoint { + nodes[insertPoint] = nodes[i] + } + if nodes[i].Id != SKIP { + insertPoint += 1 + } + } + return nodes[:insertPoint] +} + // PutCoords puts nodes into cache. // nodes need to be sorted by Id. func (self *DeltaCoordsCache) PutCoords(nodes []element.Node) error { @@ -210,10 +223,8 @@ func (self *DeltaCoordsCache) PutCoords(nodes []element.Node) error { currentBunchId = self.getBunchId(nodes[0].Id) start = 0 totalNodes := len(nodes) + nodes = removeSkippedNodes(nodes) for i, node := range nodes { - if node.Id == SKIP { - continue - } bunchId := self.getBunchId(node.Id) if bunchId != currentBunchId { if self.linearImport && int64(i) > self.bunchSize && int64(i) < int64(totalNodes)-self.bunchSize { diff --git a/cache/delta_test.go b/cache/delta_test.go index 1d48bd0..a7e524a 100644 --- a/cache/delta_test.go +++ b/cache/delta_test.go @@ -19,6 +19,48 @@ func mknode(id int64) element.Node { } } +func TestRemoveSkippedNodes(t *testing.T) { + nodes := []element.Node{ + mknode(0), + mknode(1), + mknode(-1), + mknode(2), + mknode(-1), + } + nodes = removeSkippedNodes(nodes) + if l := len(nodes); l != 3 { + t.Fatal(nodes) + } + if nodes[0].Id != 0 || nodes[1].Id != 1 || nodes[2].Id != 2 { + t.Fatal(nodes) + } + + nodes = []element.Node{ + mknode(-1), + mknode(-1), + } + nodes = removeSkippedNodes(nodes) + if l := len(nodes); l != 0 { + t.Fatal(nodes) + } + + nodes = []element.Node{ + mknode(-1), + mknode(1), + mknode(-1), + mknode(-1), + mknode(-1), + mknode(2), + } + nodes = removeSkippedNodes(nodes) + if l := len(nodes); l != 2 { + t.Fatal(nodes) + } + if nodes[0].Id != 1 || nodes[1].Id != 2 { + t.Fatal(nodes) + } +} + func TestReadWriteDeltaCoords(t *testing.T) { checkReadWriteDeltaCoords(t, false) }