@@ -3,6 +3,7 @@ local errors = require('errors')
3
3
local compare_conditions = require (' crud.compare.conditions' )
4
4
local utils = require (' crud.common.utils' )
5
5
local dev_checks = require (' crud.common.dev_checks' )
6
+ local sharding = require (' crud.common.sharding' )
6
7
7
8
local compat = require (' crud.common.compat' )
8
9
local has_keydef = compat .exists (' tuple.keydef' , ' key_def' )
@@ -48,7 +49,7 @@ local function get_index_for_condition(space_indexes, space_format, condition)
48
49
end
49
50
end
50
51
51
- local function extract_sharding_key_from_scan_value (scan_value , scan_index , sharding_index )
52
+ local function extract_sharding_key_from_scan_value (scan_value , scan_index , sharding_index , space_format , space_name )
52
53
if # scan_value < # sharding_index .parts then
53
54
return nil
54
55
end
@@ -62,6 +63,9 @@ local function extract_sharding_key_from_scan_value(scan_value, scan_index, shar
62
63
scan_value_fields_values [scan_index_part .fieldno ] = scan_value [i ]
63
64
end
64
65
66
+ -- getting sharding_key specified in DDL schema
67
+ local ddl_sharding_key = sharding .get_ddl_sharding_key (space_name )
68
+
65
69
-- check that sharding key is included in the scan index fields
66
70
local sharding_key = {}
67
71
for _ , sharding_key_part in ipairs (sharding_index .parts ) do
@@ -79,7 +83,20 @@ local function extract_sharding_key_from_scan_value(scan_value, scan_index, shar
79
83
return nil
80
84
end
81
85
82
- table.insert (sharding_key , field_value )
86
+ -- check if a field is a part of DDL sharding key
87
+ local is_sharding_key_found = false
88
+ if ddl_sharding_key ~= nil then
89
+ for _ , field_name in ipairs (ddl_sharding_key ) do
90
+ if fieldno == utils .get_fieldno_by_name (space_format , field_name ) then
91
+ is_sharding_key_found = true
92
+ break
93
+ end
94
+ end
95
+ end
96
+
97
+ if ddl_sharding_key == nil or is_sharding_key_found == true then
98
+ table.insert (sharding_key , field_value )
99
+ end
83
100
end
84
101
85
102
return sharding_key
@@ -226,12 +243,13 @@ function select_plan.new(space, conditions, opts)
226
243
end
227
244
end
228
245
229
- local sharding_index = primary_index -- XXX: only sharding by primary key is supported
230
-
246
+ -- getting sharding_key used in primary_index
247
+ local sharding_index = primary_index
231
248
-- get sharding key value
232
249
local sharding_key
233
250
if scan_value ~= nil and (scan_iter == box .index .EQ or scan_iter == box .index .REQ ) then
234
- sharding_key = extract_sharding_key_from_scan_value (scan_value , scan_index , sharding_index )
251
+ sharding_key = extract_sharding_key_from_scan_value (scan_value , scan_index ,
252
+ sharding_index , space_format , space_name )
235
253
end
236
254
237
255
if sharding_key ~= nil and opts .force_map_call ~= true then
0 commit comments