From: "Sergey Ostanevich" <sergos@tarantool.org>
To: "Vladislav Shpilevoy" <v.shpilevoy@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH v2 3/3] tuple: rework updates to improve code extendibility
Date: Fri, 08 Nov 2019 18:16:56 +0300 [thread overview]
Message-ID: <1573226216.426563351@f404.i.mail.ru> (raw)
In-Reply-To: <cd229d3b-5634-0662-bc5b-1a3d644e9b56@tarantool.org>
[-- Attachment #1: Type: text/plain, Size: 5123 bytes --]
Thanks for the patch!
The changes looks good to me. Frankly, I didn't perform a byte-exact
comparison of factorization between files - testing is green for the branch.
Regards,
Sergos
>Thursday, November 7, 2019 1:53 PM +03:00 from Vladislav Shpilevoy <v.shpilevoy@tarantool.org>:
>
>I gave up trying to split these changes, because they
>are either too minor, or are not separable at all. Kostja
>proposed to describe them in a changelist, and here is a
>new commit message:
>
>====================================================================
>
>tuple: rework updates to improve code extendibility
>
>Before the patch update was implemented as a set of operations
>applicable for arrays only. It was ok until field names and JSON
>paths appearance, because tuple is an array on the top level.
>
>But now there are four reasons to allow more complex updates of
>tuple field internals by JSON paths:
>
> - tuple field access by JSON path is allowed so for consistency
> JSON paths should be allowed in updates as well;
>
> - JSON indexes are supported. JSON update should be able to
> change an indexed field without rewriting half of a tuple, and
> its full replacement;
>
> - Tarantool is going to support documents in storage so JSON
> path updates is one more step forward;
>
> - JSON updates are going to be faster and more compact in WAL
> than get + in-memory Lua/connector update + replace (or update
> of a whole tuple field).
>
>The patch reworks the current update code in such a way, that now
>update is not just an array of operations, applied to tuple's top
>level fields. Now it is a tree, just like tuples are.
>
>The concept is to build a tree of xrow_update_field objects. Each
>updates a part of a tuple. Leafs in the tree contain update
>operations, specified by a user, as xrow_update_op objects.
>
>To make the code support and understanding simpler, the patch
>splits update implementation into several independent
>files-modules for each type of an updated field. One file
>describes how to update an array field, another file - how to
>update a map field, etc. This commit introduces only array. Just
>because it was already supported before the patch. Next commits
>will introduce more types one by one.
>
>Besides, the patch makes some minor changes, not separable from
>this commit:
>
> - The big comment about xrow updates in xrow_update.c is
> updated. Now it describes the tree-idea presented above;
>
> - Comments were properly aligned by 66 symbols in all the moved
> or changed code. Not affected code is kept as is so as not to
> increase the diff even more;
>
> - Added missing comments to moved or changed structures and
> their attributes such as struct xrow_update,
> struct xrow_update_op_meta, struct xrow_update_op.
>
> - Struct xrow_update_field was significantly reworked. Now it is
> not just a couple of pointers at tuple's top level array. From
> now it stores type of the updated field, range of its source
> data in the original tuple, and a subtree of other update
> fields applied to the original data.
>
> - Added missing comments to some functions which I moved and
> decided worth commenting alongside, such as
> xrow_update_op_adjust_field_no(), xrow_update_alloc().
>
> - Functions xrow_update_op_do_f, xrow_update_op_read_arg_f,
> xrow_update_op_store_f are separated from struct xrow_update,
> so as they could be called on any updated field in the tree.
> From this moment they are methods of struct xrow_update_op.
> They take an op as a first argument (like 'this' in C++), and
> are applied to a given struct xrow_update_field.
>
>Another notable, but not separable, change is a new naming schema
>for the methods of struct xrow_update_field and struct
>xrow_update_op. This is motivated by the fact that struct
>xrow_update_field now has a type, and might be not a terminal.
>
>There are now two groups of functions. Generic functions working
>with struct xrow_update_field of any type:
>
> xrow_update_field_sizeof
> xrow_update_field_store
> xrow_update_op_do_field_<operation>
>
>And typed functions:
>
> xrow_update_<type>_sizeof
> xrow_update_<type>_store
> xrow_update_op_do_<type>_<operation>
>
>Where
> operation = insert/delete/set/arith ...
> type = array/map/bar/scalar ...
>
>Common functions are used when type of a field to update is not
>known in advance. For example, when an operation is applied to one
>of fields of an array, it is not known what a type this field has:
>another array, scalar, not changed field, map, etc. Common
>functions do nothing more than just a switch by field type to
>choose a more specific function.
>
>Typed functions work with a specific type. They may change the
>given field (add a new array element, replace it with a new value,
>...), or may forward an operation deeper in case they see that its
>JSON path is not fully passed yet.
>
>Part of #1261
[-- Attachment #2: Type: text/html, Size: 6458 bytes --]
next prev parent reply other threads:[~2019-11-08 15:16 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-06 15:13 [Tarantool-patches] [PATCH v2 0/3] JSON preparation part 5 Vladislav Shpilevoy
2019-11-06 15:13 ` [Tarantool-patches] [PATCH v2 1/3] tuple: rename tuple_update.c/h to xrow_update.c/h Vladislav Shpilevoy
2019-11-06 19:13 ` Sergey Ostanevich
2019-11-06 15:13 ` [Tarantool-patches] [PATCH v2 2/3] tuple: rename tuple_update_* to xrow_update_* Vladislav Shpilevoy
2019-11-06 19:16 ` Sergey Ostanevich
2019-11-06 15:13 ` [Tarantool-patches] [PATCH v2 3/3] tuple: rework updates to improve code extendibility Vladislav Shpilevoy
2019-11-07 10:58 ` Vladislav Shpilevoy
2019-11-08 15:16 ` Sergey Ostanevich [this message]
2019-11-06 15:35 ` [Tarantool-patches] [PATCH v2 0/3] JSON preparation part 5 Konstantin Osipov
2019-11-09 6:46 ` Kirill Yukhin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1573226216.426563351@f404.i.mail.ru \
--to=sergos@tarantool.org \
--cc=tarantool-patches@dev.tarantool.org \
--cc=v.shpilevoy@tarantool.org \
--subject='Re: [Tarantool-patches] [PATCH v2 3/3] tuple: rework updates to improve code extendibility' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox