diff --git a/common/coords.go b/common/coords.go index 6cdb714..e29e480 100644 --- a/common/coords.go +++ b/common/coords.go @@ -85,14 +85,22 @@ func EncodeStringToBytes(key int64) ([]byte, error) { return []byte(strconv.FormatInt(key, 10)), nil } -func EncodeToBigEndian(key int64) (enc []byte, err error) { - enc = make([]byte, 8) +func ToBigEndian(key int64) []byte { + enc := make([]byte, 8) binary.BigEndian.PutUint64(enc, uint64(key)) - return + return enc +} + +func EncodeToBigEndian(key int64) ([]byte, error) { + return ToBigEndian(key), nil +} + +func FromBigEndian(key []byte) int64 { + return int64(binary.BigEndian.Uint64(key)) } func DecodeFromBigEndian(key []byte) (int64, error) { - return int64(binary.BigEndian.Uint64(key)), nil + return FromBigEndian(key), nil } func CoordToInterleaved(c Coord) (result int64) { diff --git a/leveldb.go b/leveldb.go index 3e1cf03..7e655c3 100644 --- a/leveldb.go +++ b/leveldb.go @@ -336,21 +336,13 @@ func (ldbs *LevelDBSession) interleavedSpatialQuery(first, second []byte, done c zmin, zmax = order(zmin, zmax) var ( cub = common.Cuboid{P1: c1, P2: c2} - zcode = zmin err error encodedKey []byte ) - SEEK: - if encodedKey, err = common.EncodeToBigEndian(zcode); err != nil { - log.Printf("error encoding key: %s", err) - return - } - it.Seek(encodedKey) + + it.Seek(common.ToBigEndian(zmin)) for it.Valid() { - if zcode, err = common.DecodeFromBigEndian(it.Key()); err != nil { - log.Printf("error decoding key: %s", err) - return - } + zcode := common.FromBigEndian(it.Key()) if zcode > zmax { break @@ -366,12 +358,10 @@ func (ldbs *LevelDBSession) interleavedSpatialQuery(first, second []byte, done c case <-done: return } + it.Next() } else { - zmin = common.NaiveBigMin(zmin, zmax, zcode) - goto SEEK + it.Seek(common.ToBigEndian(common.NaiveBigMin(zmin, zmax, zcode))) } - - it.Next() } if err = it.GetError(); err != nil { log.Printf("error while iterating: %s", err)