Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Расширения index_object

Пользователи могут сами определять любые желаемые функции и связывать их с индексами: фактически они могут создавать собственные методы для работы с индексом. Это можно сделать так:

  1. Создайте Lua-функцию.

  2. Добавьте имя функции в предопределенную глобальную переменную типа table.

  3. Вызовите функцию для index_object: index_object:function-name([parameters]). Есть три заданные глобальные переменные:

  • Добавление в box_schema.index_mt делает функцию доступной для всех индексов.
  • Добавление в box_schema.memtx_index_mt делает функцию доступной для всех индексов memtx.
  • Добавление в box_schema.vinyl_index_mt делает функцию доступной для всех индексов vinyl. Можно также сделать задаваемый пользователем метод доступным только для одного индекса путем вызова getmetatable(объект_индекса) и последующего добавления имени функции в метатаблицу.

Пример 1:

В примере ниже показано, как расширить все индексы memtx пользовательской функцией:

box.schema.space.create('tester1', { engine = 'memtx' })box.space.tester1:create_index('index1')global_counter = 5-- Create a custom function.function increase_global_counter()    global_counter = global_counter + 1end-- Extend all memtx indexes with the created function.box.schema.memtx_index_mt.increase_global_counter = increase_global_counter-- Call the 'increase_global_counter' function on 'index1'-- to change the 'global_counter' value from 5 to 6.box.space.tester1.index.index1:increase_global_counter()

Пример 2:

В примере ниже показано, как расширить указанный индекс пользовательской функцией с параметрами:

box.schema.space.create('tester2', { engine = 'memtx', id = 1000 })box.space.tester2:create_index('index2')local_counter = 0-- Create a custom function.function increase_local_counter(i_arg, param)    local_counter = local_counter + param + i_arg.space_idend-- Extend only the 'index2' index with the created function.box.schema.memtx_index_mt.increase_local_counter = increase_local_countermeta = getmetatable(box.space.tester2.index.index2)meta.increase_local_counter = increase_local_counter-- Call the 'increase_local_counter' function on 'index2'-- to change the 'local_counter' value from 0 to 1005.box.space.tester2.index.index2:increase_local_counter(5)