@@ -3,6 +3,7 @@ local crud = require('crud')
33local t = require (' luatest' )
44
55local helpers = require (' test.helper' )
6+ local storage_stat = require (' test.helpers.storage_stat' )
67
78local ok = pcall (require , ' ddl' )
89if not ok then
@@ -46,6 +47,9 @@ pgroup.after_all(function(g) helpers.stop_cluster(g.cluster) end)
4647
4748pgroup .before_each (function (g )
4849 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' )
4953end )
5054
5155pgroup .test_insert_object = function (g )
@@ -246,3 +250,127 @@ pgroup.test_upsert = function(g)
246250 local result = conn_s2 .space [' customers_name_key' ]:get ({1 , ' John' })
247251 t .assert_equals (result , nil )
248252end
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