Модуль key_def
В модуле key_def
есть функция, позволяющая создавать определение номеров и типов полей кортежа. Это определение обычно используется вместе с определением индекса, чтобы извлекать или сравнивать значения ключей индекса.
-
key_def.
new
(parts)¶ Создание нового экземпляра key_def.
Параметры: - parts (
table
) – типы и номера полей. В таблицеparts
должен быть хотя бы один элемент. Для каждого элемента обязательны только атрибутыtype
иfieldno
/field
.
возвращает: The parts table has components which are the same as the
parts
option in Options for space_object:create_index().fieldno
(целое число), напримерfieldno = 1
. Вместоfieldno
можно использоватьfield
.type
(строка), напримерtype = 'string'
.Остальные компоненты необязательны.
Пример №1:
key_def.new({{type = 'unsigned', fieldno = 1}})
Пример №2:
key_def.new({{type = 'string', collation = 'unicode', field = 2}})
- parts (
-
object
key_def_object
¶ Объект key_def возвращается функцией key_def.new(). У него есть следующие методы: extract_key(), compare(), compare_with_key(), merge(), totable().
-
key_def_object:
extract_key
(tuple)¶ Получение кортежа, содержащего только поля объекта
key_def
.Параметры: - tuple (
table
) – кортеж или Lua-таблица с содержимым поля
возвращает: поля, определенные для объекта
key_def
,Пример №1:
-- Предположим, что у некоторого элемента пять полей: -- 1, 99.5, 'X', nil, 99.5 -- Нас интересуют только два из них: -- третье (строка) и первое (целое число). -- Мы можем определить эти поля инструкцией k = key_def.new -- и извлечь значения командой k:extract_key. tarantool> key_def = require('key_def') --- ... tarantool> k = key_def.new({{type = 'string', fieldno = 3}, > {type = 'unsigned', fieldno = 1}}) --- ... tarantool> k:extract_key({1, 99.5, 'X', nil, 99.5}) --- - ['X', 1] ...
Пример №2
-- Теперь предположим, что элемент является кортежем в спейсе. -- У спейса есть составной индекс, построенный по полям 3 и 1. -- Мы можем передать определение индекса в качестве аргумента функции key_def.new, -- а не заполнять определение, как в примере №1. -- Результат будет тот же. key_def = require('key_def') box.schema.space.create('T') i = box.space.T:create_index('I', {parts={3, 'string', 1, 'unsigned'}}) box.space.T:insert{1, 99.5, 'X', nil, 99.5} k = key_def.new(i.parts) k:extract_key(box.space.T:get({'X', 1}))
Пример №3
-- Проходим по всем кортежам во вторичном неуникальном индексе -- и извлекаем из них значения по первичному ключу. -- Затем удаляем значения, используя уникальный индекс. -- Этот код должен входить в Lua-функцию. local key_def_lib = require('key_def') local s = box.schema.space.create('test') local pk = s:create_index('pk') local sk = s:create_index('test', {unique = false, parts = { {2, 'number', path = 'a'}, {2, 'number', path = 'b'}}}) s:insert{1, {a = 1, b = 1}} s:insert{2, {a = 1, b = 2}} local key_def = key_def_lib.new(pk.parts) for _, tuple in sk:pairs({1})) do local key = key_def:extract_key(tuple) pk:delete(key) end
- tuple (
-
key_def_object:
compare
(tuple_1, tuple_2)¶ Сравнение полей кортежей
tuple_1
иtuple_2
по определённому ключу. Пользователю не нужно писать код для сравнения отдельных полей. Учитываются типы полей и параметры сортировки. Фактически сравниваются значенияextract_key(tuple_1)
иextract_key(tuple_2)
.Параметры: возвращает: положительное число, если значения полей tuple_1 больше значений полей tuple_2 по ключу; 0, если они равны; отрицательное число, если значения полей tuple_1 меньше значений полей tuple_2 по ключу
Пример:
-- Результат этого кода будет 0 key_def = require('key_def') k = key_def.new({{type = 'string', fieldno = 3, collation = 'unicode_ci'}, {type = 'unsigned', fieldno = 1}}) k:compare({1, 99.5, 'X', nil, 99.5}, {1, 99.5, 'x', nil, 99.5})
-
key_def_object:
compare_with_key
(tuple_1, tuple_2)¶ Сравнение полей кортежей
tuple_1
с полями кортежаtuple_2
по заданному ключу. Аналогично key_def_object:compare(), за исключением того, чтоtuple_2
содержит только поля ключа. Фактически это сравнениеextract_key(tuple_1)
сtuple_2
.Параметры: возвращает: положительное число, если значения полей tuple_1 больше значений полей tuple_2 по ключу; 0, если они равны; отрицательное число, если значения полей tuple_1 меньше значений полей tuple_2 по ключу
Пример:
-- Результат этого кода будет 0 key_def = require('key_def') k = key_def.new({{type = 'string', fieldno = 3, collation = 'unicode_ci'}, {type = 'unsigned', fieldno = 1}}) k:compare_with_key({1, 99.5, 'X', nil, 99.5}, {'x', 1})
-
key_def_object:
merge
(other_key_def_object)¶ Объединение основного объекта
key_def_object
с другим объектомother_key_def_object
. Возвращает новый объектkey_def_object
, содержащий сначала все поля основного объектаkey_def_object
, а потом те поля объектаother_key_def_object
, которых не было в основном объектеkey_def_object
.Параметры: - other_key_def_object (
key_def_object
) – определение полей, которые нужно добавить
возвращает: key_def_object
Пример:
-- Результатом этого кода будет определение ключа -- по полям с fieldno = 3 и fieldno = 1 key_def = require('key_def') k = key_def.new({{type = 'string', fieldno = 3}}) k2= key_def.new({{type = 'unsigned', fieldno = 1}, {type = 'string', fieldno = 3}}) k:merge(k2)
- other_key_def_object (
-
key_def_object:
totable
()¶ Возвращает таблицу с содержимым
key_def_object
. Функция противоположна функцииkey_def.new()
:key_def.new()
принимает таблицу, а возвращает объектkey_def
.key_def_object:totable()
принимает объектkey_def
, а возвращает таблицу.
Это удобно при подготовке входных данных для методов сериализации (
_serialize
).возвращает: таблица Пример:
-- Результатом этого кода будет таблица с type = 'string', fieldno = 3 key_def = require('key_def') k = key_def.new({{type = 'string', fieldno = 3}}) k:totable()
-