[tarantool-patches] [PATCH v3 4/4] box: introduce functional indexes in memtx

Konstantin Osipov kostja at tarantool.org
Thu Jul 18 12:50:29 MSK 2019


* Kirill Shcherbatov <kshcherbatov at tarantool.org> [19/07/17 09:39]:
> Closes #1260
> 
> @TarantoolBot document
> Title: introduce functional indexes in memtx
> Now you can define a functional index using registered persistent
> function as key extractor.
> 
> There is some restrictions for function and key definition for
> functional index:
>  - referenced extractor function must be persistent, deterministic
>    and return scalar type or array.
>  - key parts describe the referenced routine's returned key
>    (when the routine returned value type is array in meaning of
>    multikey index key): all parts must be sequential and the
>    first part's fieldno must be 1.
>  - key parts can't use JSON paths.
>  - you are not allowed to access tuple fields by names in functional
>    index extractor
> 
> Functional index can't be primary.
> You are not allowed to change functional index extractor function
> while there are some functional indexes depends of it.
> 
> Example:
> s = box.schema.space.create('withdata')
> s:format({{name = 'name', type = 'string'},
>           {name = 'address', type = 'string'}})
> pk = s:create_index('name', {parts = {1, 'string'}})
> lua_code = [[function(tuple)
>                 local address = string.split(tuple[2])
>                 local ret = {}
>                 for _, v in pairs(address) do
> 			table.insert(ret, {utf8.upper(v)})
> 		end
>                 return unpack(ret)
>              end]]
> box.schema.func.create('addr_extractor', {body = lua_code,
>                        is_deterministic = true, is_sandboxed = true})
> idx = s:create_index('addr', {unique = false, functional_fid =
>                      box.func.addr_extractor.id, is_multikey = true,
>                      parts = {{1, 'string'}}})
> s:insert({"James", "SIS Building Lambeth London UK"})
> s:insert({"Sherlock", "221B Baker St Marylebone London NW1 6XE UK"})
> idx:select('UK')
> ---
> - - ['James', 'SIS Building Lambeth London UK']
>   - ['Sherlock', '221B Baker St Marylebone London NW1 6XE UK']

this is a huge patch with only 3 tiny prerequisites.

Are you sure it's not possible to split it into pieces?


-- 
Konstantin Osipov, Moscow, Russia



More information about the Tarantool-patches mailing list