From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 4 Feb 2019 15:26:05 +0300 From: Vladimir Davydov Subject: Re: [PATCH v9 3/6] box: introduce JSON Indexes Message-ID: <20190204122605.hqzoe7hszfssu6cd@esperanza> References: <899474d430fb62a79a0af1c83b5ad6262aec2923.1549187339.git.kshcherbatov@tarantool.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <899474d430fb62a79a0af1c83b5ad6262aec2923.1549187339.git.kshcherbatov@tarantool.org> To: Kirill Shcherbatov Cc: tarantool-patches@freelists.org List-ID: On Sun, Feb 03, 2019 at 01:20:23PM +0300, Kirill Shcherbatov wrote: > New JSON indexes allows to index documents content. > At first, introduced new key_part fields path and path_len > representing JSON path string specified by user. Modified > tuple_format_use_key_part routine constructs corresponding > tuple_fields chain in tuple_format::fields tree to indexed data. > The resulting tree is used for type checking and for alloctating > indexed fields offset slots. > > Then refined tuple_init_field_map routine logic parses tuple > msgpack in depth using stack allocated on region and initialize > field map with corresponding tuple_format::field if any. > Finally, to proceed memory allocation for vinyl's secondary key > restored by extracted keys loaded from disc without fields > tree traversal, introduced format::min_tuple_size field - the > size of tuple_format tuple as if all leaf fields are zero. > > Example: > To create a new JSON index specify path to document data as a > part of key_part: > parts = {{3, 'str', path = '.FIO.fname', is_nullable = false}} > idx = s:create_index('json_idx', {parts = parse}) > idx:select("Ivanov") > > Part of #1012 > --- > src/box/alter.cc | 2 +- > src/box/index_def.c | 10 +- > src/box/key_def.c | 157 ++++++++-- > src/box/key_def.h | 34 +- > src/box/lua/space.cc | 5 + > src/box/memtx_engine.c | 4 + > src/box/sql.c | 1 + > src/box/sql/build.c | 1 + > src/box/sql/select.c | 3 +- > src/box/sql/where.c | 1 + > src/box/tuple_compare.cc | 7 +- > src/box/tuple_extract_key.cc | 35 ++- > src/box/tuple_format.c | 374 ++++++++++++++++++---- > src/box/tuple_format.h | 60 +++- > src/box/tuple_hash.cc | 2 +- > src/box/vinyl.c | 4 + > src/box/vy_log.c | 61 +++- > src/box/vy_point_lookup.c | 4 +- > src/box/vy_stmt.c | 202 +++++++++--- > test/engine/json.result | 591 +++++++++++++++++++++++++++++++++++ > test/engine/json.test.lua | 167 ++++++++++ > 21 files changed, 1546 insertions(+), 179 deletions(-) > create mode 100644 test/engine/json.result > create mode 100644 test/engine/json.test.lua Pushed to 2.1.