удалить и обрезать список в udf aerospike

Я пытаюсь удалить и обрезать список, чтобы создать систему нумерации страниц.

local function createMap(postId, paramDate)
 local m =  map { id = postId, date = paramDate };
 return m;
end



function get(rec, binName, from, to)

    if aerospike:exists(rec) then
        local l = rec[binName]
        if (l == nil) then
            return nil

        else
            local length = #l;
            if (length <= 10 and to <=10) then
                return l;
            elseif (to >= length) then
                local drop = list.drop(l, from); 
                return drop;
            else
                list.trim(l, to);--Remove all elements at and beyond a specified position in the List.
                list.drop(l, from); --Select all elements except the first n elements of the List
                return l;               
            end

        end
    else
    return nil;--end return empty array
    end--end else aerospike exists


end

мой список имеет такую ​​структуру:

[{"date":"2016-01-02T19:45:00.806Z", "id":"568828bc49017f16659f6978"}, {"date":"2016-01-02T19:44:56.040Z", "id":"568828b849017f16659f6977"},...]

Кажется, я не могу обрезать, а затем удалить список. например, с 21 элементом: сначала он возвращается к элементу 21 к элементу 13, затем к элементу 21 к элементу 4, затем к элементу 3 к элементу 1

моя функция в node.js проста для изменения «от» и «до». Я отправляю «страницу» из внешнего интерфейса в node.js и использую эту функцию:

      var skip = 9 * (page -1);
      var lastIndexToReturn = skip + 9 + 1;

поэтому в первом запросе от и до «0» и «10», затем «9» и «19» и т. д. с использованием list.trim и list.drop Я подумал, что могу построить систему разбиения на страницы


person moubert    schedule 03.01.2016    source источник
comment
Достаточно ли малы ваши элементы списка, чтобы ограниченный размер обычного списка соответствовал вашему варианту использования? Для неограниченных списков в Aerospike есть большие упорядоченные списки. Есть способы построить разбиение на страницы без UDF (более производительно), вам будет интересен такой ответ? Я так понимаю, вы используете клиент node.js? Ваше здоровье   -  person Manuel Arwed Schmidt    schedule 05.01.2016
comment
Это список, содержащий около 600 элементов... Я использую только один бин и эту структуру, так что она меньше 128 КБ... Действительно, я использую node.js... Если у вас есть лучший подход, я буду рад знаю это... но я бы также знал, почему этот код не работает? Кстати, я тоже пробовал с largelist: «сортировать массив массивов ассоциативов в lua»> stackoverflow.com/questions/34564418/   -  person moubert    schedule 05.01.2016
comment
Я также создал разбивку на страницы с узлом, где я сравниваю даты и срезаю для сортировки массива ... Но я подумал, что было бы лучше выполнить всю работу на lua?   -  person moubert    schedule 05.01.2016
comment
Я не вижу очевидной проблемы в вашем коде, однако операции списка недавно изменились, и я не знаю, как ведут себя новые операции lua. С клиентом go я бы использовал одну операцию multi-op для отображения страницы и навигации по страницам: объедините ListGetRange(binname,9*(pageIndex-1),9) и ListSize() в операции атомарного чтения. Нет обрезки, очистки или копирования списка. Для записи это зависит от того, нужен ли вам порядок. Если вы хотите прочитать отсортированный список, создайте запись UDF, которая берет элемент для вставки, находит его правильное место и вставляет его туда (его атомарный). Для удаления или обновления вам может понадобиться...   -  person Manuel Arwed Schmidt    schedule 05.01.2016
comment
уникальный ключ, по которому сортируется список. Хотя UDF обеспечивают большую гибкость, если вы можете избежать их, вы можете добиться еще большей производительности. Это можно сделать с помощью команды multi ops. Например. в приведенном выше случае вы можете отобразить первую страницу и узнать, сколько страниц есть. Преимущество UDF можно увидеть при удалении из отсортированного списка: без этого вам пришлось бы читать полную копию клиенту, находить позицию, а затем писать обратно, надеясь/проверяя, что за это время никто не изменил список. С UDF это намного проще, экономя задержку (туда-обратно) и пропускную способность при ...   -  person Manuel Arwed Schmidt    schedule 05.01.2016
comment
стоимость минимального более высокого использования процессора на сервере. Я не уверен, что клиент NodeJS уже поддерживает операции со списком cdt (документация веб-сайта может отставать). Если нет, вам придется использовать отдельные операции для части чтения: github.com/aerospike/aerospike-client-nodejs/blob/master/docs/ - не атомарный, но все же очень хороший. Производительность с операциями списка cdt, особенно для пространств имен в памяти, является исключительной.   -  person Manuel Arwed Schmidt    schedule 05.01.2016
comment
ОБНОВЛЕНИЕ: Вы можете использовать их. См. пример для нескольких операций: в aerospike-client-nodejs/examples/operate.js и замените скучный материал append/incr новыми операциями списка, которые вы можете найти в aerospike-client-nodejs/lib/aerospike.js (строка 340~) . Извините за стену текста :) Обратите внимание, вы должны быть готовы к тому, какие ошибки возвращают эти операции, особенно ошибку параметра, если вы пытаетесь прочитать диапазон, полностью выходящий за пределы диапазона (например, пустой список). Надеюсь это поможет. Возможно, удастся поместить это в репо на выходных, но пока не могу этого обещать.   -  person Manuel Arwed Schmidt    schedule 05.01.2016


Ответы (1)


function get(rec, binName, from, to)

    if aerospike:exists(rec) then
        local l = rec[binName]
        if (l == nil) then
            return list()--return empty array

        else
            --first index in lua is 1
            local length = list.size(l)
            local pagination = list()
            if (length < from) then
                return list()
            elseif (length >= from and length <=to) then
                for i=from,length,1 do
                    list.append(pagination, l[i])
                end--end for
                return pagination 
            else
                for i=from,to,1 do
                    list.append(pagination, l[i])
                end--end for
                return pagination
            end     
        end
    else
      return list();--end return empty array
    end--end else aerospike exists


end
--end function

Я закончил тем, что закодировал эту функцию: чтобы убедиться, что не будет ошибок для индекса списка, я получаю размер списка и сравниваю этот размер с частью, которую я хочу разбить на страницы, чтобы определить, что вернуть: я не повторяю по всему массиву.

Конечно, это работает только в том случае, если запись представляет собой список. Примечание: убедитесь, что первый «от», исходящий от клиента, равен 1, потому что массивы lua начинаются с 1.

person moubert    schedule 07.01.2016