Skip to content

Commit 15e8692

Browse files
authored
Fix ignoring opts.limit on crud.pairs (#173)
1 parent 7413c6a commit 15e8692

File tree

4 files changed

+72
-11
lines changed

4 files changed

+72
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1010
### Fixed
1111

1212
* Compatibility with Tarantool versions that don't support key_def and merger modules.
13+
* Ignoring `opts.first` on `crud.pairs` call
1314

1415
## [0.7.0] - 2021-05-27
1516

crud/select/compat/select.lua

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ local function build_select_iterator(space_name, user_conditions, opts)
115115
end
116116

117117
return {
118+
tuples_limit = tuples_limit,
118119
merger = merger,
119120
space_format = filtered_space_format,
120121
}
@@ -166,18 +167,23 @@ function select_module.pairs(space_name, user_conditions, opts)
166167
error(string.format("Failed to generate iterator: %s", err))
167168
end
168169

169-
if opts.use_tomap ~= true then
170-
return iter.merger:pairs()
170+
local gen, param, state = iter.merger:pairs()
171+
if opts.use_tomap == true then
172+
gen, param, state = gen:map(function(tuple)
173+
local result
174+
result, err = utils.unflatten(tuple, iter.space_format)
175+
if err ~= nil then
176+
error(string.format("Failed to unflatten next object: %s", err))
177+
end
178+
return result
179+
end)
171180
end
172181

173-
return iter.merger:pairs():map(function(tuple)
174-
local result
175-
result, err = utils.unflatten(tuple, iter.space_format)
176-
if err ~= nil then
177-
error(string.format("Failed to unflatten next object: %s", err))
178-
end
179-
return result
180-
end)
182+
if iter.tuples_limit ~= nil then
183+
gen, param, state = gen:take_n(iter.tuples_limit)
184+
end
185+
186+
return gen, param, state
181187
end
182188

183189
local function select_module_call_xc(space_name, user_conditions, opts)

crud/select/compat/select_old.lua

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,11 @@ function select_module.pairs(space_name, user_conditions, opts)
211211
error(string.format("Failed to generate iterator: %s", err))
212212
end
213213

214+
local tuples_limit = opts.first
215+
if tuples_limit ~= nil then
216+
tuples_limit = math.abs(tuples_limit)
217+
end
218+
214219
local gen = function(_, iter)
215220
local tuple, err = iter:get()
216221
if tuple == nil then
@@ -232,7 +237,13 @@ function select_module.pairs(space_name, user_conditions, opts)
232237
return iter, result
233238
end
234239

235-
return fun.iter(gen, nil, iter)
240+
local gen, param, state = fun.iter(gen, nil, iter)
241+
242+
if tuples_limit ~= nil then
243+
gen, param, state = gen:take_n(tuples_limit)
244+
end
245+
246+
return gen, param, state
236247
end
237248

238249
function select_module.call(space_name, user_conditions, opts)

test/integration/pairs_test.lua

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,49 @@ pgroup:add('test_le_condition_with_index', function(g)
254254
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {1})) -- in age order
255255
end)
256256

257+
pgroup:add('test_first', function(g)
258+
local customers = helpers.insert_objects(g, 'customers', {
259+
{
260+
id = 1, name = "Elizabeth", last_name = "Jackson",
261+
age = 12, city = "New York",
262+
}, {
263+
id = 2, name = "Mary", last_name = "Brown",
264+
age = 46, city = "Los Angeles",
265+
}, {
266+
id = 3, name = "David", last_name = "Smith",
267+
age = 33, city = "Los Angeles",
268+
},
269+
})
270+
271+
table.sort(customers, function(obj1, obj2) return obj1.id < obj2.id end)
272+
273+
-- w/ tomap
274+
local objects, err = g.cluster.main_server.net_box:eval([[
275+
local crud = require('crud')
276+
local objects = {}
277+
for _, object in crud.pairs('customers', nil, {first = 2, use_tomap = true}) do
278+
table.insert(objects, object)
279+
end
280+
return objects
281+
]])
282+
t.assert_equals(err, nil)
283+
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {1, 2}))
284+
285+
local tuples, err = g.cluster.main_server.net_box:eval([[
286+
local crud = require('crud')
287+
local tuples = {}
288+
for _, tuple in crud.pairs('customers', nil, {first = 2}) do
289+
table.insert(tuples, tuple)
290+
end
291+
return tuples
292+
]])
293+
t.assert_equals(err, nil)
294+
t.assert_equals(tuples, {
295+
{1, 477, 'Elizabeth', 'Jackson', 12, 'New York'},
296+
{2, 401, 'Mary', 'Brown', 46, 'Los Angeles'},
297+
})
298+
end)
299+
257300
pgroup:add('test_negative_first', function(g)
258301
local customers = helpers.insert_objects(g, 'customers',{
259302
{

0 commit comments

Comments
 (0)