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})
тогда пользователь сможет строить какую-то свою логику более удобно.
примечания
- если данный индекс - главный (PRIMARY), то он должен генерировать исключение при попытке вернуть
nil
из функции - если данный индекс - главный, то он должен генерировать исключение при попытке вернуть несколько значений из функции