Модуль table
Модуль table
включает в себя всё из стандартной библиотеки для работы с таблицами в Lua, а также некоторые расширения специально для Tarantool.
Write table
to see the list of functions:
clear
(LuaJIT extension = erase all elements)- concat (concatenate)
copy
(make a copy of an array)deepcopy
(see the description below)foreach
foreachi
- getn (get the number of elements in an array)
- insert (insert an element into an array)
- maxn (get the largest index)
- move (move elements between tables)
new
(LuaJIT extension = return a new table with pre-allocated elements)- remove (remove an element from an array)
- sort (sort the elements of an array)
В данном разделе мы рассматриваем только дополнительную функцию, добавленную разработчиками Tarantool: deepcopy
.
-
table.
deepcopy
(input-table)¶ Возврат детальной копии таблицы – копии, которая включает в себя вложенные структуры любой глубины и не зависит от указателей, копируется содержимое.
Параметры: - input-table – таблица для копирования
Возвращается: копия таблицы
Тип возвращаемого значения: таблица
Пример:
tarantool> input_table = {1,{'a','b'}} --- ... tarantool> output_table = table.deepcopy(input_table) --- ... tarantool> output_table --- - - 1 - - a - b ...
-
table.
sort
(input-table[, comparison-function])¶ Размещение содержимого введенной таблицы в отсортированном порядке.
В базовой сортировке в Lua, table.sort, есть функция сравнения, которая используется по умолчанию:
function (a, b) return a < b end
.Эта стандартная функция эффективна. Однако иногда пользователям Tarantool может понадобиться эквивалент
table.sort
со следующими функциями:- If the table contains nils, except nils at the end, the results must still be correct.
That is not the case with the default
tarantool_sort
, and it cannot be fixed by making a comparison that checks whethera
andb
arenil
. (Before trying certain Internet suggestions, test with{1, nil, 2, -1, 44, 1e308, nil, 2, nil, nil, 0}
. - If strings are to be sorted in a language-aware way, there must be a parameter for collation.
- If the table has a mix of types, then they must be sorted as booleans, then numbers, then strings, then byte arrays.
Поскольку все эти функции доступны в спейсах 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) do box.space[tmp_name]:insert{i, input_table[i]} end local t = box.space[tmp_name].index.I2:select() for i = 1, table.maxn(input_table) do input_table[i] = t[i][2] end box.space[tmp_name]:drop() end
For example, suppose
table t = {1, 'A', -88.3, nil, true, 'b', 'B', nil, 'À'}
.After
tarantool_sort(t, 'unicode_ci')
t
contains{nil, nil, true, -88.3, 1, 'A', 'À', 'b', 'B'}
.- If the table contains nils, except nils at the end, the results must still be correct.
That is not the case with the default