From 61ace61816da089a5570f20e1e68799a6a1883bc Mon Sep 17 00:00:00 2001 From: Oleg Babin Date: Tue, 15 Jun 2021 20:49:52 +0300 Subject: [PATCH 1/2] test: introduce test for mutlipart index + paritial query Expected that {0, 1}, {0, 2} will be returned. But rowset is empty. --- test/integration/select_test.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/integration/select_test.lua b/test/integration/select_test.lua index 1d243216..2c5cc280 100644 --- a/test/integration/select_test.lua +++ b/test/integration/select_test.lua @@ -902,6 +902,12 @@ pgroup:add('test_multipart_primary_index', function(g) local objects = crud.unflatten_rows(result.rows, result.metadata) t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {1, 2, 3})) + local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions, + {after = result.rows[1]}}) + t.assert_equals(err, nil) + local objects = crud.unflatten_rows(result.rows, result.metadata) + t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {2, 3})) + local conditions = {{'=', 'primary', {0, 2}}} local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions}) t.assert_equals(err, nil) From 862906c2c12354266319bf9a2978fcba3e508fb8 Mon Sep 17 00:00:00 2001 From: Oleg Babin Date: Tue, 15 Jun 2021 20:58:08 +0300 Subject: [PATCH 2/2] fix? --- crud/common/utils.lua | 5 ++++- crud/select/executor.lua | 13 ------------- crud/select/plan.lua | 8 ++++++-- test/integration/select_test.lua | 30 +++++++++++++++++++++++++++--- 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/crud/common/utils.lua b/crud/common/utils.lua index b7ec5de0..9a9e05c8 100644 --- a/crud/common/utils.lua +++ b/crud/common/utils.lua @@ -140,9 +140,12 @@ function utils.unflatten(tuple, space_format) return object end -function utils.extract_key(tuple, key_parts) +function utils.extract_key(tuple, key_parts, max_len) local key = {} for i, part in ipairs(key_parts) do + if max_len ~= nil and i > max_len then + break + end key[i] = tuple[part.fieldno] end return key diff --git a/crud/select/executor.lua b/crud/select/executor.lua index a75d1b50..cd3b4efa 100644 --- a/crud/select/executor.lua +++ b/crud/select/executor.lua @@ -49,19 +49,6 @@ function executor.execute(space, index, filter_func, opts) local tuples_count = 0 local value = opts.scan_value - if opts.after_tuple ~= nil then - if value == nil then - value = opts.after_tuple - else - local cmp_operator = select_comparators.get_cmp_operator(opts.tarantool_iter) - local scan_comparator = select_comparators.gen_tuples_comparator(cmp_operator, index.parts) - local after_tuple_key = utils.extract_key(opts.after_tuple, index.parts) - if scan_comparator(after_tuple_key, opts.scan_value) then - value = after_tuple_key - end - end - end - local tuple local gen = index:pairs(value, {iterator = opts.tarantool_iter}) diff --git a/crud/select/plan.lua b/crud/select/plan.lua index f6dbf5c6..d0eb018f 100644 --- a/crud/select/plan.lua +++ b/crud/select/plan.lua @@ -180,11 +180,15 @@ function select_plan.new(space, conditions, opts) if opts.first < 0 then scan_iter = utils.invert_tarantool_iter(scan_iter) - -- scan condition becomes border consition + -- scan condition becomes border condition scan_condition_num = nil if scan_after_tuple ~= nil then - scan_value = utils.extract_key(scan_after_tuple, scan_index.parts) + local len + if scan_value ~= nil then + len = #scan_value + end + scan_value = utils.extract_key(scan_after_tuple, scan_index.parts, len) else scan_value = nil end diff --git a/test/integration/select_test.lua b/test/integration/select_test.lua index 2c5cc280..f3f44566 100644 --- a/test/integration/select_test.lua +++ b/test/integration/select_test.lua @@ -897,22 +897,46 @@ pgroup:add('test_multipart_primary_index', function(g) }) local conditions = {{'=', 'primary', 0}} - local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions}) + local result_0, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions}) t.assert_equals(err, nil) - local objects = crud.unflatten_rows(result.rows, result.metadata) + local objects = crud.unflatten_rows(result_0.rows, result_0.metadata) t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {1, 2, 3})) local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions, - {after = result.rows[1]}}) + {after = result_0.rows[1]}}) t.assert_equals(err, nil) local objects = crud.unflatten_rows(result.rows, result.metadata) t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {2, 3})) + local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions, + {after = result_0.rows[3], first = -2}}) + t.assert_equals(err, nil) + local objects = crud.unflatten_rows(result.rows, result.metadata) + t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {1, 2})) + local conditions = {{'=', 'primary', {0, 2}}} local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions}) t.assert_equals(err, nil) local objects = crud.unflatten_rows(result.rows, result.metadata) t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {3})) + + local conditions_ge = {{'>=', 'primary', 0}} + local result_ge_0, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions_ge}) + t.assert_equals(err, nil) + local objects = crud.unflatten_rows(result_ge_0.rows, result_ge_0.metadata) + t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {1, 2, 3, 4, 5})) + + local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions_ge, + {after = result_ge_0.rows[1]}}) + t.assert_equals(err, nil) + local objects = crud.unflatten_rows(result.rows, result.metadata) + t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {2, 3, 4, 5})) + + local result, err = g.cluster.main_server.net_box:call('crud.select', {'coord', conditions_ge, + {after = result_ge_0.rows[3], first = -3}}) + t.assert_equals(err, nil) + local objects = crud.unflatten_rows(result.rows, result.metadata) + t.assert_equals(objects, helpers.get_objects_by_idxs(coords, {1, 2})) end) pgroup:add('test_select_partial_result_bad_input', function(g)