Tarantool: лимит/смещение в index.indexName:парный вызов

Мне нужно получить несколько записей из пространства users. Это пространство имеет вторичный индекс category_status_rating. Мне нужно выбрать пользователей с category=1, status=1, rating<=123456789:

for _, user in box.space.users.index.category_status_rating:pairs({ 1, 1, 123456789 }, { limit = 20, offset = 5, iterator = box.index.LE }) do
    if user[categoryIdx] ~= 1 or user[statusIdx] ~= 1 then break end
    table.insert(users, user)
end

Насколько я знаю, итерация с indexName:pairs не поддерживает limit, и я могу просто использовать свой собственный счетчик. А как же offset? Могу ли я использовать этот параметр и начать с нужной мне «страницы»? Или я буду повторять без каких-либо offset и пропускать бесполезные записи (около 100000) и начинать table.insert(users, user) при запуске моей "страницы"? Спасибо!


person Levintsev Aleksandr    schedule 30.03.2016    source источник
comment
почему бы вам просто не попробовать, если это делает то, что вы хотите?   -  person Piglet    schedule 30.03.2016


Ответы (1)


Вместо использования смещения вы можете сохранить свою позицию (это будет последний проверенный кортеж), если вам это действительно нужно. например:

local last = 123456789
for i = 1, 2 do
    local count = 0
    for _, user in box.space.users.index.category_status_rating:pairs({1, 1, last}, { iterator = box.index.LE }) do
        if user[categoryIdx] ~= 1 or user[statusIdx] ~= 1 or count > 20 then
            break
        end
        table.insert(users, user)
        last = user[LAST_INDEX_FIELD]
        count = count + 1
    end
    -- process your tuples
end

или, используя luafun (где drop_n — аналог limit, а сохранение в last — аналог offset):

local last = 123456789
for i = 1, 2 do
    local users = box.space.users.index.category_status_rating:pairs({1, 1, last}, { iterator = box.index.LE }):take_n(20):map(function(user)
        last = user[LAST_INDEX_FIELD]
        return user
    end):totable()
    -- process your tuples
end

Документация по LuaFun, а именно встроен в Tarantool.

person bigbes    schedule 30.03.2016
comment
Хм... А что если rating не уникальное значение? Означает ли это, что записи из first 20 records могут быть в second 20 records, если я буду использовать last в качестве позиции? - person Levintsev Aleksandr; 30.03.2016
comment
Затем вам нужно будет подсчитать количество кортежей с рейтингом last, которые вы обработали, и (например) использовать drop_n - person bigbes; 31.03.2016