Skip to content

Commit af06d32

Browse files
committed
test ordered queries
1 parent b503c74 commit af06d32

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

datastore.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -114,22 +114,26 @@ func (a *accessor) Delete(key ds.Key) (err error) {
114114

115115
func (a *accessor) Query(q dsq.Query) (dsq.Results, error) {
116116
var rnge *util.Range
117+
118+
// make a copy of the query for the fallback naive query implementation.
119+
// don't modify the original so res.Query() returns the correct results.
120+
qNaive := q
117121
if q.Prefix != "" {
118122
rnge = util.BytesPrefix([]byte(q.Prefix))
119-
q.Prefix = ""
123+
qNaive.Prefix = ""
120124
}
121125
i := a.ldb.NewIterator(rnge, nil)
122126
next := i.Next
123127
if len(q.Orders) > 0 {
124128
switch q.Orders[0].(type) {
125129
case dsq.OrderByKey, *dsq.OrderByKey:
126-
q.Orders = nil
130+
qNaive.Orders = nil
127131
case dsq.OrderByKeyDescending, *dsq.OrderByKeyDescending:
128132
next = func() bool {
129133
next = i.Prev
130134
return i.Last()
131135
}
132-
q.Orders = nil
136+
qNaive.Orders = nil
133137
default:
134138
}
135139
}
@@ -153,7 +157,7 @@ func (a *accessor) Query(q dsq.Query) (dsq.Results, error) {
153157
return nil
154158
},
155159
})
156-
return dsq.NaiveQueryApply(q, r), nil
160+
return dsq.NaiveQueryApply(qNaive, r), nil
157161
}
158162

159163
// DiskUsage returns the current disk size used by this levelDB.

ds_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"io/ioutil"
77
"os"
8+
"sort"
89
"testing"
910

1011
ds "github.com/ipfs/go-datastore"
@@ -101,6 +102,33 @@ func testQuery(t *testing.T, d *Datastore) {
101102
"/a/b/d",
102103
"/a/c",
103104
}, rs)
105+
106+
// test order
107+
108+
rs, err = d.Query(dsq.Query{Orders: []dsq.Order{dsq.OrderByKey{}}})
109+
if err != nil {
110+
t.Fatal(err)
111+
}
112+
113+
keys := make([]string, 0, len(testcases))
114+
for k := range testcases {
115+
keys = append(keys, k)
116+
}
117+
sort.Strings(keys)
118+
119+
expectOrderedMatches(t, keys, rs)
120+
121+
rs, err = d.Query(dsq.Query{Orders: []dsq.Order{dsq.OrderByKeyDescending{}}})
122+
if err != nil {
123+
t.Fatal(err)
124+
}
125+
126+
// reverse
127+
for i, j := 0, len(keys)-1; i < j; i, j = i+1, j-1 {
128+
keys[i], keys[j] = keys[j], keys[i]
129+
}
130+
131+
expectOrderedMatches(t, keys, rs)
104132
}
105133

106134
func TestQuery(t *testing.T) {
@@ -125,6 +153,7 @@ func TestQueryRespectsProcessMem(t *testing.T) {
125153
}
126154

127155
func expectMatches(t *testing.T, expect []string, actualR dsq.Results) {
156+
t.Helper()
128157
actual, err := actualR.Rest()
129158
if err != nil {
130159
t.Error(err)
@@ -146,6 +175,23 @@ func expectMatches(t *testing.T, expect []string, actualR dsq.Results) {
146175
}
147176
}
148177

178+
func expectOrderedMatches(t *testing.T, expect []string, actualR dsq.Results) {
179+
t.Helper()
180+
actual, err := actualR.Rest()
181+
if err != nil {
182+
t.Error(err)
183+
}
184+
185+
if len(actual) != len(expect) {
186+
t.Error("not enough", expect, actual)
187+
}
188+
for i := range expect {
189+
if expect[i] != actual[i].Key {
190+
t.Errorf("expected %q, got %q", expect[i], actual[i].Key)
191+
}
192+
}
193+
}
194+
149195
func testBatching(t *testing.T, d *Datastore) {
150196
b, err := d.Batch()
151197
if err != nil {

0 commit comments

Comments
 (0)