Skip to content

Commit

Permalink
Merge pull request #9 from RTradeLtd/fix/query#count
Browse files Browse the repository at this point in the history
Fix Query Not Returning Correct Result Count
  • Loading branch information
postables committed Jun 30, 2019
2 parents 19efa35 + e0e08b1 commit f14b92b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 23 deletions.
33 changes: 11 additions & 22 deletions datastore.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,47 +90,36 @@ func (d *Datastore) GetSize(key datastore.Key) (int, error) {
// https://github.com/ipfs/go-datastore/blob/aa9190c18f1576be98e974359fd08c64ca0b5a94/examples/fs.go#L96
// https://github.com/etcd-io/bbolt#prefix-scans
func (d *Datastore) Query(q query.Query) (query.Results, error) {
resBuilder := query.NewResultBuilder(q)
var entries []query.Entry
if err := d.db.View(func(tx *bbolt.Tx) error {
cursor := tx.Bucket(d.bucket).Cursor()
if q.Prefix == "" {
for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
result := query.Result{}
key := datastore.NewKey(string(k))
result.Entry.Key = key.String()
var entry query.Entry
entry.Key = string(k)
if !q.KeysOnly {
result.Entry.Value = v
}
select {
case resBuilder.Output <- result:
default:
continue
entry.Value = v
}
entries = append(entries, entry)
}
return nil
}
pref := []byte(q.Prefix)
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()
var entry query.Entry
entry.Key = string(k)
if !q.KeysOnly {
result.Entry.Value = v
}
// initiate a non-blocking channel send
select {
case resBuilder.Output <- result:
default:
continue
entry.Value = v
}
entries = append(entries, entry)
}
return nil
}); err != nil {
return nil, err
}
results := query.ResultsWithEntries(q, entries)
// close the result builder since we are done using it
resBuilder.Process.Close()
return resBuilder.Results(), nil
return results, nil
}

// Batch returns a basic batched bolt datastore wrapper
Expand Down
11 changes: 10 additions & 1 deletion datastore_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dsbbolt

import (
"fmt"
"testing"

"reflect"
Expand Down Expand Up @@ -41,9 +42,13 @@ func Test_Datastore(t *testing.T) {
}
defer ds.Close()
key := datastore.NewKey("keks")
key2 := datastore.NewKey("keks2")
if err := ds.Put(key, []byte("hello world")); err != nil {
t.Fatal(err)
}
if err := ds.Put(key2, []byte("hello world")); err != nil {
t.Fatal(err)
}
data, err := ds.Get(key)
if err != nil {
t.Fatal(err)
Expand All @@ -70,7 +75,11 @@ func Test_Datastore(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if len(res) == 0 {
if len(res) != 2 {
fmt.Printf("only found %v results \n", len(res))
for _, v := range res {
fmt.Printf("%+v\n", v)
}
t.Fatal("bad number of results")
}
// test a query where we dont specify a search key
Expand Down

0 comments on commit f14b92b

Please sign in to comment.