Skip to content

Commit 9a70b63

Browse files
AnaNekTotktonada
authored andcommitted
Separate modules for working with conditions from select module
For `count` implementation with the support of the query by conditions there is a need to use query plan and condition filters that has been already written for select. This commit separates common methods from select module and moves them in common folders. Part of #74
1 parent 842b30a commit 9a70b63

17 files changed

+70
-65
lines changed

crud/common/sharding.lua

+12
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,24 @@ local vshard = require('vshard')
22
local errors = require('errors')
33

44
local BucketIDError = errors.new_class("BucketIDError", {capture_stack = false})
5+
local GetReplicasetsError = errors.new_class('GetReplicasetsError', {capture_stack = false})
56

67
local utils = require('crud.common.utils')
78
local sharding_key_module = require('crud.common.sharding_key')
89

910
local sharding = {}
1011

12+
function sharding.get_replicasets_by_bucket_id(bucket_id)
13+
local replicaset, err = vshard.router.route(bucket_id)
14+
if replicaset == nil then
15+
return nil, GetReplicasetsError:new("Failed to get replicaset for bucket_id %s: %s", bucket_id, err.err)
16+
end
17+
18+
return {
19+
[replicaset.uuid] = replicaset,
20+
}
21+
end
22+
1123
function sharding.key_get_bucket_id(key, specified_bucket_id)
1224
if specified_bucket_id ~= nil then
1325
return specified_bucket_id
File renamed without changes.

crud/select/plan.lua renamed to crud/compare/plan.lua

+7-4
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ if has_keydef then
1212
keydef_lib = compat.require('tuple.keydef', 'key_def')
1313
end
1414

15-
local select_plan = {}
15+
local plan = {}
1616

1717
local IndexTypeError = errors.new_class('IndexTypeError', {capture_stack = false})
1818
local FilterFieldsError = errors.new_class('FilterFieldsError', {capture_stack = false})
1919
local NoIndexesError = errors.new_class('NoIndexesError', {capture_stack = false})
2020

21+
-- TREE index helps reducing the number of tuples to scan.
22+
-- Otherwise a full scan is performed. So at least one of
23+
-- condition indexes or primary index should be of type TREE
2124
local function index_is_allowed(index)
2225
return index.type == 'TREE'
2326
end
@@ -158,7 +161,7 @@ local function construct_after_tuple_by_fields(fieldno_map, field_names, tuple)
158161
return transformed_tuple
159162
end
160163

