Functional indexes - AnaNek/tarantool GitHub Wiki

могут быть двух типов:

  • текстовые (STR)
  • числовые (NUMBER)

При создании функционального индекса пользователь обязан определить функцию (lua) (идеально, функция должна быть помещена в реплицируемое хранилище).

Функция принимает на вход тапл, на выходе возвращает значение, которое нужно поместить в индекс:

function index(tuple)
   return tuple[5] + tuple[6]
end

Возвращаемое значение функции:

  • nil (или ничего), это означает что данный тапл в данный индекс класть не нужно
  • значение (должно содержать в себе lua_Number либо lua_String) - собственно индексируемое значение
  • (TODO) несколько значений - означает что данный тапл должен быть помещен в индекс несколько раз (рассмотреть вариант с таблицей)
  • исключение. в этом случае вставка в индекс не производится, ошибка возвращается клиенту

опции конфигурации данного индекса:

  • (TODO): возвращаемое значение (значения) есть пути path в тапле. в этом случае можно не аллоцировать память для вычисленного значения
  • нужно ли хранить вычисленное значение в индексе. если опция установлена, то вычисленное значение в индексе не хранится (и в этом случае для каждого компаратора производится перевызов хранимой процедуры)

Доступ к функции

хорошо бы иметь возможность обратиться к функции индекса как к атрибуту индекса. например


local value = box.space.name.index.name.function(box.tuple.new{123})

тогда пользователь сможет строить какую-то свою логику более удобно.

примечания

  1. если данный индекс - главный (PRIMARY), то он должен генерировать исключение при попытке вернуть nil из функции
  2. если данный индекс - главный, то он должен генерировать исключение при попытке вернуть несколько значений из функции