port 117 fix to bolt

This commit is contained in:
Barak Michener 2014-08-13 14:49:16 -04:00
parent 5d3a4a4a8f
commit 6b02f1a997
2 changed files with 36 additions and 32 deletions

View file

@ -212,45 +212,45 @@ func PositionOf(tok *Token, d quad.Direction, qs *QuadStore) int {
case quad.Subject: case quad.Subject:
return 0 return 0
case quad.Predicate: case quad.Predicate:
return qs.hasher.Size() return qs.hasherSize
case quad.Object: case quad.Object:
return 2 * qs.hasher.Size() return 2 * qs.hasherSize
case quad.Label: case quad.Label:
return 3 * qs.hasher.Size() return 3 * qs.hasherSize
} }
} }
if bytes.Equal(tok.bucket, posBucket) { if bytes.Equal(tok.bucket, posBucket) {
switch d { switch d {
case quad.Subject: case quad.Subject:
return 2 * qs.hasher.Size() return 2 * qs.hasherSize
case quad.Predicate: case quad.Predicate:
return 0 return 0
case quad.Object: case quad.Object:
return qs.hasher.Size() return qs.hasherSize
case quad.Label: case quad.Label:
return 3 * qs.hasher.Size() return 3 * qs.hasherSize
} }
} }
if bytes.Equal(tok.bucket, ospBucket) { if bytes.Equal(tok.bucket, ospBucket) {
switch d { switch d {
case quad.Subject: case quad.Subject:
return qs.hasher.Size() return qs.hasherSize
case quad.Predicate: case quad.Predicate:
return 2 * qs.hasher.Size() return 2 * qs.hasherSize
case quad.Object: case quad.Object:
return 0 return 0
case quad.Label: case quad.Label:
return 3 * qs.hasher.Size() return 3 * qs.hasherSize
} }
} }
if bytes.Equal(tok.bucket, cpsBucket) { if bytes.Equal(tok.bucket, cpsBucket) {
switch d { switch d {
case quad.Subject: case quad.Subject:
return 2 * qs.hasher.Size() return 2 * qs.hasherSize
case quad.Predicate: case quad.Predicate:
return qs.hasher.Size() return qs.hasherSize
case quad.Object: case quad.Object:
return 3 * qs.hasher.Size() return 3 * qs.hasherSize
case quad.Label: case quad.Label:
return 0 return 0
} }

View file

@ -44,12 +44,13 @@ func (t *Token) Key() interface{} {
} }
type QuadStore struct { type QuadStore struct {
db *bolt.DB db *bolt.DB
path string path string
open bool open bool
size int64 size int64
horizon int64 horizon int64
hasher hash.Hash makeHasher func() hash.Hash
hasherSize int
} }
func createNewBolt(path string, _ graph.Options) error { func createNewBolt(path string, _ graph.Options) error {
@ -72,7 +73,8 @@ func createNewBolt(path string, _ graph.Options) error {
func newQuadStore(path string, options graph.Options) (graph.TripleStore, error) { func newQuadStore(path string, options graph.Options) (graph.TripleStore, error) {
var qs QuadStore var qs QuadStore
var err error var err error
qs.hasher = sha1.New() qs.hasherSize = sha1.Size
qs.makeHasher = sha1.New
db, err := bolt.Open(path, 0600, nil) db, err := bolt.Open(path, 0600, nil)
if err != nil { if err != nil {
glog.Errorln("Error, couldn't open! ", err) glog.Errorln("Error, couldn't open! ", err)
@ -128,17 +130,19 @@ func bucketFor(d [4]quad.Direction) []byte {
} }
func (qs *QuadStore) createKeyFor(d [4]quad.Direction, triple quad.Quad) []byte { func (qs *QuadStore) createKeyFor(d [4]quad.Direction, triple quad.Quad) []byte {
key := make([]byte, 0, (qs.hasher.Size() * 4)) hasher := qs.makeHasher()
key = append(key, qs.convertStringToByteHash(triple.Get(d[0]))...) key := make([]byte, 0, (qs.hasherSize * 4))
key = append(key, qs.convertStringToByteHash(triple.Get(d[1]))...) key = append(key, qs.convertStringToByteHash(triple.Get(d[0]), hasher)...)
key = append(key, qs.convertStringToByteHash(triple.Get(d[2]))...) key = append(key, qs.convertStringToByteHash(triple.Get(d[1]), hasher)...)
key = append(key, qs.convertStringToByteHash(triple.Get(d[3]))...) key = append(key, qs.convertStringToByteHash(triple.Get(d[2]), hasher)...)
key = append(key, qs.convertStringToByteHash(triple.Get(d[3]), hasher)...)
return key return key
} }
func (qs *QuadStore) createValueKeyFor(s string) []byte { func (qs *QuadStore) createValueKeyFor(s string) []byte {
key := make([]byte, 0, qs.hasher.Size()) hasher := qs.makeHasher()
key = append(key, qs.convertStringToByteHash(s)...) key := make([]byte, 0, qs.hasherSize)
key = append(key, qs.convertStringToByteHash(s, hasher)...)
return key return key
} }
@ -354,11 +358,11 @@ func (qs *QuadStore) Quad(k graph.Value) quad.Quad {
return q return q
} }
func (qs *QuadStore) convertStringToByteHash(s string) []byte { func (qs *QuadStore) convertStringToByteHash(s string, hasher hash.Hash) []byte {
qs.hasher.Reset() hasher.Reset()
key := make([]byte, 0, qs.hasher.Size()) key := make([]byte, 0, qs.hasherSize)
qs.hasher.Write([]byte(s)) hasher.Write([]byte(s))
key = qs.hasher.Sum(key) key = hasher.Sum(key)
return key return key
} }
@ -463,7 +467,7 @@ func (qs *QuadStore) TripleDirection(val graph.Value, d quad.Direction) graph.Va
if offset != -1 { if offset != -1 {
return &Token{ return &Token{
bucket: nodeBucket, bucket: nodeBucket,
key: v.key[offset : offset+qs.hasher.Size()], key: v.key[offset : offset+qs.hasherSize],
} }
} else { } else {
return qs.ValueOf(qs.Quad(v).Get(d)) return qs.ValueOf(qs.Quad(v).Get(d))