summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/couchbase/vellum/fst.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/couchbase/vellum/fst.go')
-rw-r--r--vendor/github.com/couchbase/vellum/fst.go50
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