index_object:user_defined()
-
object
index_object
¶ -
index_object:
user_defined
()¶ Пользователи могут сами определять любые желаемые функции и связывать их с индексами: фактически они могут создавать собственные методы для работы с индексом. Это можно сделать так:
- создать Lua-функцию,
- добавить имя функции в заданную глобальную переменную с типом «таблица» (table),
- впоследствии в любое время, пока работает сервер, вызвать функцию с помощью
объект_индекса:имя-функции([параметры])
.
Есть три заданные глобальные переменные:
- Метод, добавленный в
box_schema.index_mt
, будет доступен для всех индексов. - Метод, добавленный в
box_schema.memtx_index_mt
, будет доступен для всех индексов в memtx’е. - Метод, добавленный в
box_schema.vinyl_index_mt
, будет доступен для всех индексов в vinyl’е.
Можно также сделать задаваемый пользователем метод доступным только для одного индекса путем вызова
getmetatable(объект_индекса)
и последующего добавления имени функции в метатаблицу.Параметры: - index_object (
index_object
) – ссылка на объект. - any-name (
any-type
) – то, что определяет пользователь
Пример:
-- Доступный для любого индекса спейса memtx, без параметров. -- После таких запросов значение глобальной переменной global_variable будет 6. box.schema.space.create('t', {engine='memtx'}) box.space.t:create_index('i') global_variable = 5 function f() global_variable = global_variable + 1 end box.schema.memtx_index_mt.counter = f box.space.t.index.i:counter()
Пример:
-- Доступный только для индекса box.space.t.index.i, 1 параметр. -- После таких запросов значение X будет 1005. box.schema.space.create('t', {engine='memtx', id = 1000}) box.space.t:create_index('i') X = 0 i = box.space.t.index.i function f(i_arg, param) X = X + param + i_arg.space_id end box.schema.memtx_index_mt.counter = f meta = getmetatable(i) meta.counter = f i:counter(5)
-