refactored diff cache
parent
7d78ff85de
commit
9df027e29b
|
@ -262,44 +262,8 @@ func newWaysRefIndex(dir string) (*WaysRefIndex, error) {
|
||||||
return &WaysRefIndex{*cache}, nil
|
return &WaysRefIndex{*cache}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (index *CoordsRefIndex) AddFromWay(way *element.Way) {
|
func (index *bunchRefCache) getBunchId(id int64) int64 {
|
||||||
for _, node := range way.Nodes {
|
return id / 64
|
||||||
if index.linearImport {
|
|
||||||
index.addc <- idRef{id: node.Id, ref: way.Id}
|
|
||||||
} else {
|
|
||||||
index.add(node.Id, way.Id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (index *CoordsRefIndex) DeleteFromWay(way *element.Way) {
|
|
||||||
if index.linearImport {
|
|
||||||
panic("programming error: delete not supported in linearImport mode")
|
|
||||||
}
|
|
||||||
for _, node := range way.Nodes {
|
|
||||||
index.DeleteRef(node.Id, way.Id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (index *WaysRefIndex) AddFromMembers(relId int64, members []element.Member) {
|
|
||||||
for _, member := range members {
|
|
||||||
if member.Type == element.WAY {
|
|
||||||
if index.linearImport {
|
|
||||||
index.addc <- idRef{id: member.Id, ref: relId}
|
|
||||||
} else {
|
|
||||||
index.add(member.Id, relId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (index *bunchRefCache) writer() {
|
|
||||||
for buffer := range index.write {
|
|
||||||
if err := index.writeRefs(buffer); err != nil {
|
|
||||||
log.Println("error while writing ref index", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
index.waitWrite.Done()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (index *bunchRefCache) Close() {
|
func (index *bunchRefCache) Close() {
|
||||||
|
@ -311,6 +275,15 @@ func (index *bunchRefCache) Close() {
|
||||||
index.cache.Close()
|
index.cache.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (index *bunchRefCache) writer() {
|
||||||
|
for buffer := range index.write {
|
||||||
|
if err := index.writeRefs(buffer); err != nil {
|
||||||
|
log.Println("error while writing ref index", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
index.waitWrite.Done()
|
||||||
|
}
|
||||||
|
|
||||||
func (index *bunchRefCache) dispatch() {
|
func (index *bunchRefCache) dispatch() {
|
||||||
for idRef := range index.addc {
|
for idRef := range index.addc {
|
||||||
index.buffer.add(index.getBunchId(idRef.id), idRef.id, idRef.ref)
|
index.buffer.add(index.getBunchId(idRef.id), idRef.id, idRef.ref)
|
||||||
|
@ -330,10 +303,6 @@ func (index *bunchRefCache) dispatch() {
|
||||||
index.waitAdd.Done()
|
index.waitAdd.Done()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (index *bunchRefCache) getBunchId(id int64) int64 {
|
|
||||||
return id / 64
|
|
||||||
}
|
|
||||||
|
|
||||||
type loadBunchItem struct {
|
type loadBunchItem struct {
|
||||||
bunchId int64
|
bunchId int64
|
||||||
bunch idRefBunch
|
bunch idRefBunch
|
||||||
|
@ -454,6 +423,9 @@ func (index *bunchRefCache) loadMergeMarshal(keyBuf []byte, newBunch []idRefs) [
|
||||||
}
|
}
|
||||||
|
|
||||||
func (index *bunchRefCache) Get(id int64) []int64 {
|
func (index *bunchRefCache) Get(id int64) []int64 {
|
||||||
|
if index.linearImport {
|
||||||
|
panic("programming error: get not supported in linearImport mode")
|
||||||
|
}
|
||||||
keyBuf := idToKeyBuf(index.getBunchId(id))
|
keyBuf := idToKeyBuf(index.getBunchId(id))
|
||||||
|
|
||||||
data, err := index.db.Get(index.ro, keyBuf)
|
data, err := index.db.Get(index.ro, keyBuf)
|
||||||
|
@ -471,7 +443,7 @@ func (index *bunchRefCache) Get(id int64) []int64 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (index *bunchRefCache) add(id, ref int64) error {
|
func (index *bunchRefCache) Add(id, ref int64) error {
|
||||||
keyBuf := idToKeyBuf(index.getBunchId(id))
|
keyBuf := idToKeyBuf(index.getBunchId(id))
|
||||||
|
|
||||||
data, err := index.db.Get(index.ro, keyBuf)
|
data, err := index.db.Get(index.ro, keyBuf)
|
||||||
|
@ -543,6 +515,37 @@ func (index *bunchRefCache) Delete(id int64) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (index *CoordsRefIndex) AddFromWay(way *element.Way) {
|
||||||
|
for _, node := range way.Nodes {
|
||||||
|
if index.linearImport {
|
||||||
|
index.addc <- idRef{id: node.Id, ref: way.Id}
|
||||||
|
} else {
|
||||||
|
index.Add(node.Id, way.Id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (index *CoordsRefIndex) DeleteFromWay(way *element.Way) {
|
||||||
|
if index.linearImport {
|
||||||
|
panic("programming error: delete not supported in linearImport mode")
|
||||||
|
}
|
||||||
|
for _, node := range way.Nodes {
|
||||||
|
index.DeleteRef(node.Id, way.Id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (index *WaysRefIndex) AddFromMembers(relId int64, members []element.Member) {
|
||||||
|
for _, member := range members {
|
||||||
|
if member.Type == element.WAY {
|
||||||
|
if index.linearImport {
|
||||||
|
index.addc <- idRef{id: member.Id, ref: relId}
|
||||||
|
} else {
|
||||||
|
index.Add(member.Id, relId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func marshalBunch(idRefs []idRefs) []byte {
|
func marshalBunch(idRefs []idRefs) []byte {
|
||||||
buf := make([]byte, len(idRefs)*(4+1+6)+binary.MaxVarintLen64)
|
buf := make([]byte, len(idRefs)*(4+1+6)+binary.MaxVarintLen64)
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ func TestWriteDiff(t *testing.T) {
|
||||||
|
|
||||||
for w := 0; w < 5; w++ {
|
for w := 0; w < 5; w++ {
|
||||||
for n := 0; n < 200; n++ {
|
for n := 0; n < 200; n++ {
|
||||||
cache.add(int64(n), int64(w))
|
cache.Add(int64(n), int64(w))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue