do not cache skipped nodes

master
Oliver Tonnhofer 2013-11-07 17:28:42 +01:00
parent 6ad5a535a1
commit e8f3e50dcf
2 changed files with 56 additions and 3 deletions

17
cache/delta.go vendored
View File

@ -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 {

42
cache/delta_test.go vendored
View File

@ -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)
}