Skip to content

Commit

Permalink
Merge pull request #7 from RTradeLtd/query/fix#prefix
Browse files Browse the repository at this point in the history
Enable Proper Prefix Searching
  • Loading branch information
postables committed Jun 28, 2019
2 parents 7270336 + 134ec58 commit 19efa35
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
10 changes: 5 additions & 5 deletions datastore.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,18 +88,18 @@ func (d *Datastore) GetSize(key datastore.Key) (int, error) {
// Query performs a complex search query on the underlying datastore
// For more information see :
// https://github.com/ipfs/go-datastore/blob/aa9190c18f1576be98e974359fd08c64ca0b5a94/examples/fs.go#L96
// https://github.com/boltdb/bolt/issues/518#issuecomment-187211346
// https://github.com/etcd-io/bbolt#prefix-scans
func (d *Datastore) Query(q query.Query) (query.Results, error) {
resBuilder := query.NewResultBuilder(q)
if err := d.db.View(func(tx *bbolt.Tx) error {
cursor := tx.Bucket(d.bucket).Cursor()
if q.Prefix == "" {
for k, _ := cursor.First(); k != nil; k, _ = cursor.Next() {
for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
result := query.Result{}
key := datastore.NewKey(string(k))
result.Entry.Key = key.String()
if !q.KeysOnly {
result.Entry.Value, result.Error = d.Get(key)
result.Entry.Value = v
}
select {
case resBuilder.Output <- result:
Expand All @@ -110,12 +110,12 @@ func (d *Datastore) Query(q query.Query) (query.Results, error) {
return nil
}
pref := []byte(q.Prefix)
for k, _ := cursor.Seek(pref); bytes.HasPrefix(k, pref); k, _ = cursor.Next() {
for k, v := cursor.Seek(pref); k != nil && bytes.HasPrefix(k, pref); k, v = cursor.Next() {
result := query.Result{}
key := datastore.NewKey(string(k))
result.Entry.Key = key.String()
if !q.KeysOnly {
result.Entry.Value, result.Error = d.Get(key)
result.Entry.Value = v
}
// initiate a non-blocking channel send
select {
Expand Down
21 changes: 16 additions & 5 deletions datastore_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package dsbbolt

import (
"fmt"
"testing"

"reflect"
Expand Down Expand Up @@ -71,8 +70,8 @@ func Test_Datastore(t *testing.T) {
if err != nil {
t.Fatal(err)
}
for _, v := range res {
fmt.Printf("%+v\n", v)
if len(res) == 0 {
t.Fatal("bad number of results")
}
// test a query where we dont specify a search key
rs, err = ds.Query(query.Query{})
Expand All @@ -83,8 +82,20 @@ func Test_Datastore(t *testing.T) {
if err != nil {
t.Fatal(err)
}
for _, v := range res {
fmt.Printf("%+v\n", v)
if len(res) == 0 {
t.Fatal("bad number of results")
}
// test a query where we specify a partial prefix
rs, err = ds.Query(query.Query{Prefix: "/kek"})
if err != nil {
t.Fatal(err)
}
res, err = rs.Rest()
if err != nil {
t.Fatal(err)
}
if len(res) == 0 {
t.Fatal("bad number of results")
}
if err := ds.Delete(key); err != nil {
t.Fatal(err)
Expand Down

0 comments on commit 19efa35

Please sign in to comment.