diff options
Diffstat (limited to 'vendor/github.com/couchbase/vellum/fst.go')
-rw-r--r-- | vendor/github.com/couchbase/vellum/fst.go | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/vendor/github.com/couchbase/vellum/fst.go b/vendor/github.com/couchbase/vellum/fst.go index ecc528395c..64ee21a410 100644 --- a/vendor/github.com/couchbase/vellum/fst.go +++ b/vendor/github.com/couchbase/vellum/fst.go @@ -74,8 +74,8 @@ func (f *FST) get(input []byte, prealloc fstState) (uint64, bool, error) { if err != nil { return 0, false, err } - for i := range input { - _, curr, output := state.TransitionFor(input[i]) + for _, c := range input { + _, curr, output := state.TransitionFor(c) if curr == noneAddr { return 0, false, nil } @@ -243,6 +243,52 @@ func (f *FST) Reader() (*Reader, error) { return &Reader{f: f}, nil } +func (f *FST) GetMinKey() ([]byte, error) { + var rv []byte + + curr := f.decoder.getRoot() + state, err := f.decoder.stateAt(curr, nil) + if err != nil { + return nil, err + } + + for !state.Final() { + nextTrans := state.TransitionAt(0) + _, curr, _ = state.TransitionFor(nextTrans) + state, err = f.decoder.stateAt(curr, state) + if err != nil { + return nil, err + } + + rv = append(rv, nextTrans) + } + + return rv, nil +} + +func (f *FST) GetMaxKey() ([]byte, error) { + var rv []byte + + curr := f.decoder.getRoot() + state, err := f.decoder.stateAt(curr, nil) + if err != nil { + return nil, err + } + + for state.NumTransitions() > 0 { + nextTrans := state.TransitionAt(state.NumTransitions() - 1) + _, curr, _ = state.TransitionFor(nextTrans) + state, err = f.decoder.stateAt(curr, state) + if err != nil { + return nil, err + } + + rv = append(rv, nextTrans) + } + + return rv, nil +} + // A Reader is meant for a single threaded use type Reader struct { f *FST |