Модуль table
Модуль table включает в себя всё из стандартной библиотеки для работы
с таблицами в Lua, а также некоторые расширения специально для Tarantool.
Введите table, чтобы увидеть список функций:
clear(расширение LuaJIT = удаление всех элементов)- concat (конкатенация)
copy(создание копии массива)deepcopy(см. описание ниже)foreachforeachi- getn (получение количества элементов в массиве)
- insert (вставка элемента в массив)
- maxn (получение наибольшего индекса)
- move (перемещение элементов между таблицами)
new(расширение LuaJIT = возврат новой таблицы с предварительно выделенными элементами)- remove (удаление элемента из массива)
- sort (сортировка элементов массива)
В данном разделе мы рассматриваем только дополнительную функцию,
добавленную разработчиками Tarantool: deepcopy.
Возврат детальной копии таблицы — копии, которая включает в себя вложенные структуры любой глубины и не зависит от указателей, копируется содержимое.
Параметры:
input-table(table) — таблица для копирования
Возвращает
копия таблицы
Тип возвращаемого значения
table
Пример:
tarantool> input_table = {1,{'a','b'}}---...tarantool> output_table = table.deepcopy(input_table)---...tarantool> output_table---- - 1- - a- b...
Размещение содержимого введенной таблицы в отсортированном порядке.
В базовой сортировке в Lua,
table.sort, есть функция сравнения, которая используется по умолчанию:
function (a, b) return a < b end.
Эта стандартная функция эффективна. Однако иногда пользователям
Tarantool может понадобиться эквивалент table.sort со следующими
функциями:
- Если таблица содержит нулевые значения, за исключением нулей в
конце, результаты все равно должны быть правильными. Это не работает
при использовании стандартного
tarantool_sort, и это нельзя исправить, выполнив сравнение, которое проверяет, равны ли значенияaиbнулю. (Прежде чем пробовать определенные предложения в Интернете, проверьте{1, nil, 2, -1, 44, 1e308, nil, 2, nil, nil, 0}.) - Если строки должны быть отсортированы с учетом языка, должен быть параметр для сравнения символов.
- Если в таблице есть разные типы, то они должны быть отсортированы так: логические, затем числа, затем строки, а затем байтовые массивы.
Поскольку все эти функции доступны в спейсах Tarantool, решение простое: создайте временный спейс в Tarantool, поместите в него содержимое таблицы, извлеките из него кортежи по порядку и перезапишите таблицу.
Тогда tarantool_sort() сделает то же самое, что и table.sort, но с
этими дополнительными функциями. Это не быстрый способ, который требует
прав на базу данных, поэтому его следует использовать только при
необходимости дополнительных функций.
Пример:
function tarantool_sort(input_table, collation)local c = collation or 'binary'local tmp_name = 'Temporary_for_tarantool_sort'pcall(function() box.space[tmp_name]:drop() end)box.schema.space.create(tmp_name, {temporary = true})box.space[tmp_name]:create_index('I')box.space[tmp_name]:create_index('I2',{unique = false,type='tree',parts={{2, 'scalar',collation = c,is_nullable = true}}})for i = 1, table.maxn(input_table) dobox.space[tmp_name]:insert{i, input_table[i]}endlocal t = box.space[tmp_name].index.I2:select()for i = 1, table.maxn(input_table) doinput_table[i] = t[i][2]endbox.space[tmp_name]:drop()end
Например, предположим, что
t = {1, 'A', -88.3, nil, true, 'b', 'B', nil, 'À'}.
После tarantool_sort(t, 'unicode_ci') таблица t содержит
{nil, nil, true, -88.3, 1, 'A', 'À', 'b', 'B'}.