161-
function select_plan.new(space, conditions, opts)
164+
function plan.new(space, conditions, opts)
162165
dev_checks('table', '?table', {
163166
first = '?number',
164167
after_tuple = '?table|cdata',
@@ -297,9 +300,9 @@ function select_plan.new(space, conditions, opts)
297300
return plan
298301
end
299302

300-
select_plan.internal = {
303+
plan.internal = {
301304
get_sharding_key_from_scan_value = get_sharding_key_from_scan_value,
302305
extract_sharding_key_from_conditions = extract_sharding_key_from_conditions
303306
}
304307

305-
return select_plan
308+
return plan

crud/select.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ local errors = require('errors')
22

33
local utils = require('crud.common.utils')
44
local select_executor = require('crud.select.executor')
5-
local select_filters = require('crud.select.filters')
5+
local select_filters = require('crud.compare.filters')
66
local dev_checks = require('crud.common.dev_checks')
77
local schema = require('crud.common.schema')
88

crud/select/compat/common.lua

+4-22
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,6 @@
1-
local vshard = require('vshard')
2-
local errors = require('errors')
1+
local common = {}
32

4-
local GetReplicasetsError = errors.new_class('GetReplicasetsError')
3+
common.SELECT_FUNC_NAME = '_crud.select_on_storage'
4+
common.DEFAULT_BATCH_SIZE = 100
55

6-
local SELECT_FUNC_NAME = '_crud.select_on_storage'
7-
local DEFAULT_BATCH_SIZE = 100
8-
9-
local function get_replicasets_by_sharding_key(bucket_id)
10-
local replicaset, err = vshard.router.route(bucket_id)
11-
if replicaset == nil then
12-
return nil, GetReplicasetsError:new("Failed to get replicaset for bucket_id %s: %s", bucket_id, err.err)
13-
end
14-
15-
return {
16-
[replicaset.uuid] = replicaset,
17-
}
18-
end
19-
20-
return {
21-
get_replicasets_by_sharding_key = get_replicasets_by_sharding_key,
22-
SELECT_FUNC_NAME = SELECT_FUNC_NAME,
23-
DEFAULT_BATCH_SIZE = DEFAULT_BATCH_SIZE,
24-
}
6+
return common

crud/select/compat/select.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ local schema = require('crud.common.schema')
1010
local sharding_key_module = require('crud.common.sharding_key')
1111

1212
local compare_conditions = require('crud.compare.conditions')
13-
local select_plan = require('crud.select.plan')
13+
local select_plan = require('crud.compare.plan')
1414

1515
local Merger = require('crud.select.merger')
1616

@@ -107,7 +107,7 @@ local function build_select_iterator(space_name, user_conditions, opts)
107107
assert(bucket_id ~= nil)
108108

109109
local err
110-
replicasets_to_select, err = common.get_replicasets_by_sharding_key(bucket_id)
110+
replicasets_to_select, err = sharding.get_replicasets_by_bucket_id(bucket_id)
111111
if err ~= nil then
112112
return nil, err, true
113113
end

crud/select/compat/select_old.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ local schema = require('crud.common.schema')
1111
local sharding_key_module = require('crud.common.sharding_key')
1212

1313
local compare_conditions = require('crud.compare.conditions')
14-
local select_plan = require('crud.select.plan')
14+
local select_plan = require('crud.compare.plan')
1515
local select_comparators = require('crud.compare.comparators')
1616
local common = require('crud.select.compat.common')
1717

@@ -133,7 +133,7 @@ local function build_select_iterator(space_name, user_conditions, opts)
133133
assert(bucket_id ~= nil)
134134

135135
local err
136-
replicasets_to_select, err = common.get_replicasets_by_sharding_key(bucket_id)
136+
replicasets_to_select, err = sharding.get_replicasets_by_bucket_id(bucket_id)
137137
if err ~= nil then
138138
return nil, err, true
139139
end

test/helpers/storage_stat.lua

+22-14
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ local helpers = require('test.helper')
33

44
local storage_stat = {}
55

6-
-- Wrap crud's select_on_storage() function to count selects
7-
-- and add storage_stat() function that returns resulting
8-
-- statistics.
6+
-- Wrap crud's select_on_storage()/count_on_storage()
7+
-- function to count selects/counts and add storage_stat()
8+
-- function that returns resulting statistics.
99
--
1010
-- Call it after crud's initialization.
11-
function storage_stat.init_on_storage()
12-
assert(_G._crud.select_on_storage ~= nil)
11+
function storage_stat.init_on_storage(method_on_storage_name)
12+
assert(_G._crud[method_on_storage_name] ~= nil)
1313

1414
-- Here we count requests.
1515
local storage_stat_table = {
16-
select_requests = 0,
16+
requests = 0,
1717
}
1818

19-
-- Wrap select_on_storage() function.
20-
local select_on_storage_saved = _G._crud.select_on_storage
21-
_G._crud.select_on_storage = function(...)
22-
local requests = storage_stat_table.select_requests
23-
storage_stat_table.select_requests = requests + 1
24-
return select_on_storage_saved(...)
19+
-- Wrap method on storage function.
20+
local requests_on_storage_saved = _G._crud[method_on_storage_name]
21+
_G._crud[method_on_storage_name] = function(...)
22+
local requests = storage_stat_table.requests
23+
storage_stat_table.requests = requests + 1
24+
return requests_on_storage_saved(...)
2525
end
2626

2727
-- Accessor for the statistics.
@@ -30,6 +30,14 @@ function storage_stat.init_on_storage()
3030
end)
3131
end
3232

33+
function storage_stat.init_on_storage_for_select()
34+
storage_stat.init_on_storage('select_on_storage')
35+
end
36+
37+
function storage_stat.init_on_storage_for_count()
38+
storage_stat.init_on_storage('count_on_storage')
39+
end
40+
3341
-- Accumulate statistics from storages.
3442
--
3543
-- The statistics is grouped by replicasets.
@@ -96,12 +104,12 @@ function storage_stat.diff(a, b)
96104
end
97105

98106
-- Accepts collect (or diff) return value and returns
99-
-- total number of select requests across all storages.
107+
-- total number of select/count requests across all storages.
100108
function storage_stat.total(stats)
101109
local total = 0
102110

103111
for _, stat in pairs(stats) do
104-
total = total + (stat.select_requests or 0)
112+
total = total + (stat.requests or 0)
105113
end
106114

107115
return total

test/integration/ddl_sharding_key_test.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pgroup.before_all(function(g)
3838
helpers.call_on_storages(g.cluster, function(server)
3939
server.net_box:eval([[
4040
local storage_stat = require('test.helpers.storage_stat')
41-
storage_stat.init_on_storage()
41+
storage_stat.init_on_storage_for_select()
4242
]])
4343
end)
4444
end)

test/integration/pairs_test.lua

+5-5
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pgroup.before_all(function(g)
3030
helpers.call_on_storages(g.cluster, function(server)
3131
server.net_box:eval([[
3232
local storage_stat = require('test.helpers.storage_stat')
33-
storage_stat.init_on_storage()
33+
storage_stat.init_on_storage_for_select()
3434
]])
3535
end)
3636
end)
@@ -861,10 +861,10 @@ pgroup.test_pairs_no_map_reduce = function(g)
861861
local stat_b = storage_stat.collect(g.cluster)
862862
t.assert_equals(storage_stat.diff(stat_b, stat_a), {
863863
['s-1'] = {
864-
select_requests = 1,
864+
requests = 1,
865865
},
866866
['s-2'] = {
867-
select_requests = 0,
867+
requests = 0,
868868
},
869869
})
870870

@@ -886,10 +886,10 @@ pgroup.test_pairs_no_map_reduce = function(g)
886886
local stat_c = storage_stat.collect(g.cluster)
887887
t.assert_equals(storage_stat.diff(stat_c, stat_b), {
888888
['s-1'] = {
889-
select_requests = 0,
889+
requests = 0,
890890
},
891891
['s-2'] = {
892-
select_requests = 1,
892+
requests = 1,
893893
},
894894
})
895895
end

test/integration/select_test.lua

+5-5
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pgroup.before_all(function(g)
3131
helpers.call_on_storages(g.cluster, function(server)
3232
server.net_box:eval([[
3333
local storage_stat = require('test.helpers.storage_stat')
34-
storage_stat.init_on_storage()
34+
storage_stat.init_on_storage_for_select()
3535
]])
3636
end)
3737
end)
@@ -1640,10 +1640,10 @@ pgroup.test_select_no_map_reduce = function(g)
16401640
local stat_b = storage_stat.collect(g.cluster)
16411641
t.assert_equals(storage_stat.diff(stat_b, stat_a), {
16421642
['s-1'] = {
1643-
select_requests = 1,
1643+
requests = 1,
16441644
},
16451645
['s-2'] = {
1646-
select_requests = 0,
1646+
requests = 0,
16471647
},
16481648
})
16491649

@@ -1662,10 +1662,10 @@ pgroup.test_select_no_map_reduce = function(g)
16621662
local stat_c = storage_stat.collect(g.cluster)
16631663
t.assert_equals(storage_stat.diff(stat_c, stat_b), {
16641664
['s-1'] = {
1665-
select_requests = 0,
1665+
requests = 0,
16661666
},
16671667
['s-2'] = {
1668-
select_requests = 1,
1668+
requests = 1,
16691669
},
16701670
})
16711671
end

test/unit/select_dropped_indexes_test.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
local select_plan = require('crud.select.plan')
1+
local select_plan = require('crud.compare.plan')
22

33
local compare_conditions = require('crud.compare.conditions')
44
local cond_funcs = compare_conditions.funcs

test/unit/select_executor_test.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
local crud = require('crud')
22

3-
local select_plan = require('crud.select.plan')
3+
local select_plan = require('crud.compare.plan')
44
local select_executor = require('crud.select.executor')
5-
local select_filters = require('crud.select.filters')
5+
local select_filters = require('crud.compare.filters')
66

77
local compare_conditions = require('crud.compare.conditions')
88
local cond_funcs = compare_conditions.funcs

test/unit/select_filters_test.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
local compare_conditions = require('crud.compare.conditions')
44
local cond_funcs = compare_conditions.funcs
5-
local select_filters = require('crud.select.filters')
6-
local select_plan = require('crud.select.plan')
5+
local select_filters = require('crud.compare.filters')
6+
local select_plan = require('crud.compare.plan')
77
local collations = require('crud.common.collations')
88

99
local t = require('luatest')

test/unit/select_filters_uuid_test.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ local uuid = require('uuid')
55
local crud_utils = require('crud.common.utils')
66
local compare_conditions = require('crud.compare.conditions')
77
local cond_funcs = compare_conditions.funcs
8-
local select_filters = require('crud.select.filters')
8+
local select_filters = require('crud.compare.filters')
99
local collations = require('crud.common.collations')
10-
local select_plan = require('crud.select.plan')
10+
local select_plan = require('crud.compare.plan')
1111

1212
local t = require('luatest')
1313
local g = t.group('select_filters_uuid')

test/unit/select_plan_bad_indexes_test.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
local select_plan = require('crud.select.plan')
1+
local select_plan = require('crud.compare.plan')
22

33
local compare_conditions = require('crud.compare.conditions')
44
local cond_funcs = compare_conditions.funcs

test/unit/select_plan_test.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
local select_plan = require('crud.select.plan')
1+
local select_plan = require('crud.compare.plan')
22
local compare_conditions = require('crud.compare.conditions')
33
local utils = require('crud.common.utils')
44
local cond_funcs = compare_conditions.funcs

0 commit comments

Comments
 (0)