@@ -3,6 +3,7 @@ local crud = require('crud')
3
3
local t = require (' luatest' )
4
4
5
5
local helpers = require (' test.helper' )
6
+ local storage_stat = require (' test.helpers.storage_stat' )
6
7
7
8
local ok = pcall (require , ' ddl' )
8
9
if not ok then
@@ -46,6 +47,9 @@ pgroup.after_all(function(g) helpers.stop_cluster(g.cluster) end)
46
47
47
48
pgroup .before_each (function (g )
48
49
helpers .truncate_space_on_cluster (g .cluster , ' customers_name_key' )
50
+ helpers .truncate_space_on_cluster (g .cluster , ' customers_name_key_uniq_index' )
51
+ helpers .truncate_space_on_cluster (g .cluster , ' customers_name_key_non_uniq_index' )
52
+ helpers .truncate_space_on_cluster (g .cluster , ' customers_secondary_idx_name_key' )
49
53
end )
50
54
51
55
pgroup .test_insert_object = function (g )
@@ -246,3 +250,127 @@ pgroup.test_upsert = function(g)
246
250
local result = conn_s2 .space [' customers_name_key' ]:get ({1 , ' John' })
247
251
t .assert_equals (result , nil )
248
252
end
253
+
254
+ -- The main purpose of testcase is to verify that CRUD will calculate bucket_id
255
+ -- using secondary sharding key (name) correctly and will get tuple on storage
256
+ -- in replicaset s2.
257
+ -- bucket_id was calculated using function below:
258
+ -- function(key)
259
+ -- return require('vshard.hash').strcrc32(key) % 3000 + 1
260
+ -- end
261
+ -- where 3000 is a default number of buckets used in vshard.
262
+ pgroup .test_select = function (g )
263
+ -- bucket_id is 234, storage is s-2
264
+ local tuple = {8 , 234 , ' Ptolemy' , 20 }
265
+
266
+ -- Put tuple to s2 replicaset.
267
+ local conn_s2 = g .cluster :server (' s2-master' ).net_box
268
+ local result = conn_s2 .space [' customers_name_key' ]:insert (tuple )
269
+ t .assert_not_equals (result , nil )
270
+
271
+ local conditions = {{' ==' , ' name' , ' Ptolemy' }}
272
+ local result , err = g .cluster .main_server .net_box :call (' crud.select' , {
273
+ ' customers_name_key' , conditions ,
274
+ })
275
+
276
+ t .assert_equals (err , nil )
277
+ t .assert_equals (# result .rows , 1 )
278
+ t .assert_equals (result .rows [1 ], tuple )
279
+ end
280
+
281
+ -- TODO: After enabling support of sharding keys that are not equal to primary
282
+ -- keys, we should handle it differently: it is not enough to look just on scan
283
+ -- value, we should traverse all conditions. Now missed cases lead to
284
+ -- map-reduce. Will be resolved in #213.
285
+ pgroup .test_select_wont_lead_map_reduce = function (g )
286
+ local space_name = ' customers_name_key_uniq_index'
287
+
288
+ local conn_s1 = g .cluster :server (' s1-master' ).net_box
289
+ local conn_s2 = g .cluster :server (' s2-master' ).net_box
290
+
291
+ -- bucket_id is 477, storage is s-2
292
+ local result = conn_s2 .space [space_name ]:insert ({1 , 477 , ' Viktor Pelevin' , 58 })
293
+ t .assert_not_equals (result , nil )
294
+ -- bucket_id is 401, storage is s-1
295
+ local result = conn_s1 .space [space_name ]:insert ({2 , 401 , ' Isaac Asimov' , 72 })
296
+ t .assert_not_equals (result , nil )
297
+ -- bucket_id is 2804, storage is s-2
298
+ local result = conn_s2 .space [space_name ]:insert ({3 , 2804 , ' Aleksandr Solzhenitsyn' , 89 })
299
+ t .assert_not_equals (result , nil )
300
+ -- bucket_id is 1161, storage is s-2
301
+ local result = conn_s2 .space [space_name ]:insert ({4 , 1161 , ' James Joyce' , 59 })
302
+ t .assert_not_equals (result , nil )
303
+
304
+ local stat_a = storage_stat .collect (g .cluster )
305
+
306
+ -- Select a tuple with name 'Viktor Pelevin'.
307
+ local result , err = g .cluster .main_server .net_box :call (' crud.select' , {
308
+ space_name , {{' ==' , ' name' , ' Viktor Pelevin' }}
309
+ })
310
+ t .assert_equals (err , nil )
311
+ t .assert_not_equals (result , nil )
312
+ t .assert_equals (# result .rows , 1 )
313
+
314
+ local stat_b = storage_stat .collect (g .cluster )
315
+
316
+ -- Check a number of select() requests made by CRUD on cluster's storages
317
+ -- after calling select() on a router. Make sure only a single storage has
318
+ -- a single select() request. Otherwise we lead map-reduce.
319
+ t .assert_equals (storage_stat .diff (stat_b , stat_a ), {
320
+ [' s-1' ] = {
321
+ select_requests = 0 ,
322
+ },
323
+ [' s-2' ] = {
324
+ select_requests = 1 ,
325
+ },
326
+ })
327
+ end
328
+
329
+ pgroup .test_select_secondary_idx = function (g )
330
+ local tuple = {2 , box .NULL , ' Ivan' , 20 }
331
+
332
+ -- insert tuple
333
+ local result , err = g .cluster .main_server .net_box :call (' crud.insert' , {
334
+ ' customers_secondary_idx_name_key' , tuple
335
+ })
336
+
337
+ t .assert_equals (err , nil )
338
+ t .assert_not_equals (result , nil )
339
+ t .assert_equals (# result .rows , 1 )
340
+
341
+ local conditions = {{' ==' , ' name' , ' Ivan' }}
342
+
343
+ local result , err = g .cluster .main_server .net_box :call (' crud.select' , {
344
+ ' customers_secondary_idx_name_key' , conditions ,
345
+ })
346
+
347
+ t .assert_equals (err , nil )
348
+ t .assert_equals (# result .rows , 1 )
349
+ t .assert_equals (result .rows [1 ], {2 , 1366 , ' Ivan' , 20 })
350
+ end
351
+
352
+ pgroup .test_select_non_unique_index = function (g )
353
+ local space_name = ' customers_name_key_non_uniq_index'
354
+ local customers = helpers .insert_objects (g , space_name , {
355
+ {id = 1 , name = ' Viktor Pelevin' , age = 58 },
356
+ {id = 2 , name = ' Isaac Asimov' , age = 72 },
357
+ {id = 3 , name = ' Aleksandr Solzhenitsyn' , age = 89 },
358
+ {id = 4 , name = ' James Joyce' , age = 59 },
359
+ {id = 5 , name = ' Oscar Wilde' , age = 46 },
360
+ -- First tuple with name 'Ivan Bunin'.
361
+ {id = 6 , name = ' Ivan Bunin' , age = 83 },
362
+ {id = 7 , name = ' Ivan Turgenev' , age = 64 },
363
+ {id = 8 , name = ' Alexander Ostrovsky' , age = 63 },
364
+ {id = 9 , name = ' Anton Chekhov' , age = 44 },
365
+ -- Second tuple with name 'Ivan Bunin'.
366
+ {id = 10 , name = ' Ivan Bunin' , age = 83 },
367
+ })
368
+ t .assert_equals (# customers , 10 )
369
+
370
+ local result , err = g .cluster .main_server .net_box :call (' crud.select' , {
371
+ space_name , {{' ==' , ' name' , ' Ivan Bunin' }}
372
+ })
373
+ t .assert_equals (err , nil )
374
+ t .assert_not_equals (result , nil )
375
+ t .assert_equals (# result .rows , 2 )
376
+ end
0 commit comments