@@ -58,9 +58,11 @@ var _ = gg.Describe("Query operations", func() {
58
58
bin4 := as .NewBin ("Aerospike4" , "constValue" )
59
59
bin5 := as .NewBin ("Aerospike5" , - 1 )
60
60
bin6 := as .NewBin ("Aerospike6" , 1 )
61
+ bin7 := as .NewBin ("Aerospike7" , nil )
61
62
var keys map [string ]* as.Key
62
63
var indexName string
63
64
var indexName2 string
65
+ var indexName3 string
64
66
65
67
// read all records from the channel and make sure all of them are returned
66
68
var checkResults = func (recordset * as.Recordset , cancelCnt int ) {
@@ -118,7 +120,8 @@ var _ = gg.Describe("Query operations", func() {
118
120
119
121
keys [string (key .Digest ())] = key
120
122
bin3 = as .NewBin ("Aerospike3" , rand .Intn (math .MaxInt16 ))
121
- err = client .PutBins (wpolicy , key , bin1 , bin2 , bin3 , bin4 , bin5 , bin6 )
123
+ bin7 = as .NewBin ("Aerospike7" , i % 3 )
124
+ err = client .PutBins (wpolicy , key , bin1 , bin2 , bin3 , bin4 , bin5 , bin6 , bin7 )
122
125
gm .Expect (err ).ToNot (gm .HaveOccurred ())
123
126
}
124
127
@@ -129,6 +132,10 @@ var _ = gg.Describe("Query operations", func() {
129
132
// queries only work on indices
130
133
indexName2 = set + bin6 .Name
131
134
createIndex (wpolicy , ns , set , indexName2 , bin6 .Name , as .NUMERIC )
135
+
136
+ // queries only work on indices
137
+ indexName3 = set + bin7 .Name
138
+ createIndex (wpolicy , ns , set , indexName3 , bin7 .Name , as .NUMERIC )
132
139
})
133
140
134
141
gg .AfterEach (func () {
@@ -137,6 +144,9 @@ var _ = gg.Describe("Query operations", func() {
137
144
138
145
indexName = set + bin6 .Name
139
146
gm .Expect (client .DropIndex (nil , ns , set , indexName )).ToNot (gm .HaveOccurred ())
147
+
148
+ indexName = set + bin7 .Name
149
+ gm .Expect (client .DropIndex (nil , ns , set , indexName )).ToNot (gm .HaveOccurred ())
140
150
})
141
151
142
152
var queryPolicy = as .NewQueryPolicy ()
@@ -170,7 +180,7 @@ var _ = gg.Describe("Query operations", func() {
170
180
gm .Expect (counter ).To (gm .Equal (keyCount ))
171
181
})
172
182
173
- gg .It ("must Query and get all partition records back for a specified key" , func () {
183
+ gg .It ("must Scan and get all partition records back for a specified key" , func () {
174
184
gm .Expect (len (keys )).To (gm .Equal (keyCount ))
175
185
176
186
counter := 0
@@ -203,6 +213,77 @@ var _ = gg.Describe("Query operations", func() {
203
213
gm .Expect (counter ).To (gm .BeNumerically ("<" , keyCount ))
204
214
})
205
215
216
+ gg .It ("must Query per key partition and get all partition records back for a specified key and filter" , func () {
217
+ gm .Expect (len (keys )).To (gm .Equal (keyCount ))
218
+
219
+ counter := 0
220
+
221
+ var rkey * as.Key
222
+ for _ , k := range keys {
223
+ rkey = k
224
+
225
+ pf := as .NewPartitionFilterByKey (rkey )
226
+ stm := as .NewStatement (ns , set )
227
+ stm .SetFilter (as .NewRangeFilter (bin7 .Name , 1 , 2 ))
228
+ recordset , err := client .QueryPartitions (queryPolicy , stm , pf )
229
+ gm .Expect (err ).ToNot (gm .HaveOccurred ())
230
+
231
+ for res := range recordset .Results () {
232
+ gm .Expect (res .Err ).NotTo (gm .HaveOccurred ())
233
+ gm .Expect (res .Record .Bins [bin1 .Name ]).To (gm .Equal (bin1 .Value .GetObject ()))
234
+ gm .Expect (res .Record .Bins [bin2 .Name ]).To (gm .Equal (bin2 .Value .GetObject ()))
235
+
236
+ delete (keys , string (res .Record .Key .Digest ()))
237
+
238
+ counter ++
239
+ }
240
+ }
241
+
242
+ gm .Expect (len (keys )).To (gm .Equal (334 ))
243
+ // This depends on how many keys end up in the same partition.
244
+ // Since keys are statistically distributed randomly and uniformly,
245
+ // we expect that there aren't many partitions that share more than one key.
246
+ gm .Expect (counter ).To (gm .BeNumerically ("~" , keyCount - 334 , 50 ))
247
+ })
248
+
249
+ gg .It ("must Query and get all partition records back for a specified key and filter" , func () {
250
+ gm .Expect (len (keys )).To (gm .Equal (keyCount ))
251
+
252
+ counter := 0
253
+
254
+ pf := as .NewPartitionFilterAll ()
255
+ stm := as .NewStatement (ns , set )
256
+ stm .SetFilter (as .NewRangeFilter (bin7 .Name , 1 , 2 ))
257
+ recordset , err := client .QueryPartitions (queryPolicy , stm , pf )
258
+ gm .Expect (err ).ToNot (gm .HaveOccurred ())
259
+
260
+ for res := range recordset .Results () {
261
+ gm .Expect (res .Err ).NotTo (gm .HaveOccurred ())
262
+ gm .Expect (res .Record .Bins [bin1 .Name ]).To (gm .Equal (bin1 .Value .GetObject ()))
263
+ gm .Expect (res .Record .Bins [bin2 .Name ]).To (gm .Equal (bin2 .Value .GetObject ()))
264
+
265
+ delete (keys , string (res .Record .Key .Digest ()))
266
+
267
+ counter ++
268
+ }
269
+
270
+ gm .Expect (len (keys )).To (gm .Equal (334 ))
271
+ gm .Expect (counter ).To (gm .Equal (keyCount - 334 ))
272
+ })
273
+
274
+ gg .It ("must return error on a Query when index is not found" , func () {
275
+ pf := as .NewPartitionFilterAll ()
276
+ stm := as .NewStatement (ns , set )
277
+ stm .SetFilter (as .NewRangeFilter (randString (10 ), 1 , 2 ))
278
+ recordset , err := client .QueryPartitions (queryPolicy , stm , pf )
279
+ gm .Expect (err ).ToNot (gm .HaveOccurred ())
280
+
281
+ for res := range recordset .Results () {
282
+ gm .Expect (res .Err ).To (gm .HaveOccurred ())
283
+ gm .Expect (res .Err .Matches (ast .INDEX_NOTFOUND )).To (gm .BeTrue ())
284
+ }
285
+ })
286
+
206
287
gg .It ("must Query and get all partition records back for a specified partition range" , func () {
207
288
gm .Expect (len (keys )).To (gm .Equal (keyCount ))
208
289
0 commit comments